何时在IP标头中设置“不分片”标志?

10

IP头中有一个“不分片”标志。 应用程序能设置这个标志吗? 何时设置此标志以及为什么要设置?

3个回答

10
如果数据包上设置了'DF'位,那么通常会对一个大于MTU的数据包进行分片并可能无序地传递它的路由器,将会丢弃该数据包。预期路由器发送 "ICMP Fragmentation Needed" 数据包,允许发送方主机考虑到路径上的目标主机的较低MTU值。发送端随后将减少其对连接的路径MTU(最大传输单元)的估计,并以更小的分段重新发送数据。这个过程被称为 PMTU-D("Path MTU Discovery")。
分片会导致额外的CPU处理开销,在另一端重新组装数据包(和处理丢失的数据包片段)。
通常,'DF'位是IP栈的可配置参数。我知道有一个ping实用程序,其中有一个选项可以设置DF。
通常有用的避免分片,除了CPU利用率用于分片和重组外,它可能会影响吞吐量(如果丢失的片段需要重新传输)。因此,通常希望知道最大传输单元。因此,“路径MTU发现”用于查找此大小,仅通过设置DF位(例如为ping)。

4

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 和少量内存的小型嵌入式设备。今天,您可能会将 IoT 设备视为智能灯泡或烟雾报警器。它们可能没有重新组装片段的代码或内存,因此与其通信的软件会设置 DF。


1
我能想到的唯一需要设置此标志的情况是:
  1. 如果您正在构建类似客户端 - 服务器应用程序的东西,其中您不希望另一方处理分段数据包,而更喜欢数据包丢失。
  2. 或者,如果您处于具有非常特定限制的网络中,可能是由带宽问题或特定防火墙行为引起的。
除了这些特定情况外,您很可能永远不会接触它。
来自RFC 791:

当一个因特网数据报在允许大数据包大小的本地网络中产生,但必须穿过将数据包限制为较小大小以达到目的地的本地网络时,需要对其进行分段。

可以标记因特网数据报为“不要分段”。任何标记为不要分段的因特网数据报都不得在任何情况下进行因特网分段。如果无法将标记为不要分段的因特网数据报传递到其目的地而不对其进行分段,则应将其丢弃。

应用程序能够设置这个标志吗? 如果您编写的代码足够底层,处理IP头部,则可以设置此标志。对于更具体的答案,此问题的这一部分有点宽泛,您可能应该先确定是否要设置它,然后再考虑如何设置。


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