计算机网络-自顶向下的数据包结构
本机的IP地址:192.168.1.100
子网掩码:255.255.255.0
网关的IP地址:192.168.1.1
DNS的IP地址:8.8.8.8
然后打开浏览器访问谷歌的网址:www.google.com,按下回车。这意味着,浏览器要向Google发送一个网页请求的数据包。第一步:第二步:第三步:
1.应用层数据包
首先,根据笔者HTTP协议详解与Android相关基础网络编程这篇文章中的讲解,我们可以知道应用层HTTP协议的报文结构:
这里是请求简书的一个GET请求报文,请求谷歌的报文结构也是相同的,只是域名等内容不同罢了。我们假定这个部分的长度为4960字节,此时的数据包结构如下:
就是一个单纯的数据包,没有头部,数据部分就是上面的报文。
2.传输层数据包(TCP/UDP数据包)
TCP/UDP数据包需要设置端口,接收方(Google)的HTTP端口默认是80,发送方(本机)的端口是一个随机生成的1024-65535之间的整数,假定为51775。TCP数据包的标头长度为20字节,加上嵌入HTTP的数据包,总长度变为4980字节。
可以看到,TCP/UDP数据包就是在应用层数据包前面加上端口号的等必要的寻址信息作为头部。
3.网络层数据包(IP数据包)
下面就到了网络层,TCP数据包再嵌入IP数据包。IP数据包需要设置双方的IP地址,这是已知的,发送方是192.168.1.100(本机),接收方是172.194.72.105(Google)。IP数据包的标头长度为20字节,加上嵌入的TCP数据包,总长度变为5000字节。
4.数据链路层数据包(以太网数据包)
最后,IP数据包嵌入以太网数据包。以太网数据包需要设置双方的MAC地址,发送方为本机的网卡MAC地址,接收方为网关192.168.1.1的MAC地址(通过ARP协议得到)。
以太网数据包的数据部分,最大长度为1500字节,而现在的IP数据包长度为5000字节。因此,IP数据包必须分割成四个包。因为每个包都有自己的IP标头(20字节),所以四个包的IP数据包的长度分别为1500、1500、1500、560。
分割成四个数据包,分割只能分割数据部分,每个数据包都要具有相同的标头,不然找不到目的地址:
服务端响应:
经过多个网关的转发,Google的服务器172.194.72.105,收到了这四个以太网数据包。
我们再总结一下整个过程中数据包的结构包装变化(图片来源于网络):