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

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

我有一个搭载在强制 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 预先丢弃良好的连接吗?

在我看来,Windows 中的 SO_KEEPALIVE 或类似功能实际上默认处于启用状态,而检测过时连接的超时时间太短了。我想将其增加到几秒钟以上,类似于 OS X 如何不受这些短暂的临时中断的影响,只要中断时间只有几百秒并且低于-oServerAliveInterval(times ServerAliveCountMax) 的值。

答案1

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


这好像是TcpMaxDataRetransmissionsHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters(REG_DWORD) 直接影响这一点。可以使用添加值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 秒)添加并设置KeepAliveInterval为十进制(60 秒),但它不应该对我上面的特定情况产生任何影响,因为未启用 TCP keepalives。600001000

相关内容