【问题标题】:IP Fragmentation and ReassemblyIP分片和重组
【发布时间】:2013-04-06 15:44:37
【问题描述】:

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

我了解它的工作原理,即由于网络链接具有 MTU,数据报如何被拆分为更小的块。但是图片中的例子让我很困惑。

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: networking tcp network-protocols fragmentation defragmentation


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      分段和重组已在 RFC 791 中专门解释。请通过 Internet Protocol Specification 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页所述。

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 谢谢!这清楚地回答了我的问题的第一部分,但至于第二部分,为什么我们将 1480 除以 8 得到偏移量?
          • 非常感谢,这回答了一切!我只是想知道,我们总是除以 8 吗?是否有任何情况会导致我们除以不同的数字?
          • @JimmyK:如果我们试图遵守 IPv4 以外的其他标准。
          猜你喜欢
          • 2011-04-12
          • 2012-07-21
          • 2012-02-05
          • 1970-01-01
          • 2017-05-28
          • 2018-01-12
          • 2019-04-25
          • 1970-01-01
          • 2014-09-29
          相关资源
          最近更新 更多