IP分片与重组详解


大家对IP数据包头,应该不陌生吧

分片便是与图中圈出来的两个地址有关,本文也是将主要围绕他们展开。

那我们先来了解他们的概念。

标志
一个三比特字段遵循与用于控制或识别片段。他们是(按顺序,从高分以低位):
0:保留; 必须为零。
1位:不分段(DF)
2位:更多片段(MF)
如果DF标志被设置,并且分片需要来路由分组,则该分组被丢弃。这可以发送分组到不具有足够的资源来处理破碎的宿主时,可以使用。它也可用于路径MTU发现由主机IP软件,可以自动或使用诊断工具例如手动平或跟踪路由。对于未分段的数据包,对MF标志被清除。对于分片包,除了最后的所有片段具有MF标志设置。最后片段具有一个非零片偏移量字段,从一个未分段的分组区分它。


分片偏移
片段偏移字段以8字节块为单位进行测量。它是13位长,并指定特定相对于原始未分段的IP数据报的开始的片段的偏移量。零第一片段已偏移。这允许最多(2偏移13(次方)  - 1)×8 =字节65,528,这将超过65,535字节的最大IP报文长度与包括报头长度(+ 65,528 20 = 65548字节)。

为什么要分片呢?

互联网协议使网络互相通信。设计要迎合不同物理性质的网络; 它是独立于链路层使用的基础传输技术。具有不同硬件的网络通常会发生变化,不仅在传输速度,而且在最大传输单元(MTU)。当一个网络要的数据报发送到具有较小MTU的一个网络,它可能片段的数据报。在IPv4中,这个功能被放置在因特网层,并且在IPv4路由器,这因此只需要这个层作为最高的一个在其设计中实现的处理。
与此相反,IPv6的,下一代互联网协议的,不允许的路由器来执行分片; 发送数据包之前,主机必须确定路径MTU。


分片
当路由器收到一个数据包时,它会检查目的地址,并确定出接口使用,并且该接口的MTU。如果分组的大小是比MTU大,并且在该分组的头中的不分段(DF)位被设置为0,则路由器可分段的数据包。
路由器将所述分组成片段。每个片段的最大尺寸是MTU减去IP包头的大小(20字节最低; 60个字节的最大值)。路由器会在每个片段到其自己的数据包,有以下改变每个分片报文:
该总长度字段是片段大小。
所述多个片段(MF)标志被设置为除了最后一个,这被设置为0的所有片段。
该片段的偏移字段被设置的基础上,在原来的数据有效载荷的片段的偏移量。这是在8字节块为单位进行测量。
该头校验域被重新计算。

例如,对于1500字节的MTU和20个字节的报头大小,该片段的偏移将是(1500年至1520年)/ 8 = 185。这些倍数倍数0,185,370,555,740,...


它有可能为一包在一个路由器进行分段,并在另一路由器进行分段的片段。例如,考虑4500个字节,没有选项大小和20字节的IP报头大小传输层段。因此IP分组大小为4,520字节。


重组
接收机知道一个分组是片段,如果满足下列条件中的至少一个为真:

“更多碎片”标志设置。(这是除最后所有片段真)。
在“片段偏移”字段是零。(这是为除第一所有片段真)

接收器标识匹配使用外国和当地的互联网地址,协议号,和识别领域的片段。接收器将重组从片段数据与同时使用的片段偏移和多个片段标志相同的ID。当接收机接收的最后一个片段(其具有的“更多片段”标志设置为0),它可以通过乘以最后一个片段的八个偏移,并加入最后一个片段的数据的大小来计算的原始数据有效载荷的长度,。在上面的例子中,这一计算是495 * 8 + 540 = 4500字节。


当接收机具有所有的片段,它可以把它们在正确的顺序,通过使用他们的偏移。然后,它可以通过他们的数据的堆栈作进一步处理。

原文地址:https://www.cnblogs.com/qiaoyanlin/p/9356119.html