5.2.5 IP数据报(三)IP数据报的分片与重组
前面我们在学习IP数据报的格式中,提及了数据报的分片,这里我们要弄明白几个问题
-
为什么要分片?
前面我们已经解释过,如图
因为在数据报传送的过程中如果总长度超出了某个网络的MTU的情况下就会使该IP数据报无法封装到一个完整的数据帧里,所以必须要进行分片 -
分片工作是由谁来完成的?
分片工作通常是由网络互连设备路由器(图中R1)来完成,也就是说路由器会根据实际的需要来完成数据报的分片工作,然后每个数据报片都被封装在单个数据帧中发送,并且作为独立的IP数据报进行传输。
-
数据报分片的重组工作由谁来负责?
与数据报分片相反的就是分片的重组,也就是把若干个分片重新组合成原始的IP数据报,考虑到各个分片在到达目的主机之前还有可能会被再次分片,所以说在沿途路由器上不进行分片的重组,这里我们要注意,对数据报分片的重组工作是由目的主机来完成的。
-
如何分片?(这是最重要的问题)
如图
我们在前面学习IP数据报的格式中曾经说过对IP数据报的分片处理会用到IP数据报首部的三个字段标识、标志、片偏移,下面我们就着重的学习一下这三个字段。
一、标识字段
标识(identification)占16bit,它是一个计数器,是源主机赋予数据的惟一标识符。在分片的时候,该字段会被复制到各个分片首部中的标识字段。
标识字段占了16比特2个字节,是源主机赋予数据报的惟一标识符,比如在源主机的内存中保持了一个全局计数器,每产生一个新的数据报计数器就会加一,因为标识占用16个比特所以计数器可以统计 2 16 2^{16} 216个标识,当达到65535的时候该字段置为全零,总之就是要保证同一主机发出的各个数据报的标识字段在较长时间内是唯一的,一个数据报分片其实是把数据部分进行拆分,因为每个分片都有首部,并且数据报片的首部主要从初始数据报首部中复制,仅做少量修改,也就是说对于标识字段必须不加修改的复制到各个分片的首部中以方便目的主机在重组时能够识别出属于同一初始数据报的所有分片。
二、标志字段
标志字段占3bit,第一个比特不用
第二个比特DF位(Don’t Fragment flag):是否允许被分片(0:允许)当该比特等于1的时候表示数据报不允许被分片,0的时候允许被分片。也就是说如果某数据报太长,路由器必须现对其进行分片才能转发的时候,结果发现该数据报的DF位置为1时路由器会丢弃该数据报,并想源主机发送一个差错报告报文。
第三个比特是MF位(More Fragment flag,简称MF),表示是否有后续分片,MF位=1表示该数据报不是最后一个分片,当该比特位等于零的时候是最后一个分片。
三、片偏移量
片偏移占用13个比特位,该字段指出本数据报片中的数据部分第一个字节相对于原数据报中数据部分的偏移量,请注意:该字段是以8个字节为单位来计算偏移量的。对于未分片的数据报或第一个分片来说该字段等于零。
由于各个分片在传输的过程中是独立的也就是说由于IP协议无法保证这些分片一定按需到达目的主机,所以目的主机能够根据分片中的源主机IP地址、标识、标志字段中的MF位以及偏移量来重装出最初始数据报的完整副本,除非没能收齐所有分片。也就意味着只要有一个分片丢失就无法重组,意味着整个数据报都丢失了,所以在实际的应用中,如果需要分片,总是希望分片的个数越少越好,又因为片偏移量是以8字节为单位,所以除了最后一个分片外,其余分片的数据部分的大小应尽量接近但不超过网络的MTU,并且是8字节的整数倍。
四、示例
我们通过一个例子来介绍有关数据报分片的计算。
如图
图中所示的小型互联网中,主机A向B发送了一个首部20字节,数据部分1400字节长,且DF位为0的IP数据报,请问该数据报会被分片么?如果需要分片,请写出分片结果。
从图中我们可以看到由于主机A发送出去的是总长度为1420字节的IP数据报,要经过一个MTU值是660字节的网络2才能够到达目的网络3,所以在路由器R1处必须要进行分片,此外,该数据报的标志字段中的DF位为0表示可以分片,这里我们要知道所谓的分片其实是将数据部分拆开,因为每个分片都有首部,并且每个分片的数据部分长度要满足的条件是小于等于网络2的MTU660个字节减去首部的长度也就是640个字节,并且数据部分的长度还应该是8字节的整数倍,在这个实例中网络2可传输的数据报长度为640个字节恰巧可以被8整除,所以每个分片的数据部分的长度我们选择六百四十字节即可。所以我们得到如下结果
分片个数= 1400 640 \frac{1400}{640} 6401400,然后向上取整,最终结果是3。其中前面两个分片的数据部分长度都是640个字节,最后一个分片的长度会比较短。如图
如图我们得到的分片结果
第一个分片的数据部分是640字节,其中标志字段的MF位等于1表示有后续分片,因为数据部分第一个字节就是原始数据报中编号为0的那个字节,所以他的片偏移字段的值就是 0 8 \frac{0}{8} 80就是该字段为全零。
第二个分片的数据部分仍然是640个字节,其中标志字段的MF位等于1表示有后续分片,因为其数据部分第一个字节的编号是640,所以他的片偏移字段的值就是 640 8 = 80 \frac{640}{8}=80 8640=80所以片偏移字段的值为0000001010000
第三个分片比较短,它的数据部分长度是 1400 − 2 × 640 = 120 1400-2\times640=120 1400−2×640=120个字节,因为其是最后一个分片,后没有分片因此其MF字段值为0,同时他的数据部分第一个字节编号是1280,所以他的片偏移字段的值是 1280 8 = 160 \frac{1280}{8}=160 81280=160,字段值是0000010100000
这里需要我们注意的是很多人在计算分片的个数时,习惯用原始数据报的总长度去除每个分片的总长度,这都是错误的,因为每个分片都有首部,这里我们一定要注意分片是吧数据部分拆开了。
这里我们再来思考如果把示例中的网络2的MTU改为600的情况下,每个分片的数据部分长度是580个字节么?欢迎大家留言讨论。文章来源:https://www.toymoban.com/news/detail-650425.html
以上就是数据报的分片与重组。我们知道在互联网络层中使用的是IP地址,而前面我们学习知道在实际使用的是网卡的MAC地址进行通信的,这两种地址之间的关系就与我们后面要学到的地址解析协议ARP有关。文章来源地址https://www.toymoban.com/news/detail-650425.html
到了这里,关于5.2.5 IP数据报(三)IP数据报的分片与重组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!