要約

  • 3ウェイ・ハンドシェイクの主要な歴史的目的は、以前の接続から遅れてきたSYNを新しい開始要求として受理しないことである。
  • 両端は独立に初期シーケンス番号を選ぶ。応答側は受領確認と自分のSYNを一つにできるが、開始側が現在の応答を見た証拠には第3メッセージが要る。
  • Quiet Time、TIME-WAIT、秘密を使うISN、SYN cookieは、古いデータ、推測、資源消費という別々の問題を扱う。いずれも本人確認ではない。

前の会話から届くセグメント

インターネットではパケットが遅延し、複製され、順序を変えて届く。接続を閉じた直後に同じ送受信アドレスとポートを再利用すれば、古いSYNが新しい四つ組へ到着し得る。受信側はそのSYNだけを見ても年代を判定できない。

1980年1月の RFC 761 は、各TCPが初期送信シーケンス番号を選び、確立手順で相手の番号を学ぶとした。番号はデータの並べ替えや重複排除に使えるが、まず今回の接続がどの番号から始まるかを同期しなければならない。

四つの事実を三通で運ぶ

AはXを告げ、BはXを確認する。BはYを告げ、AはYを確認する。TCPはBの二つの動作を一つにまとめる。SYN XSYN Y, ACK X+1ACK Y+1である。

SYNはシーケンス空間を一つ消費するため、確認値はX+1になる。データを持たないACKは消費しない。ACKまで番号を進めればACKへのACKが続いてしまう。RFC 793 は1981年、この手順と状態遷移を標準化した。

接続を認定する中央台帳はない。二つのローカルな選択が、相互に確認できるメッセージによって共有状態へ変わる。

第3通が現在の開始を証明する

BがSYN-ACKを送った時点では、BはAのSYNを見ただけである。そのSYNが今のAから来たか、古い複製かは分からない。AがBのYを確認して初めて、現在のA側状態が応答を受け取ったと判断できる。

RFC 761はこれを記憶とメッセージのトレードオフと説明した。過去の全シーケンスを相手ごとに保存できなければ、もう一往復して現在性を確かめる。

ただし証明の範囲は狭い。現在のTCP状態が番号を観測したことを示すだけで、利用者の身元、アプリケーション権限、経路上の攻撃者不在は示さない。

古い番号には時間の境界も要る

開始時のSYNを除いても、閉じた接続のデータやACKは残る。初期仕様は最大セグメント寿命MSLを2分と仮定した。番号の記憶を失うクラッシュ後は1 MSL送信を控え、記憶が残るなら最近の範囲より先から再開する。

通常の終了後、TIME-WAITは同じ四つ組を2 MSL保持する。古い複製を排出し、終了の最終ACKを再送できるようにする。待ち時間そのものが、古い番号に新しい意味を与えないための状態である。

現行の RFC 9293 は原理を残しつつ、現代では再起動時のQuiet Timeを多くの場合不要とする。ポートとISNのランダム化、短い実効寿命、再起動時間が偶然の重複を減らした。高速通信で32ビットを早く一巡する場合は、TimestampとPAWSが古い複製を区別する。

TIME-WAITが途中で消されるとき

RFC 1337 は「TIME-WAIT assassination」を示した。古いセグメントがACKを誘発し、状態を捨てた相手がRSTを返す。そのRSTを受理すると、待機状態が早く消える。

直後に同じ四つ組を開けば、旧データや旧ACKが新しい受信窓へ入る可能性がある。誤ったデータ受理、状態のずれ、接続失敗が例示された。ハンドシェイク、窓検査、TIME-WAITは重複した機能ではなく、開始中、通信中、世代間をそれぞれ守る。

新しい番号は認証済みの相手ではない

予測可能なISNは、経路外の攻撃者に正しいACKを推測させた。RFC 6528 は、時間カウンタに四つ組と秘密から計算する疑似乱数値を加える。別の接続空間に外部から分かる関係を持たせず、時間による前進も維持する。

これはブラインド推測を難しくするが、経路上で交換を見られる相手には隠せない。TCP状態の新しさと、誰が通信しているかという暗号学的認証は別の問いである。

挑戦の番号に状態を預ける

公開サーバーは最初のSYNで半開き接続のメモリを確保しがちである。送信元を偽ったSYNを大量に受ければ、完了しない状態だけでキューが埋まる。RFC 4987 は、1996年に広く知られたSYN floodと対策の経緯を記録した。

SYN cookieは、四つ組、クライアントの番号、時刻、少数のパラメータ、秘密をSYN-ACKの番号へ符号化する。最終ACKが返るまで完全な状態を割り当てず、返った値から検証と再構成を行う。

証拠が来るまで費用を遅らせる設計である。符号化できるビットには限りがあり、オプション交渉との交換条件もある。したがって万能ではない。

三つのパケットという暗記の背後には、権限の分割がある。ネットワークは運び、端点は選び、相互ACKが共有状態を作り、時間が過去を失効させ、秘密が推測を抑え、cookieが資源投入を遅らせる。どれも相手の制度的な正当性まで決めない。

情報源と証拠の限界

RFCは仕様、設計理由、限定された障害分析を示すが、全実装の導入日を示さない。「相互証拠がローカルな選択を共有状態にする」という表現は、本文による構造的な解釈である。