2. プロトコル概要 (Protocol Overview)
本章では TCP Fast Open の完全なワークフロー(Cookie リクエスト、付与、使用プロセスを含む)を説明します。
2.1. TFO Cookie リクエスト (Cookie Request)
クライアントはサーバーへの初回接続時に TFO Cookie を取得する必要があります。
メッセージフロー
クライアント サーバー
| |
| SYN + TFO Cookie リクエスト (空) |
|---------------------------------->|
| |
| SYN-ACK + TFO Cookie |
|<----------------------------------|
| |
| ACK |
|---------------------------------->|
| |
| アプリケーションデータ |
|<--------------------------------->|
TCP オプション形式
Cookie リクエストオプション:
- Kind: 34 (TCP Fast Open)
- Length: 2 (オプションヘッダーのみ、Cookie データなし)
- Cookie: 空(Cookie のリクエストを示す)
2.2. TFO Cookie 応答 (Cookie Response)
サーバーは Cookie リクエストを受信後、Cookie を生成して返します。
Cookie 生成アルゴリズム
サーバーは以下の情報を使用して Cookie を生成します。
- クライアント IP アドレス
- サーバーシークレット (Server Secret)
- タイムスタンプ(Cookie の有効期限用)
Cookie = AES-128(ServerSecret, ClientIP || Timestamp)
TCP オプション形式
Cookie 付与オプション:
- Kind: 34
- Length: 6 〜 18(2 バイトヘッダー + 4 〜 16 バイト Cookie)
- Cookie: サーバーが生成した暗号化トークン
2.3. TCP Fast Open 接続 (Fast Open Connection)
クライアントは後続の接続でキャッシュされた Cookie を使用して Fast Open を実現します。
メッセージフロー
クライアント サーバー
| |
| SYN + TFO Cookie + データ |
|---------------------------------->|
| | (Cookie を検証)
| | (データを処理)
| SYN-ACK + データ |
|<----------------------------------|
| |
| ACK |
|---------------------------------->|
主要な利点
遅延節約:
- 従来の TCP:1 RTT(ハンドシェイク)+ 1 RTT(リクエスト-レスポンス)= 2 RTT
- TCP Fast Open:1 RTT(ハンドシェイク+リクエスト-レスポンス)= 1 RTT 節約
SYN データの制限
増幅攻撃を防ぐため、SYN パケット内のデータは制限されます。
-
最大データ長:
- Linux 実装:デフォルトで MSS(最大セグメントサイズ)に制限
- 典型値:約 1460 バイト(イーサネット MTU 1500 - IP/TCP ヘッダー)
-
データ要件:
- MUST:データは冪等でなければならない(安全に再送可能)
- SHOULD:データは完全なリクエストであるべき(完全な HTTP リクエストなど)
2.4. Cookie の再利用 (Cookie Reuse)
Cookie のライフサイクル
有効期間管理:
- 典型的な有効期間:数時間から数日
- 更新戦略:クライアントは定期的に新しい Cookie をリクエストできる
- 期限切れ処理:Cookie が期限切れになると、サーバーは Fast Open を拒否し、クライアントは標準ハンドシェイクにフォールバック
Cookie が無効になるシナリオ
Cookie は以下の状況で無効になる場合があります。
- 時間切れ:サーバーが設定した有効期間を超過
- サーバーキーの更新:サーバーが暗号化キーをローテーション
- IP アドレスの変更:クライアントの IP アドレスが変更(モバイルネットワーク)
- サーバーポリシー:サーバーが Cookie を積極的に無効化(セキュリティ上の理由)
2.5. プロトコル相互作用の概要 (Protocol Interaction Summary)
完全なライフサイクル
フェーズ 1:初期化
クライアント ──SYN(Cookie リクエスト)──> サーバー
クライアント <──SYN-ACK(Cookie)─────── サーバー
クライアント ──ACK──────────────────> サーバー
[クライアントが Cookie をキャッシュ]
フェーズ 2:Fast Open(複数回)
クライアント ──SYN(Cookie+Data)──> サーバー
クライアント <──SYN-ACK(Data)───── サーバー
クライアント ──ACK──────────────> サーバー
[1 RTT 節約]
フェーズ 3:Cookie 更新(必要時)
フェーズ 1 を繰り返す
互換性マトリックス
| クライアント | サーバー | 結果 |
|---|---|---|
| TFO サポート | TFO サポート | Fast Open 成功 |
| TFO サポート | TFO 非サポート | 標準 TCP にフォールバック |
| TFO 非サポート | TFO サポート | 標準 TCP |
| TFO 非サポート | TFO 非サポート | 標準 TCP |