TCP KeepAlive てぃーしーぴーきーぷあらいぶ
TCP KeepAliveキープアライブアイドル接続死活確認SO_KEEPALIVE
TCP KeepAliveについて教えて
簡単に言うとこんな感じ!
「まだいる?」と定期的に確認するハートビートだよ。TCP接続は長時間データを送らないと相手が切れてしまっていても気づかない。KeepAliveはそれを防ぐために、空のパケットを送って「生きてるか確認」してくれるんだ!
TCP KeepAliveとは
TCP KeepAliveは、長時間データ交換がないTCP接続が正常に維持されているかを定期的に確認する機能です。ソケットオプションSO_KEEPALIVEで有効化できます。
通常のTCP接続は、データの送受信がなくても「接続中」状態が維持されます。しかしこの間に一方のホストが突然クラッシュしたり、NATのタイムアウトで接続が切れたりすることがあります。この場合、もう一方はいつまでも「接続中」と思い込んでしまいます(ゴースト接続)。
TCP KeepAliveは一定時間(デフォルトは約2時間)データがなければ、KeepAliveプローブ(空のACKパケット)を送信して相手が生きているか確認します。応答がなければ接続を切断します。
TCP KeepAliveの3つのパラメータ
| パラメータ | Linuxでの設定名 | デフォルト値 | 意味 |
|---|---|---|---|
| アイドル時間 | tcp_keepalive_time | 7200秒(2時間) | この時間データがなければプローブ開始 |
| 再試行間隔 | tcp_keepalive_intvl | 75秒 | プローブの送信間隔 |
| 最大試行回数 | tcp_keepalive_probes | 9回 | この回数応答がなければ切断 |
2時間後からプローブを開始し、75秒×9回(約11分)応答がなければ接続を切断します。合計約2時間11分以上かかるため、アプリケーション層のKeepAlive(例:HTTPのKeep-Aliveヘッダ、SSH ServerAliveInterval)の方が多く使われます。
歴史と背景
- 1981年:TCP設計当初からKeepAliveの概念はあったが、デフォルトでは無効
- 2000年代:NATの普及によりアイドル接続が切れる問題が増加。KeepAliveの重要性が高まる
- 現在:データベース接続プール・クラウド環境では必須の設定になっている
KeepAliveの動作フロー
LinuxでのKeepAlive設定
# カーネルパラメータの確認
sysctl net.ipv4.tcp_keepalive_time
sysctl net.ipv4.tcp_keepalive_intvl
sysctl net.ipv4.tcp_keepalive_probes
# 変更例(アイドル30秒後、5秒間隔、5回)
sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_intvl=5
sysctl -w net.ipv4.tcp_keepalive_probes=5
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 1122 | TCP KeepAliveの実装要件 |
| RFC 793 | TCP基本仕様 |
関連用語
- TCP — KeepAliveを実装するプロトコル
- TIME_WAITとCLOSE_WAIT — 接続切断後の待機状態
- コネクション数の管理 — KeepAliveと関連するサーバー設定
- NAT・NAPT — アイドル接続が切れる原因の一つ