一、背景
在【iP基本概念】章节中,我们谈到了有关IP头部的一些信息,其中一个信息称为分片,那么IP数据包在传输过程中为什么要分片呢?这是因为标准定义了一个数据帧最多能够携带的数据载荷大小,如果不定义那么就会导致较大的数据包在网络设备中处理效率较低,且长时间处理某个数据包也会让其他数据包无法得到处理,也就无法得到网络服务。
二、什么是MTU
这个时候就不得不提到MTU这个概念了,MTU(Maximum Transmission Unit)称为最大传输单元,限制数据帧的最大长度。由于MTU在不同网络中长度会有变化,所以IP数据包分片的目的是适应各个不同网络的MTU长度。发送数据时,IP数据包的长度只有小于或等于该接口的MTU值,报文才不会被分片处理,否则就会进行分片。IP头部处理分片的字段如【图1】所示,具体含义见【4.IP基本概念(一)】章节
图1
所以当数据包比链路最大传输单元大时,就可以被分解为很多的足够小片段,以便能够在链路上进行传输。在以太网中缺省MTU值为1500。
三、分片具体分析
以ICMP报文为例,发送一个数据载荷为5000字节的数据包
图2
结合之前所讲的数据的封装与解封装,我们可以得知,ICMP报文属于网络层,此时报文的封装如下图所示:
图3
从【图3】很明显能看出,当前这个流量对于数据链路层来说,数据载荷长度远远超过了接口的MTU缺省值(以太网1500字节),所以此时IP需要进行分片,那么具体怎么分片的呢,如下图所示:
数据包的完整结构:
图4
第一个分片具体信息:
图5
第二个分片具体信息:
图6
第三个分片具体信息:
图7
最后一个分片具体信息:
图8
从上图所示,得出如下结论:
1.分片偏移值=上一个分片偏移值+本分片的数据载荷,用于标识该分片
在完整数据包中的位置;
2.由Flags的第二标志位和第三标志位后续有没有分片以及能不能被分片;
3.数据包分片时,并不会将数据包平均地分片,而是在单个数据包长度为
1500字节时才会将超出的数据载荷进行分片