【问题标题】:Sending data from Windows is slow over any network with high latency but linux is fast在任何具有高延迟的网络上从 Windows 发送数据都很慢,但 linux 速度很快
【发布时间】:2012-05-22 00:15:21
【问题描述】:

通过网络以高延迟将数据从 Windows 机器发送到 Windows 或 Linux 会占用 10% 的链路容量。同时,从 Linux 通过同一网络发送相同数据的速度几乎快了十倍。即使仅通过延迟数据包在低延迟连接上模拟高延迟,问题也是一样的。

它似乎影响了我尝试过的所有应用程序。在 Windows 7 和 Windows Server 2003 上进行了测试,并观察到了相同的行为。

从 tcpdump 可以看出,Windows 在快速突发中发送了大约 10 个数据包,然后等待 ACK,而 Linux 发送大约 100 个数据包而不等待 ACK。

我已尝试启用 Compound TCP 而没有改进。

我正在寻找有关如何找出正在发生的事情的任何建议。以及如何解决它。

【问题讨论】:

  • 这不是一个编程问题,对于 StackOverflow 来说是题外话。请花点时间查看FAQ,以更熟悉此处适合(和不适合)提出的问题类型。使事情保持在主题上有助于使 SO 成为有用的编程资源。谢谢。 :)
  • 嗯,它发生在任何 LFN 上,甚至是用人为延迟的数据包模拟的。在发布之前我正在阅读常见问题解答,在我看来,任何 Windows 网络软件的开发人员都必须处理这个问题,因此它适用于 StackOverflow。我只是措辞不佳还是您认为它仍然离题?
  • 离题了。 :) 这是一个网络问题,而不是编程问题,除非您可以发布导致您出现问题的代码。如果我问我应该买什么样的计算机,那是题外话,即使我说我正在使用计算机为我的编程工作编写代码。

标签: tcp


【解决方案1】:

我能够通过增加 Windows 注册表中 TCP 发送和接收缓冲区的大小来完全解决我的问题(需要重新启动):

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Afd \Parameters]
DefaultReceiveWindow = 1024000
DefaultSendWindow = 1024000

如果这些键不存在,则两者的默认值为 8KB,这是 Windows 等待 ACK 之后的数据量。

还要确保

netsh interface tcp show global

不显示

Receive Window Auto-Tuning Level    : disabled

否则,TCP Window Scaling 不仅对接收而且对发送都被禁用,这将显着限制连接速度。要启用 TCP Window Scaling,请将 Auto-Tuning 级别设置为正常:

netsh interface tcp set global autotuninglevel=normal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多