web-dev-qa-db-ja.com

非常に短時間の停止でも、Windows 7 / PuTTYがTCP接続をドロップするのはなぜですか?

キャプティブWiFiに便乗する小さなローカルネットワークがあり、OS Xではsshを使用し、Windows 7 Professionalでは-oServerAliveInterval=240とPuTTY 0.62を使用して、Linode、Hetzner、その他のサーバーへの接続を確立しています。

PuTTYでは、ConnectionSending of null packets to keep session activeを240に選択します。デフォルトでは、Enable TCP keepalives (SO_KEEPALIVE option)はオフになっています。

私のインターネットが一時的に約1分間ダウンすると(キャプティブポータルで再認証する必要があります)、PuTTYはほとんどの場合、私が持っているすべての開いているsshセッション、特に何らかのアクティビティがあったセッションを失いますが、OSXのOpenSSH実際にsshに何かを入力しようとしても、インターネットが約1〜2分以内にバックアップされている限り、セッションが失われることはなく、接続が再びアクティブになるまで、60秒ほど応答がありません。 (つまり、NATの状態は常に保持されることは確かです。)

Windows/PuTTYが正常な接続をプリエンプティブに破棄するのを停止できますか?

Windowsでは、SO_KEEPALIVEなどがデフォルトで実際にオンになっているように見え、古い接続を検出するためのタイムアウトが小さすぎます。 OS Xがこれらの短時間の一時的な停止の影響を受けないのと同様に、停止が数百秒で-oServerAliveIntervalの値(ServerAliveCountMaxの倍)を下回っている限り、数秒以上に増やしたいと思います。 。

15
cnst

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


TcpMaxDataRetransmissions(REG_DWORD)が直接これに影響を与えるようです。値はHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parametersを使用して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では何も変わりません!

その間、KeepAliveIntervalをデフォルトの未設定値60000(1秒)から1000 10進数(60秒)に追加して設定することもできますが、上記のような私の特定のケースでは、TCPキープアライブが有効になっていませんでした。

8
cnst