ループバックインターフェイスへのTCP接続が終了するTIME_WAIT
(ソケットがSO_DONTLINGER
setで閉じられる)のに、別のホストへの同一の接続が終了しない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
ず、クライアントアプリは無期限に接続を継続できます。
なぜ矛盾があるのですか?