TIME-WAITのソケットが溜まる理由:TCPの2×MSLとLinuxの60秒、tcp_fin_timeoutの誤解

TCPで先に接続を閉じた側がTIME-WAITにとどまる理由と、RFC 9293の2×MSL、Linuxで固定の60秒を整理しました。tcp_fin_timeoutが実際に決めるものとtcp_tw_reuseの既定値も扱います。

開発ネットワークLinux

ソケットの一覧に TIME-WAIT が何千も並んでいるとリークを疑いたくなりますが、たいていは TCP が仕様どおりに動いた結果です。ルールは TCP の標準である RFC 9293 にあり、実際にどれだけ待つかは実装が決めます。以下の Linux の動作はカーネル v7.2 のソースに、既定値は 2026 年 10 月 6 日に確認したカーネルドキュメントの ip-sysctl のページ(バージョン表記なし)に基づいています。

先に閉じた側に残る

通常の切断では、先に閉じる側 A が FIN を送り、その ACK を受け取ります。続いて相手 B が FIN を送ると、A は ACK を返して TIME-WAIT に入ります。B はその最後の ACK を受け取った時点で CLOSED になります。RFC 9293 は、能動的に閉じた側は TIME-WAIT に 2×MSL のあいだとどまらなければならない(MUST)と定めています。

先に閉じる A と相手 B の TCP 切断手順。A は FIN を送って FIN-WAIT-1、ACK を受けて FIN-WAIT-2、B の FIN に ACK を返して TIME-WAIT に入る。B は CLOSE-WAIT と LAST-ACK を経て、最後の ACK で CLOSED になる。A の TIME-WAIT は RFC 9293 では 2×MSL(4 分)、Linux v7.2 では 60 秒。

図:両側が同時に閉じない、通常の FIN による切断です。時間は上から下へ進みます。

そのため、両側が同時に閉じない通常の FIN による切断では、TIME-WAIT のソケットが一つ、先に閉じた側に残ります。サーバーかクライアントかは関係ありません。

なぜ待つのか

RFC 9293 が挙げる目的は二つです。一つは、相手が自分の FIN への ACK を受け取ったと見なせるまで待つことです。最後の ACK が失われると相手は FIN を再送し、TIME-WAIT の側はもう一度 ACK を返してタイマーを最初から数え直します。もう一つは、以前の接続で遅れて届いたセグメントが新しい接続に紛れ込まないようにすることです。接続は両端のアドレスとポートの組で識別されるため、同じ組ですぐに新しい接続を開くと、古いセグメントが入り込むおそれがあります。

MSL(Maximum Segment Lifetime)はセグメントがネットワーク上に存在できる時間で、RFC 9293 はこれを 2 分としています。2×MSL は 4 分です。仕様は、この値は工学的な選択であり変わりうるとも書いています。

Linux は 60 秒に固定している

Linux v7.2 の include/net/tcp.h は TCP_TIMEWAIT_LEN を 60*HZ(約 60 秒)と定義し、net/ipv4/tcp_minisocks.c の tcp_time_wait() は TIME-WAIT に入るソケットの待ち時間をこの定数にします。仕様の 4 分より短く、ip-sysctl のドキュメントで TIME-WAIT に触れている項目のうち、この長さを変えるものはありません。

紛らわしいのが tcp_fin_timeout です。ドキュメントによると、これはどのアプリケーションからも参照されなくなった(orphaned)接続が FIN_WAIT_2 にとどまる時間で、既定値の 60 秒は TIME-WAIT の長さと同じです。しかし tcp_time_wait() は、TIME-WAIT 状態なら渡された値に関係なく TCP_TIMEWAIT_LEN を使います。tcp_fin_timeout を小さくしても TIME-WAIT は短くなりません。

tcp_tw_reuse は、プロトコル上安全なときに TIME-WAIT のソケットを新しい接続に再利用できるようにする設定です。0 は無効、1 は全体で有効、2 はループバックの通信だけで有効で、既定値は 2 です。ドキュメントは、技術的な専門家の助言なしに変更しないよう書いています。

ポートはどこまでもつか

クライアントが先に閉じ、同じ宛先へ短い接続を開き続けると、エフェメラルポートの範囲がボトルネックになりえます。ip_local_port_range の既定値は 32768 から 60999 までの 28,232 個です。ポート一つが 60 秒ずつふさがるので、28,232 ÷ 60 で毎秒およそ 470 個が、定常状態で続けられる新規接続数のおおまかな見積もりです。TCP の上限ではなく、次の前提での計算です。送信元 IP とネットワーク名前空間が一つ、ポート範囲は既定値のまま、予約ポートなし、カーネルの通常の自動ポート割り当て、宛先アドレスとポートが一つに固定、適用される TIME-WAIT の再利用なし。

こうしたパターンなら、sysctl に手を入れる前に、接続を再利用して閉じる回数そのものを減らせないかを先に確かめるほうがよいでしょう。

参照文書

リンクと内容は2026年10月6日に確認しました。

ブログへ