ループバックインターフェイスのTIME_WAIT
-
08-07-2019 - |
質問
ループバックインターフェイスへのTCP接続が TIME_WAIT
( SO_DONTLINGER
セットで閉じられたソケット)になるのはなぜですか?しかし、異なるホストへの同一の接続は終了しません TIME_WAIT
(それらはすぐにリセット/破棄されます)?
説明するシナリオを次に示します。
(A)2つのアプリケーション(クライアントとサーバー)が両方とも同じWindowsマシンで実行されています。クライアントは、サーバーのループバックインターフェイス(127.0.0.1、ポートxxxx)を介してサーバーに接続し、データを送信し、データを受信し、ソケットを閉じます( SO_DONTLINGER
が設定されています)。
接続の寿命は非常にであるため、クライアントアプリは毎秒多数の接続を確立および破棄しています。最終結果は、ソケットが TIME_WAIT
になり、クライアントは最終的に最大数のソケットを使い果たします(Windowsでは、これはデフォルトで〜3900であり、この値はレジストリで変更されました)。
(B)シナリオ(A)と同じ2つのアプリケーションですが、サーバーは別のホスト上にあります(クライアントはまだWindows上で実行されています)。接続は、127.0.0.1宛ではなく、代わりに他のIPである点を除いて、すべての点で同一です。ここでは、クライアントマシンの接続は TIME_WAIT
に入らず、クライアントアプリは無期限に接続を継続できます。
不一致の理由
解決
TIME_WAIT状態は、接続の一方の端、つまり最初に閉じた端でのみ発生します。ループバックインターフェイスの場合、両端が同じマシン上にあるため、常にTIME_WAITが表示されます。
他のケースでは、他のマシンを見てみてください。 TIME_WAITソケットが表示されると思います。