【问题标题】:Benefits of "Don't Fragment" on TCP Packets?TCP 数据包上“不分片”的好处?
【发布时间】:2011-02-16 06:38:38
【问题描述】:

我们的一位客户无法将数据从我们的应用程序(在他们的 PC 上)提交到服务器(不同的地理位置)。当发送 1100 字节以下的数据包时,一切正常,但在此之上,我们看到 TCP 每隔几秒就重新传输一次数据包并且没有得到响应。我们用于测试的数据包大约为 1400 字节(但小于 1472)。我可以向 www.google.com 发送一个 1472 字节的 ICMP ping 并获得响应(所以这不是他们的路由器/前几跳)。

我发现我们的应用程序为这些数据包设置了 DF 标志,并且我相信通往服务器的路由器的 MTU 小于/等于 1100 并丢弃了数据包。

这会影响 5000 个客户中的 1 个,但由于每个人的路线都会有所不同,因此这是意料之中的。

数据是一个 SOAP 信封,我们期望得到一个 SOAP 响应。我无法证明我们为什么要这样做,这样做的代码是由以前的开发人员编写的。

那么... 在应用数据的 TCP 数据包上设置 DF 标志有什么好处或理由吗?

我可以想到网络诊断应用程序需要它的原因,但在我们的情况下不需要它(我们希望数据到达端点,无论是否碎片化)。我们的一位系统管理员说,这可能与我们使用 SSL 有关系,但据我所知,SSL 就像一个流,不管碎片如何,只要流在最后重建,就没有问题。

如果没有充分的理由,我将更改我们应用程序的行为。

提前致谢。

【问题讨论】:

  • 您进行的导致设置 DF 位的实际套接字 API 调用是什么?
  • 这里有一些关于 DF 可能有用的很好的讨论:stackoverflow.com/questions/351806/… - 简而言之,如果你不知道你需要它,那么你就不需要它.

标签: soap ssl tcp packet fragmentation


【解决方案1】:

显然,像 NFS 这样的一些协议可以从避免碎片中受益 (link text)。但是,你是对的,除非你真的需要它,否则你通常不应该请求 DF。

【讨论】:

    【解决方案2】:

    DF 标志通常设置在携带 TCP 段的 IP 数据包上。

    这是因为 TCP 连接可以动态更改其分段大小以匹配路径 MTU,当 TCP 分段每个都承载在一个 IP 数据包中时,可以获得更好的整体性能。

    所以 TCP 数据包设置了 DF 标志,应该在中间路由器因为数据包太大而不得不丢弃数据包时导致返回 ICMP Fragmentation Needed 数据包。然后,发送 TCP 将减少其对连接的路径 MTU(最大传输单元)的估计,并以较小的分段重新发送。如果未设置 DF,发送 TCP 将永远不会知道它正在发送太大的段。这个过程称为 PMTU-D(“路径 MTU 发现”)。

    如果 ICMP Fragmentation Needed 数据包没有通过,那么您正在处理一个损坏的网络。理想情况下,第一步是识别配置错误的设备并进行纠正;但是,如果这不起作用,那么您向应用程序添加一个配置旋钮,告诉它使用setsockopt() 设置TCP_MAXSEG 套接字选项。 (配置错误的设备的典型示例是路由器或防火墙由经验不足的网络管理员配置为丢弃所有 ICMP,而没有意识到 TCP PMTU-D 需要分段需要数据包)。 p>

    【讨论】:

      【解决方案3】:

      路径 MTU 发现的操作在 RFC 1191 https://www.rfc-editor.org/rfc/rfc1191 中进行了描述。 TCP 发现 Path-MTU 比将每个超过一定大小的数据包分成两部分(通常是一大块和一小块)要好。

      【讨论】:

        猜你喜欢
        • 2014-04-09
        • 2017-03-05
        • 2017-04-19
        • 2010-10-02
        • 2023-03-15
        • 2020-06-06
        • 2015-07-27
        • 1970-01-01
        • 2016-04-19
        相关资源
        最近更新 更多