为什么 Windows 7 / PuTTY 即使在非常短暂的中断中也会丢弃 TCP 连接?

cns*_*nst 16 windows-7 connection tcp timeout putty

我有一个小型本地网络,它搭载在一个固定 WiFi 上,我ssh在 OS X 上使用-oServerAliveInterval=240PuTTY 0.62 在 Windows 7 Professional 上建立到我的 Linode、Hetzner 和其他服务器的连接。

使用 PuTTY,我选择ConnectionSending of null packets to keep session active到 240。Enable TCP keepalives (SO_KEEPALIVE option)默认关闭。

当我的互联网暂时关闭大约一分钟(必须在强制门户上重新进行身份验证)时,PuTTY 几乎总是丢失我拥有的所有打开的 ssh 会话,尤其是那些有任何类型活动的会话,但 OS X 上的 OpenSSH只要我的互联网在大约一两分钟内恢复,就永远不会丢失任何会话,即使我实际上尝试在 ssh 中输入一些内容,并且在整个 60 秒左右的时间内没有看到任何回复,直到我的连接再次处于活动状态。(所以我确信始终保留 NAT 状态。)

我可以阻止 Windows / PuTTY 抢先丢弃良好的连接吗?

在我看来,好像 SO_KEEPALIVE 或类似的东西在 Windows 中实际上是默认开启的,并且检测陈旧连接的超时时间太小了。我想将它增加到几秒钟以上,类似于 OS X 如何不受这些短暂的临时中断的影响,只要中断只有几百秒并且低于-oServerAliveInterval(times ServerAliveCountMax)的值。

cns*_*nst 9

http://www.chiark.greenend.org.uk/~sgtatham/putty/faq.html#faq-timeout


似乎TcpMaxDataRetransmissions(REG_DWORD) 直接影响到这一点。该值可以添加到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameterswith regedit.exe(默认情况下缺少该键,因此您首先必须添加它才能更改它)。未设置时 — 为 5。 添加它,并将其至少设置为f(15),然后重新启动。


默认值 5 似乎不足以在短暂和暂时的网络中断期间保持连接;你会在几秒钟内超时。我已将此TcpMaxDataRetransmissions键添加到注册表中,并将其值设置为f(15),重新启动机器,然后sysctl net.inet.ip.forwarding=0在 PuTTY 中键入字符之前在路由器上执行此操作后,在启用转发后得到该字符回显给我等待 5 分钟后在我的路由器上(我测试它以确定 0x0000000c (12) 的值使连接在第一次尝试在中断期间发送数据包后恰好 7 分钟中断)。在重新启动之前,PuTTY 会立即在几秒钟内使连接超时。请注意,需要重新启动——至少在 Windows 7 Professional 上,简单地更改注册表对现有连接和新连接都没有影响!Windows 中没有任何变化!

同时,也可能从默认的未设置值(1 秒)添加并设置KeepAliveInterval60000十进制(60 秒)1000,但它不应该对我上面的特定情况产生任何影响,因为未启用 TCP 保持连接。