IP分段和重组

时间:2013-04-14 13:43:43

标签: networking tcp network-protocols fragmentation defragmentation

我目前正在阅读我的网络幻灯片,并想知道是否有人可以帮助我解决碎片和重组问题。

enter image description here

我理解它是如何工作的,即数据报如何分成较小的块,因为网络链接具有MTU。然而,图中的例子令我感到困惑。

所以前两个部分显示长度为1500,因为这是MSU,但不应该这意味着最后一个应该有1000(总共4000个字节)而不是1040?这些额外的40个字节来自哪里?我的猜测是因为前两个片段都有一个20字节的标题,这个额外的40字节数据需要去某处,所以它会到达最后一个片段吗?

Fragflag本质上意味着还有另一个片段,因此除了最后一个片段为零之外,所有片段都会有1个Fragflag。但是,我不明白偏移是什么或如何计算。为什么第一个偏移量为零?为什么我们将数据字段(1480)中的字节除以8得到第二个偏移?这8个来自哪里?除此之外,我假设每个片段偏移量只会增加这个值吗?

例如,第一个片段的偏移量为0,第二个片段为185,第三个片段为375,第四个片段为555? (370 + 185)

感谢您的帮助!

4 个答案:

答案 0 :(得分:18)

每个数据包中有一个20字节的标头。因此原始数据包包含3,980字节的数据。片段包含1480,1480和1020字节的数据。 1480 + 1480 + 1020 = 3980

标题中的每一位都很珍贵。将偏移量除以8允许它适合13位而不是16位。这意味着每个数据包但最后一个数据包必须包含多个8的数据字节,这不是问题。

答案 1 :(得分:16)

碎片和重组已在RFC 791中进行了专门解释。请完成Internet Protocol Specification RFC。 RFC有各种部分解释样本碎片和重组。你所有的疑虑和问题都得到很好的照顾。

Ans 1:关于数据包的长度:原始数据包包含4000字节。该分组是完全IP分组,因此也包含IP报头。因此,有效载荷长度实际上是4000 - (IP报头长度,即20)。

实际有效负载长度= 4000 - 20 = 3980

由于长度大于MTU(1500字节),现在数据包已经碎片化。

因此,第一个数据包包含1500字节,其中包括IP标头+有效负载分数。

1500 = 20(IP标头)+ 1480(数据有效负载)

与其他数据包类似。

第三个数据包应包含剩余的剩余数据(3980 - 1480 -1480)= 1020

因此,分组的长度是20(IP报头)+ 1020(有效载荷)= 1040

Ans 2:偏移量是参考原始数据有效负载从数据开始的地址或定位器。对于IP,数据有效载荷包括IP头和选项头之后的所有数据。因此,系统/路由器获取有效载荷并将其分成较小的部分并且参考原始分组保持偏移的轨迹,以便可以进行重新组装。

RFC第12页中所述。

" 片段偏移字段告诉接收者原始数据报中片段的位置。片段偏移和长度确定原始数据报的部分 被这个片段覆盖。更多片段标志指示(通过重置)最后一个片段。这些字段提供了足够的信息来重新组合数据报。"

片段偏移量以每个8字节为单位进行测量。它在IP头中有13位字段。如RFC第17页所述

" 此字段指示此片段所属的数据报中的位置。片段偏移量以8个八位字节(64位)为单位进行测量。第一个片段的偏移量为零。"

因此,当您在问题中询问此8的来源时,它是为IP协议规范定义的标准,其中8个八位字节被视为一个值。这也有助于我们通过它传输大数据包。

RFC的第28页写道: *碎片以8个八位字节为单位计算。碎片策略的设计使得未碎片化的数据报具有零碎片信息(MF = 0,碎片偏移= 0)。如果互联网数据报被分段,其数据部分必须是 在8个八位字节边界上打破。这种格式允许2 ** 13 = 8192个8个八位字节的片段用于a 共计65,536个八位字节。请注意,这与 数据报总长度字段(当然,标题在计算中 总长度,而不是碎片)。*

答案 2 :(得分:1)

IP头中的偏移大小为13位,但在最坏的情况下我们需要16位。因此我们使用比例因子8,即(2 ^ 16/2 ^ 13)。

答案 3 :(得分:0)

这些不是额外的位,而是最后一个片段的总长度。 因为1500是MTU,这意味着在包括头部的一个片段中可以有1500字节的数据。标题附加了每个片段。这意味着在片段中我们能够发送1500-20 = 1480字节的数据。 给出有4000B数据报。数据报只不过是网络层数据的数据包封装。因此我们要发送的总数据是4000-20 = 3980。然后将其分成3个部分(ceil(3980/1480)),每个部分长度分别为1480,1480,1020。因此,当20B标题附加到最后一个片段时,其长度变为1020 + 20 = 1040。