1

I was reading about using the SO_LINGER socket option to intentionally 'assassinate' the time-wait state by setting the linger time to zero. The author of the book then goes on to say we should never do this and in general that we should never interfere with the time-wait state. He then immediately recommends using the SO_REUSEADDR option to bypass the time-wait state.

My question is, what's the difference? In both cases you're prematurely terminating the time-wait state and taking the risk of receiving duplicate segments. Why is one good and the other bad?

4

3 に答える 3

3

TIME_WAIT は絶対に正常です。これは、ローカル側の TCP FIN に続いてリモート ロケーションからの TCP FIN ACK の後に発生します。TIME_WAIT では、漂遊パケットがローカル アドレスに到着するのを待っているだけです。ただし、失われたパケットまたは迷子になったパケットがある場合、TIME_WAIT は、アドレスを再度使用する前に TTL または「存続可能時間」が期限切れであることを確認します。

SO_REUSEADDR を使用する場合、基本的には、浮遊パケットはないと仮定します。これは、最新の信頼性の高い TCP ネットワークでますます可能性が高くなります。まだ可能ですが、可能性は低いです。

SO_LINGER を 0 に設定すると、異常なクローズが開始されます。これは、「接続のシャット ダウン」とも呼ばれます。ここでは、TIME_WAIT を尊重せず、漂遊パケットの可能性を無視します。

FIN_WAIT_1 が表示された場合、リモート ロケーションが FIN に応答して TCP FIN ACK を送信していないため、問題が発生する可能性があります。そのため、プロセスが強制終了されたか、ネットワーク パーティションまたは不適切なルートが原因で TCP FIN ACK が失われました。

CLOSE_WAIT が表示された場合、問題があります。ここでは、TCP FIN を指定したときに TCP FIN ACK を送信していないため、接続がリークしています。

于 2009-02-25T21:45:27.490 に答える
0

SO_REUSEADDR を使用して、他のプログラムが既に接続を開いているローカル ポートに bind() をワイルドカード化しました。2 つのソケットが同時に同じ addr/port の組み合わせで listen() しようとしない限り、この特定の使用法が問題を引き起こすことは決してないことがわかります。

于 2011-03-08T17:35:44.797 に答える
0

私はもう少し読んで、これが何が起こるかについての私の理解です(うまくいけば正しい):

SO_REUSEADDR が設定されている (またはアプリがクラッシュする) ソケットで close を呼び出すと、次のシーケンスが発生します。

  1. TCP 送信バッファに残っているデータと FIN を送信します。
  2. close が呼び出された場合、残りのデータが正常に配信されたかどうかを示すことなく、すぐに戻ります。
  3. データが送信された場合、ピアはデータ ACK を送信します
  4. ピアは FIN の ACK を送信し、独自の FIN パケットを送信します
  5. ピアの FIN が確認され、ソケット リソースの割り当てが解除されます。
  6. ソケットは TIME-WAIT に入りません。

SO_LINGER 時間をゼロに設定してソケットを閉じると、次のようになります。

  1. TCP は送信バッファ内のすべてのデータを破棄します
  2. TCP は RST パケットをピアに送信します
  3. ソケット リソースの割り当てが解除されます。
  4. ソケットが TIME-WAIT に入らない

したがって、linger をゼロに設定することはハックであり悪いスタイルであるという事実を超えて、接続のクリーンなシャットダウンを行わないため、マナー違反でもあります。

于 2009-02-28T21:26:00.447 に答える