2017-08-30 96 views

回答

2

如果'DF'位设置在数据包上,那么通常会将数据包大于MTU的数据包碎片化(并可能按顺序传送),而不会丢弃数据包。期望路由器发送“ICMP Fragmentation Needed”数据包,允许发送主机在通往目标主机的路径上计算较低的MTU。然后,发送端将减少其对连接的路径MTU(最大传输单元)的估计并以较小的段重新发送。该过程被称为PMTU-D(“路径MTU发现”)。

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

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

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

0

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

  1. 如果你正在构建一个客户端 - 服务器应用程序,其中 你不希望另一方必须处理分段 数据包,而宁愿丢失数据包。
  2. 或者如果您在 网络中有一组非常具体的限制,可能是由带宽问题或特定的防火墙行为引起的。

除了这些特定的情况下,你可能永远不会碰它。

从RFC 791:

因特网的数据报的碎片是在必要时它 起源于一个本地网,其允许大的分组大小和必须 横移一个本地网,其限制数据包发送到更小的尺寸,以到达 其目的地。

互联网数据报可以标记为“不分段”。任何互联网 如此标记的数据报不得在任何 的情况下被互联网分段。如果标记的互联网数据报不能分段,不能将 传送到其目的地,而是将其丢弃为 。

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