要約
- TCP の半開接続とは、一方が状態を失ったことをもう一方が知らない状態である。
- 状態を保持する側がデータを送ると、状態を失った側はRSTを返し、残っていた接続状態は破棄される。
- 再起動後の新しい SYN は相手が保持する古い履歴に衝突し、合わない ACK を受けた開始側が RST を送る。
- RSTはデータや元の接続を復元せず、新しいハンドシェイクのために残存状態を消去する。
接続を支える二つの記憶
TCPは一つの場所に接続を保存しているわけではない。各端点がシーケンス番号、確認応答、ウィンドウ、状態機械上の位置を持つ。双方の接続状態が整合している間だけ、接続という抽象が成り立つ。
RFC 793 と RFC 9293 は、相手に知られないまま一方が閉じる、異常終了する、または障害や再起動で記憶を失い非同期になる場合を半開と説明する。これは FIN による通常の半閉鎖とは異なる。FIN は一方向を意図的に閉じるが、半開は偶発的な状態の分裂である。
生き残った側が先に送る場合
B が接続を ESTABLISHED だと思ってデータを送る一方、A は再起動して CLOSED にいるとする。A には対応する接続制御ブロックがないため、そのセグメントを接続に属さないものとして RST を返す。B は RST を受け、保持していた古い接続を中止する。
RST は、障害前のデータが処理済みか、アプリケーションの処理が完了したかを教えない。B の記憶する接続に A がもう参加できないことだけを示す。
忘れた側が再開する場合
再起動したAが新しいSYNを送ることもある。Bは以前の接続状態を保持しているため、そのSYNが対応する受信ウィンドウの外にあると判断し、期待するシーケンス番号を含むACKを返す。Aは非同期なので、そのACKが新しい試行の何も確認していないと分かり、RSTを送る。Bが残存状態を削除した後、Aは通常の3ウェイハンドシェイクを続けられる。
TCPは互いに矛盾する状態を統合しない。共有できなくなった古い状態を終了させる。
トランスポートの境界
RST はトランスポート状態の矛盾を明確にするが、失われたデータ、認証、セッション、トランザクションを復元しない。回復方法は上位層の責任である。ここで扱う例は FIN による半閉鎖や必須の keepalive、RFC 5961 の challenge-ACK 強化とも別のものである。
出典
会員向け解説
プロフィールの詳細
適切な会員レベルでログインすると、解説全文と出典メモをご覧いただけます。
Strategic Circle 限定
Strategic Circle
すべての読者に公開されています。参加してログインすると プロフィール解説 を閲覧できます。
Strategic Circle に参加Leadership Alliance 会員限定
Leadership Alliance
対象となる IP 資産の所有者・管理者向けです。ログインすると Leadership Alliance の解説を閲覧できます。
Leadership Alliance に参加
