17

我目前正在浏览我的网络幻灯片,并想知道是否有人可以帮助我分解和重组的概念。IP分片和重新组装

enter image description here

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

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

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

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

感谢您的帮助!

回答

14

每个数据包中都有一个20字节的标题。所以原始数据包包含3,980字节的数据。这些片段包含1480,1480和1020字节的数据。 1480 + 1480 + 1020 = 3980

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

+1

谢谢!这清楚地回答了我的问题的第一部分,但就第二部分而言,为什么我们将1480除以8以获得抵消? – JimmyK

+0

我会更新答案。 –

+0

非常感谢,回答一切!我只是想知道,我们总是除以8?有什么情况会导致我们除以不同的数字? – JimmyK

0

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

14

碎片和重组已在RFC 791中进行了详细说明。请通过Internet Protocol Specification RFC。 RFC有不同的部分解释了示例碎片和重新组装。你的所有疑虑和问题都充分照顾它。

回答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

答2 :偏移量是数据从引用原始数据有效负载开始的地址或定位器。对于IP,数据有效载荷包含IP标头和选项标头之后的所有数据。因此,系统/路由器接收有效载荷并将其分成较小的部分,并参照原始数据包保持偏移的轨迹,以便重新组装。

RFC页给出12.

片段偏移字段告诉接收的片段的原始数据报的位置。该片段偏移和长度确定所涵盖的原始数据报 的部这个片段表示(通过复位)最后一个片段,这些字段提供足够的信息来重组数据报

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

该字段表示其中在该片段belongs.The片段偏移中的8个字节(64位)为单位测得的数据报。第一个片段已偏移为零。

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

RFC的第28页写道: *片段以8个八位组为单位计数。分片策略的设计要比未分片的数据报具有全部零分片信息(MF = 0,分片偏移= 0)。如果互联网数据报被分段,则其数据部分必须是在8个八位字节边界上分解的 。这种格式允许2 ** 13 = 8192个8位字节的碎片,每个碎片总数为65,536个八位位组。请注意,这与数据报总长度字段 一致(当然,报头总计为 ,而不是在片段中)。*

0

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