TCP/UDPの仕組み

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_time7200秒(2時間)この時間データがなければプローブ開始
再試行間隔tcp_keepalive_intvl75秒プローブの送信間隔
最大試行回数tcp_keepalive_probes9回この回数応答がなければ切断

2時間後からプローブを開始し、75秒×9回(約11分)応答がなければ接続を切断します。合計約2時間11分以上かかるため、アプリケーション層のKeepAlive(例:HTTPのKeep-Aliveヘッダ、SSH ServerAliveInterval)の方が多く使われます。


歴史と背景

  • 1981年:TCP設計当初からKeepAliveの概念はあったが、デフォルトでは無効
  • 2000年代:NATの普及によりアイドル接続が切れる問題が増加。KeepAliveの重要性が高まる
  • 現在データベース接続プール・クラウド環境では必須の設定になっている

KeepAliveの動作フロー

TCP KeepAlive の動作 クライアント サーバー (2時間のアイドル後) KeepAliveプローブ(空ACK)「まだいる?」 ACK応答「います!」→ 接続維持 応答なし → 再試行 → 最大試行回数後に接続切断

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 1122TCP KeepAliveの実装要件
RFC 793TCP基本仕様

関連用語