IP分片和重组

25

我正在学习网络方面的幻灯片,想请教一下有关碎片化和重组的概念。

enter image description here

我理解这是如何工作的,即数据包被分成更小的块,因为网络链路具有MTU。但是图片中的例子令我感到困惑。

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

Fragment Flag 基本上意味着还有另一个片段,所以所有的 Fragment Flag 都为1,除了最后一个片段,它将是零。但是我不明白 Offset 是什么或者如何计算。为什么第一个 Offset 是零?我们为什么要将 datafield 中的字节(1480)除以8来获得第二个偏移量?这个8从哪里来?除此之外,我认为每个片段的偏移量将按此值递增?

例如,第一个片段将具有偏移量0,第二个片段将具有185,第三个片段将具有370,第四个片段将具有555吗?(370+185)

感谢任何帮助!

4个回答

21

每个数据包都有一个20字节的头部。因此原始数据包包含3980字节的数据。这些片段分别包含1480、1480和1020字节的数据。1480+1480+1020=3980

头部中的每一位都非常重要。将偏移量除以8,使其适合13位而不是16位。这意味着除了最后一个数据包外,每个数据包都必须包含的数据字节数是8的倍数,这不是问题。


2
谢谢!那清楚地回答了我问题的第一部分,但是对于第二部分,为什么我们要将1480除以8来得到偏移量? - JimmyK
非常感谢,这回答了所有问题!不过我想知道,我们是否总是要除以8?是否有任何情况会导致我们除以其他数字? - JimmyK
1
@JimmyK:如果我们试图遵守除IPv4之外的某些标准。 - David Schwartz

17

数据包的分段和重组在RFC 791中有详细解释。请阅读Internet协议规范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页所述:

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

因此,正如您在问题中提出的,这个8是来自于IP协议规范定义的标准,其中8个八位字节被视为一个值。这也帮助我们通过此方式传输大型数据包。

RFC第28页写道: *片段以8个八位字节的单位计数。分片策略设计为未分片数据报具有所有零的分片信息(MF = 0,片段偏移= 0)。如果Internet数据报被分片,则其数据部分必须按照8个八位字节的边界进行分割。此格式允许8192个由每个8个八位字节组成的片段,总共65536个八位字节。请注意,这与数据报总长度字段一致(当然,标题计入总长度而不是片段中)。


2

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接