プログラムが終了した後、リスニングTCPポートをクリーニングするのに最大で数分かかるのはなぜですか?


27

TCPポートでリッスンしているプログラムを強制終了した場合、ポートがシステムによって回収されて再び使用可能になるまでに数分かかります。この現象に言及しているQ / Aがいくつかありますが、説明はありません。なぜそれが起こるのですか、なぜシステムはすぐにポートを回収しないのですか?WindowsやMacなどの別のシステムでも発生しますか?

回答:


25

この背後にある考え方は、そのポートでリッスンしている以前のプログラムをターゲットとしたパケットを受信しないようにすることです。このTIME_WAIT状態は、RFC793で最大セグメントライフタイムの2倍として定義されています。

私は他のオペレーティングシステムについては知りませんが、これらはすべて同様の動作をしていると思います。

この問題の回避策はSO_REUSEADDRTIME_WAIT状態を無視するソケットに設定することです。


3
信頼できるTCP状態図を確認すると、TIME_WAITはソケットの最後の状態であり、通常2MSLの間持続していることがわかります。これは最大セグメントライフタイムの2倍です。仕様(RFC793)では、これを2分と規定しており、合計4分を与えています。これにより、まだ「処理中」の要求と応答が処理され、適切なプログラムに到達するのに十分な時間を確保できます。ソケットがTIME_WAITの場合は破棄されます。
フェルクル

これはWindowsでも起こることを確認できます。
トーマスブラット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.