web-dev-qa-db-ja.com

キープアライブ、ESTABLISHEDおよびTIME_WAITセマンティクス

次のコマンドを使用すると

netstat -ant | grep :9111 | awk '{print $6}' | sort | uniq -c | sort -n

私は次のようになります

   1 LAST_ACK
   1 LISTEN
   2 SYN_RECV
   7 FIN_WAIT1
  51 ESTABLISHED
  71 FIN_WAIT2
8779 TIME_WAIT

TIME_WAITは、アプリケーション内で接続を閉じ、クライアントが接続を正常に閉じたことを確認するために一定時間待機していることを意味すると理解しています。間違っている場合は訂正してください。

私の質問は、キープアライブリクエストを取り巻くものです。私が期待しているトラフィックの大部分は、キープアライブである必要があります。

  1. キープアライブ接続はいつTIME_WAIT期間に入りますか?
  2. Kepalive接続がTIME_WAITからESTABLISHEDに移行することは可能ですか?もしそうなら、条件は何ですか?
3
Justin Wood

キープアライブメカニズムがどちらの側でも有効または無効になっていることとは関係なく、接続がTIME_WAITからESTABLISHEDに移行することはありません。 TIME_WAITは、一時的に使用されていない、最近閉じられた接続からのソケットペアの状態です。

ローカルエンドが接続の切断を正常に開始し(「アクティブCLOSE」)、リモートエンドからも接続を閉じたいという信号を受信した後、接続はTIME_WAIT状態になります。次に、OSはソケットペアを保持し、2つの [〜#〜] msl [〜#〜] sを待ってから、別の新しい接続のためにソケットペアを解放します。これにより、古い接続のセグメントが、古い接続のソケットペアを再利用するだけの新しく作成された接続に干渉することがなくなります。

これは本当に機能しますか?アクティブに閉じている端のソケットペアのみがTIME_WAITに入るだけで十分なのはなぜですか?一方の端でのソケットペアの再利用は、もう一方の端でのソケットペアの再利用を意味するためです。アクティブに閉じている端が2つのMSL内でクラッシュして再起動した場合はどうなりますか?次に、静かな時間に入ります。その間、接続はまったく作成されません。

TCP state machine

4
artistoex