![双 NAT 和 Windows 客户端的奇怪带宽问题](https://linux22.com/image/757966/%E5%8F%8C%20NAT%20%E5%92%8C%20Windows%20%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%E5%A5%87%E6%80%AA%E5%B8%A6%E5%AE%BD%E9%97%AE%E9%A2%98.png)
我遇到了以下问题,并且几乎已经尝试了所有方法,但无法弄清楚,这个问题的根本原因是什么,如何解释,以及如何解决它。
设置:
电缆路由器 192.168.0.1 <-> OpenWRT Linux 路由器,192.168.0.2 (WAN),10.0.0.199 (LAN) <-> LAN 10.0.0.x
所以我使用双 NAT,伪装 OpenWRT 路由器的 WAN 端口。
现在的问题是,所有 Windows 客户端的下载速度在几秒钟后都会随机变慢。一开始最高速度为 500mbit,然后迅速减慢到 60-120mbit 左右。有时它会随机地工作 20 分钟左右,然后再次中断。此外,还可能发生下载速度随机停留在 5MB/s 或类似的速度,反复出现。
这似乎是 Windows 独有的一个奇怪问题,并且在此设置中使用双重 NAT。
但完全奇怪的问题是,某些服务器不会触发此问题,即使在 Windows 客户端上也是如此。
该问题并非直接发生在 OpenWRT 路由器本身上,也不是 LAN 端的 Linux 客户端上。只是在所有 Windows 10 客户端上。
我完全不知道该如何解释这一点。
到目前为止我尝试了所有方法,包括重置 Windows 的 tcp 堆栈,但没有任何变化。
OpenWRT路由器上没有设置SQM/QoS。
我的理论是,这在某种程度上与 Windows 的 TCP 接收窗口和 TCP 自动调整算法有关。我不是这方面的专家,所以如果有人能对此发表一些看法,我将不胜感激。我前一天研究过这个问题,据我所知,Windows 10 中不再有可以手动设置的 RWIN,它只是使用 TCP 接收窗口的自动调整算法。
如果我在 Windows 客户端上执行“netsh int tcp set global autotuninglevel=disabled”,我的下载速度会立即卡在完全相同的 3MB/s 速度上,并且永远不会超过这个速度。我认为这也不正常。而恢复“netsh int tcp set global autotuninglevel=normal”的默认值会导致上述问题。
我读了 tcp 自动调整算法,它似乎是这样工作的,它与路由器和终端服务器进行通信,所以也许问题出在这里,OpenWRT 或双 NAT 以某种方式阻止了这种自动调整“对话”,但我不知道是怎么回事。或者双 NAT 以某种方式干扰了它,它在自动调整计算的时间戳计算中增加了一些延迟,然后 Windows 动态地降低了 TCP 接收窗口,从而发生了上述问题。这只是一种理论,当然我不是这方面的专家。有人能谈谈吗?
MS 对此表示:“当启用接收窗口自动调整功能时,与接收窗口自动调整功能不兼容的旧路由器、旧防火墙和旧操作系统有时可能会导致数据传输缓慢或 Vista 客户端之间的连接丢失。发生这种情况时,用户可能会遇到性能下降的情况。或者,应用程序可能会崩溃。这些旧设备不符合 RFC 1323 标准。一些设备制造商提供了可以绕过硬件限制的软件。”
如果有人知道如何解释和解决这个问题,我将非常高兴!