大多数TCP/IP通信都建立在IP协议之上,可以使用Wireshark抓取IP数据包。在IP数据报中,最大长度可以达到65535字节,但是很少有底层的物理层网络能够封装如此大的数据包,因此将IP数据报分片传输,目的主机将分片重组还原为一个数据报。
IP数据报
版本:占4位,表示该IP数据报使用的IP协议版本。代表IPv4
首部长度:占4位,可表示最大数值是15个单位,1单位=4字节,所以IP首部最长位60字节。固定长度20字节。
总长度:数据报的长度,占16位=首部+数据,单位为字节,因此理论上数据报的最大长度为2^16-1=65535字节,总长度不能超过最大传送单元MTU。
上层协议标识:占用8位二进制位,IP协议可以承载各种上层协议,目标端根据协议标识就可以把收到的IP数据报送到TCP或UDP等处理此报文
标志:占3位。只有前2位有意义。最低位:MF MF=1:后边还有分片 MF=0:表示最后一个分片。
片偏移:13位。较长数组在分片后某片在原分组中的相对位置。
生存时间:TTL。数据报在网络汇总可通过路由器的最大值。
协议:表示数据报使用的哪个协议。的上层协议了。
首部检验和:首部检验IP和占16位,在IP数据报首部中进行容错检验。
源地址:源地址占32位,指明源主机的IP地址。在IP数据报从源主机发送到目的主机的时间内,这个字段必须保持不变。
目的地址:目的地址占32位,指明目的主机的IP地址,在IP数据报从源主机发送到目的的主机的时间内。
最大传输单元(MTU)
在维基百科中 MTU 是这样定义:
In computer networking, the maximum transmission unit (MTU) is the size of the largest protocol data unit (PDU) that can be communicated in a single network layer transaction.
大体的意思就是,在计算机网络中,最大传输单元 (MTU) 是可以在单个网络层事务中进行通信的最大协议数据单元 (PDU) 的大小。
对于不同的物理网络协议,MTU的值是不同的,物理层网络的MTU是由硬件决定的,通常网络的速度越高,MTU就越大。
IP数据报在从源节点到目的节点的传输过程中往往要经过多个不同的网络。由于各种物理网络存在差异,对帧的最大长度有不同的规定,各个物理网络的最大传输单元MTU可能不同。
如何确定网络MTU
下面我们在linux下,ping一下www.baidu.com
ping www.baidu.com -s 1400
如果能ping通,说明此MTU是可以的。如果设置了过大的MTU,就可能会导致很多服务无法使用的问题。
数据报分片
当IP层要传送的数据大于物理网络的最大传输单元时,必须将IP数据报分片传输。分片就是将一个数据报划分成若干更小的单元,以适应底层物理网络的MTU。
当数据报分片时,每个分片都会得到一个首部。分片首部的大部分内容和原数据相同,如IP地址、版本号、协议和标识等等。所不同的主要就是标志、总长度和分片偏移字段。分片可以带也可以不带原数据报的选项。
当然,不管是否分片,检验和的总值都需要重新计算。
标识(Identification)字段提供分片所属数据报的关键信息,是分片重组的依据。
为了保证唯一性,IP协议使用一个计数器标识数据报。当IP协议发送数据报时,就把这个计数器的当前值复制到标识字段中,并把这个计数器的值加1.
同一个数据报的所有的分片具有相同的标识,也就是原始数据报标识。
标志(Flags)字段占3位,用于表示该IP数据报是否允许分片以及是否是最后分片。
DF = 0 ,允许分片
DF = 1 ,不允许分片
MF = 0,最后一片
MF = 1,不是最后一片
分片偏移字段指出本片在原始数据报数据区中的相对位置。
Wireshark查看数据报分片
要通过Wireshark抓取IP数据报分片过程的数据包,必须构造一个较大的数据包。我们常用的是ping命令传送的ICMP回送与应答报文,会封装到IP数据报中进行传递,该命令可指定要发送的字节数,可以产生一个比较大的数据包。这里使用Linux下执行如下命令。
ping 192.168.192.1 -s 2048
以太网仅支持1500字节的MTU,要传送数据长度为2048字节的数据报,必须将其进行分片。
我们展开序号448的数据包的IP协议树
数据总长度为1500(以太网的MTU),标识0xc76c,标志字段指示可以分片且有更多分片(More Fagments),分片偏移值0说明是第1个分片,数据部分长度为1480字节(因为还有20字节的首部)
分片的重组
同一个数据报各个分片到达目的地,必须被重组为一个完整的数据报。IP协议主要依据数据报首部中的标识、标志和分片偏移字段进行分片重组。
分片可以在源主机或传输路径上的任何一台路由器上进行,而分片的重组只能在目的主机上进行,因为各分片作为独立数据报进行传输,在网络中可能沿不同的路径传输,在中间的某一个路由器上收齐同一数据报的各个分片不现实。另外不在中间进行重组可以简化路由器上的协议,有助于减轻路由器负担。
对数据报进行分片必须改变标志、分片偏移和总长度3个字段的值,其余各字段必须被复制,另校验和的值总是要重新计算。
ICMP报文首部和ICMP数据
总结
当IP层要传送的数据大于物理网络的最大传输单元时,必须将IP数据报分片传输。分片必须要满足两个条件:
1、各分片尽可能大,但必须能够为帧所封装
2、分片中数据的大小必须为8字节的整数倍,否则IP无法表达其偏移量。
欢迎关注微信公众号【程序猿编码】,欢迎添加本人微信号(c17865354792)交流学习,共同进步~
参考:RFC 1191