【问题标题】:When to set “Don't fragment” flag in IP header?何时在 IP 标头中设置“不分段”标志?
【发布时间】:2018-02-07 18:32:39
【问题描述】:

IP 标头中有一个“不要分段”标志。 应用程序可以设置这个标志吗? 什么时候设置这个标志,为什么?

【问题讨论】:

    标签: networking tcp ip wireshark


    【解决方案1】:

    如果在数据包上设置了“DF”位,通常会将大于 MTU 的数据包分段(并可能乱序传递)的路由器将丢弃该数据包。路由器应发送“需要 ICMP 分段”数据包,允许发送主机考虑到目标主机路径上的较低 MTU。然后,发送方将减少其对连接的路径 MTU(最大传输单元)的估计,并以较小的分段重新发送。这个过程称为 PMTU-D(“路径 MTU 发现”)。

    碎片会导致 CPU 处理在另一端重新组装数据包(以及处理丢失的碎片)的额外开销。

    通常,“DF”位是 IP 堆栈的可配置参数。我知道带有设置 DF 选项的 ping 实用程序。

    避免碎片通常很有用,因为除了碎片和重新组装的 CPU 利用率之外,它可能会影响吞吐量(如果丢失的碎片需要重新传输)。出于这个原因,通常希望知道最大传输单位。因此,“路径 MTU 发现”用于查找此大小,只需设置 DF 位(例如用于 ping)

    【讨论】:

      【解决方案2】:

      在 RFC 791 中进一步说明:

      If the Don't Fragment flag (DF) bit is set, then internet
      fragmentation of this datagram is NOT permitted, although it may be
      discarded.  This can be used to prohibit fragmentation in cases
      where the receiving host does not have sufficient resources to
      reassemble internet fragments.
      

      因此,他们最初的想法似乎是具有最简单的 IP 实现和小内存的小型嵌入式设备。今天,您可能会想到智能灯泡或烟雾报警器等物联网设备。他们可能没有代码或内存来重组片段,因此与他们通信的软件会设置 DF。

      【讨论】:

        【解决方案3】:

        我能想到的唯一可能设置此标志的情况是:

        1. 如果您正在构建类似于客户端-服务器应用程序的东西,其中 你不希望对方不得不处理一个支离破碎的 包,但更喜欢丢包。
        2. 或者,如果您在 具有一组非常具体的限制的网络,可能是由 带宽问题或特定的防火墙行为。

        除非这种特殊情况,你可能永远不会碰它。

        来自 RFC 791:

        互联网数据报的分段是必要的 起源于允许大数据包大小的本地网络,并且必须 遍历将数据包限制为较小尺寸的本地网络以达到 它的目的地。

        可以将 Internet 数据报标记为“不分段”。任何互联网 如此标记的数据报不会在任何 情况。如果 Internet 数据报标记为不分段,则不能 在不将其分割的情况下交付到目的地,它将被 而是丢弃。

        应用程序可以设置这个标志吗? 是的,如果您编写足够低级的代码来处理 IP 标头。这部分问题对于给出更具体的答案有点宽泛,您可能应该在担心如何设置之前弄清楚是否要设置它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-30
          • 2021-12-25
          • 2021-07-12
          • 2010-11-01
          • 2010-09-25
          • 2019-04-26
          • 2016-10-12
          • 2020-03-29
          相关资源
          最近更新 更多