Tatsuya Oiwa About Archive Feed Github Twitter

TCP ConnectionのTIME-WAIT Stateについて調べたときに参考にしたリンクたち

TCPの仕様。全部読んだら詳しくなれるはず。

WikipediaのTCPのページ。概要を掴むならまずはここから。

今日はこれを読んだ。TIME-WAIT Stateがそもそもなぜ存在するのかというところを、TCPにおける通信の仕組みから順番に解説している。

TIME-WAITが存在する理由は、あるTCPのセグメントの送信に遅延が発生してしまった場合に後続の別のコネクションに影響が出てしまうことを防ぐためである。ただし、TIME-WAITがなくとも、実際に後続のコネクションに悪影響を及ぼすケースは非常に稀と言って良い。なぜなら、まず後続のコネクションの送信元ホストとポート、送信先ホストとポートの組み合わせが、当該コネクションのそれと同じでなければならない。通常、クライアントのポートはOSによってEphemeral Port Rangeから自動的に選択されるため、複数のコネクションが同じポートを使用する確率はその分少なくなる(多くのLinux KernelはEphemeral Portに32768〜61000を使用している)。さらに、遅延したTCPセグメントのシーケンス番号が、後続のコネクションにおいても有効である必要がある。これらの条件をすべて満たしてはじめて影響が出ることになるが、TIME-WAITの存在によってこの可能性を排除できる。

TIME-WAITにまつわる問題の一つに、並列処理による多数のTCPコネクションが実際の処理が完了しているにも関わらずTIME-WAIT Stateのまま残存してしまい、ローカルのEphemeral Portを使い果たしてしまう状況がある。

TIME-WAITの長さはLinux Kernelにハードコードされている(60秒)ため設定ファイルから変更することはできない。

推奨されている2つのKernelのオプションが以下。

tcp_tw_recycle - BOOLEAN
        Enable fast recycling TIME-WAIT sockets. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

tcp_tw_reuse - BOOLEAN
        Allow to reuse TIME-WAIT sockets for new connections when it is
        safe from protocol viewpoint. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

上記のよく似ている二つのオプションを解説しているサイト。まだ読んでない。

tcptwreuse をセットすると1秒で TIME_WAITのsocketは再利用が始まる

なるほど。

その他、実際のトラブルシューティングに関する情報や設定方法など。