将数据从 Windows 机器通过网络以高延迟发送到 Windows 或 Linux 使用了 10% 的链接容量。同时,从 Linux 在同一网络上发送相同的数据几乎快十倍。即使仅通过延迟数据包在低延迟连接上模拟高延迟,问题也是相同的。
似乎它影响了我尝试过的所有应用程序。在 Windows 7 和 Windows Server 2003 上进行了测试,观察到了相同的行为。
从 tcpdump 可以看出,Windows 在快速突发中发送了大约 10 个数据包,然后等待 ACK,同时 Linux 发送了大约 10 个数据包而没有等待 ACK。
我曾尝试启用复合 TCP 而没有改进。
我正在寻找有关如何找出正在发生的事情的任何建议。以及如何修复它。
我能够通过增加 Windows 注册表中 TCP 发送和接收缓冲区的大小来完全解决我的问题(需要重新启动):
[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Afd \Parameters]
DefaultReceiveWindow = 1024000
DefaultSendWindow = 1024000
Run Code Online (Sandbox Code Playgroud)
如果这些键不存在,则两者的默认值都是 8KB,这是 Windows 等待 ACK 之后的数据量。
还要确保
netsh interface tcp show global
Run Code Online (Sandbox Code Playgroud)
不显示
Receive Window Auto-Tuning Level : disabled
Run Code Online (Sandbox Code Playgroud)
否则,TCP 窗口缩放不仅用于接收,而且用于发送,这将显着限制连接速度。要启用 TCP 窗口缩放,请将自动调整级别例如设置为正常:
netsh interface tcp set global autotuninglevel=normal
Run Code Online (Sandbox Code Playgroud)