TIME_WAITとCLOSE_WAIT たいむうぇいととくろーずうぇいと
TIME_WAITCLOSE_WAITTCP状態接続切断ソケット
TIME_WAITとCLOSE_WAITについて教えて
簡単に言うとこんな感じ!
TCPの接続を閉じた後に発生する「しばらく待つ状態」だよ。TIME_WAITは「念のため待機中」で正常な動作。CLOSE_WAITは「アプリが後処理をしてない」サインで、大量発生すると問題になるんだ!
TIME_WAITとCLOSE_WAITとは
TCPの接続は確立するだけでなく、切断にも状態遷移があります。代表的なのがTIME_WAITとCLOSE_WAITです。
TIME_WAITは、接続を能動的に閉じた側(通常はクライアントまたはHTTPサーバー)が切断後に一定時間(2×MSL:Maximum Segment Lifetime、通常60〜120秒)待機する状態です。遅延パケットが新しい接続に混入するのを防ぐための安全期間です。netstat -n | grep TIME_WAITで確認できます。
CLOSE_WAITは、相手からFINを受け取ったが、自分側のFINをまだ送っていない状態です。通常はアプリケーションが切断処理(ソケットのclose())をすると解消されます。CLOSE_WAITが大量に残る場合、アプリケーションが切断処理をしないまま放置している(バグの可能性大)ことを示します。
TCP接続切断の状態遷移
TIME_WAIT大量発生時の対策
WebサーバーやAPIサーバーで大量のTIME_WAITが発生すると、使用可能なポート番号が枯渇することがあります。
# TIME_WAIT状態のソケット数を確認
ss -n | grep TIME-WAIT | wc -l
# 対策1:TIME_WAITの再利用を許可(Linux)
sysctl -w net.ipv4.tcp_tw_reuse=1
# 対策2:http keep-aliveを活用してTCPコネクションを使い回す
歴史と背景
- 1981年:RFC 793でTIME_WAIT・CLOSE_WAITを含むTCP状態機械が定義
- 現在:クラウド・マイクロサービス環境でのコネクション管理がより複雑になっている
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 793 | TCP状態機械の定義 |
| RFC 6191 | TIME_WAITの高速解消(タイムスタンプ活用) |
関連用語
- TCP — TIME_WAIT・CLOSE_WAITを持つプロトコル
- 3ウェイハンドシェイク — 接続確立の手順(切断の対比として)
- RST(リセット) — TIME_WAITを経ない強制切断
- コネクション数の管理 — TIME_WAIT枯渇への対応