为什么要分段
一个数据报可以通过几个不同的网络进行传输。每一个路由将它接收到的帧拆封成IPv4数据报,对它进行处理,然后将它封装成另一个帧。接收到的帧格式和长度取决于此帧刚刚经过的物理网络所使用的协议,发出去的帧的格式和长度则取决于此帧将要经过的物理网络所使用的协议。每一个数据链路层协议都有其自己的帧格式。这格式中定义的一个字段是数据字段最大长度(MTU,最大传输单元)。当数据报封装成帧时,该数据报的总长度必须小于这个最大数据长度。这个是由网络所使用的硬件和软件给出的限制锁定义的。下图显示了不同协议的MTU.
上图中,以太网的MTU是1500个字节,但是IPv4规定最大数据段是65536,加上头部长度,长度大于65536个字节,所以IPv4要在以太网中传输,如果超过以太网的MTU,就需要进行分段进行传输。
分段原理
当对一个数据报进行分段时,每个分段都自己的头部,其中大部分的字段是重复的,但是有些发生了变化。如果一个分段的数据报遇到了一个更小的MTU网络,那么分段的数据还会再进行分段。
在IPv4中,数据报可能被主机或者其他路径上的任何路由进行分段,然而数据报的重组只能在目的主机上进行。
与IPv4数据报的分段和重组相关的字段是:标识,标志和片偏移。
标识:唯一标识了源主机发送时的数据报。比如主机第一次发送数据报,那么该数据报的标识就是1,如果该数据报被分段,那么每个子数据报的标识也都是1。主机接下来要发送第二个数据报,那么这个标识就+1,是2,以此类推。
标志:这是一个位的字段。
第一位保留以后使用。
第二位称为不分段位,如果值是1,则机器不能将该数据报进行分段。如果为0,则根据需要对数据报进行分段。
第三位称为多分段位,如果其值是1,则表示此数据报不是最后的分段,在该分段后后还有很多的分段,如果其值是0,则表示它是最后一个或唯一的分段。
片偏移:这个13位的字段表示这个分段在整个数据报中的相对位置,它是原始数据报中的数据偏移量,以8个字节为单位。下图说明了一个具有4000个字节的数据报被划分为3个字段。
片偏移量是以8字节为单位的,这样做是因为偏移字段的长度只有13位,最大只能表示8192个字节,如果以8字节为单位,可以表示65536个字节,即IPv4数据报的最大长度。