25

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

在此处输入图像描述

我了解它是如何工作的,即由于网络链接具有 MTU,数据报如何被分成更小的块。然而,图片中的例子让我感到困惑。

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

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

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

谢谢你的帮助!

4

4 回答 4

21

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

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

于 2013-04-14T14:11:37.450 回答
17

RFC 791 专门解释了分段和重组。请阅读Internet 协议规范 RFC。RFC 有多个部分解释示例碎片和重组。您的所有疑问和问题都在其中得到了很好的解决。

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

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

现在,由于长度大于 MTU(1500 字节),数据包被分段。

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

1500 = 20(IP 报头)+1480(数据负载)

对于另一个数据包也是如此。

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

因此数据包的长度是 20 (IP Header) + 1020 (payload) = 1040

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

RFC第 12 页中所述。

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

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

"该字段指示该片段在数据报中的位置。片段偏移量以 8 个八位字节(64 位)为单位。第一个片段的偏移量为零。 "

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

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

于 2014-07-22T06:32:05.117 回答
2

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

于 2013-04-23T15:42:47.200 回答
0

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

于 2017-04-27T08:41:11.393 回答