メインコンテンツまでスキップ

3. プロトコルの詳細 (Protocol Details)

本章では TCP Fast Open の技術的な実装の詳細(オプション形式、状態機械の遷移、データ処理ルールを含む)を詳しく説明します。

TCP オプション形式

+-------------+-------------+
| Kind=34 | Length=2 |
+-------------+-------------+

フィールド説明

  • Kind: 8 ビット、値は 34(TCP Fast Open 実験的オプション番号)
  • Length: 8 ビット、値は 2(Cookie データなし、これはリクエスト)

クライアントの動作仕様

クライアントが Cookie をリクエストする際に MUST 従うこと:

  1. 初回接続

    • SYN パケットの TCP オプションに Kind=34, Length=2 を含める
    • アプリケーションデータを運ばない
    • 通常の 3 ウェイハンドシェイクを完了する
  2. 再送処理

    • SYN パケットを再送する必要がある場合、MUST TFO オプションを保持する

TCP オプション形式

+-------------+-------------+-------------------+
| Kind=34 | Length | Cookie (4-16バイト)|
+-------------+-------------+-------------------+

フィールド説明

  • Kind: 8 ビット、値は 34
  • Length: 8 ビット、値は 6 〜 18(2 + Cookie 長)
  • Cookie: 4 〜 16 バイトの暗号化トークン

推奨される Cookie の内部構造:

Cookie = AES-128(ServerSecret, ClientIP || Timestamp || Counter)

構成要素:
- ClientIP: クライアント IP アドレス (4 または 16 バイト)
- Timestamp: Unix タイムスタンプ (4 バイト)
- Counter: リプレイ防止カウンター (オプション、4 バイト)

サーバーの実装要件

MUST 実装

  • Cookie はクライアント IP アドレスにバインドされなければならない
  • Cookie は検証可能でなければならない(MAC または暗号化を使用)
  • Cookie には有効期限がなければならない

SHOULD 実装

  • 強力な暗号化アルゴリズムを使用(AES-128 など)
  • キーローテーションメカニズムを実装
  • Cookie 使用統計を記録

3.3. TCP Fast Open 接続 (Fast Open)

クライアントの送信仕様

クライアントが Fast Open を使用する際に MUST 従うこと:

  1. Cookie の包含

    • SYN パケットの TCP オプションにキャッシュされた Cookie を含める
    • Cookie は対象サーバーから受信した有効な Cookie でなければならない
  2. データの運搬

    • SYN パケットにアプリケーションデータを含めることができる
    • データ長は MSS を超えてはならない (MUST NOT)
    • データは冪等でなければならない (MUST)(安全に再送可能)

サーバーの受信仕様

サーバーが Fast Open SYN を受信した際の処理フロー:

SYN + TFO Cookie + Data を受信

1. Cookie を検証
├─ Cookie 形式チェック
├─ IP アドレス一致チェック
├─ タイムスタンプ検証(期限切れかどうか)
└─ MAC/署名検証

2. Cookie 検証結果
├─ 有効 → ステップ 3 に進む
└─ 無効 → データを破棄、標準 SYN-ACK を送信

3. SYN データを受け入れる
├─ TCB (Transmission Control Block) を作成
├─ 状態:SYN-RECEIVED
├─ データを受信バッファに配置
└─ アプリケーション層にデータが読み取り可能であることを通知

4. SYN-ACK を送信
├─ SYN とデータを確認(ACK = ISN + 1 + DataLen)
├─ オプション:SYN-ACK に応答データを含める
└─ オプション:Cookie を更新(新しい Cookie を返す)

5. ACK を受信
└─ 接続が ESTABLISHED 状態に移行

サーバー側

# Cookie 生成の疑似コード
def generate_cookie(client_ip, server_secret, timestamp):
data = client_ip + timestamp
cookie = aes_encrypt(server_secret, data)
return cookie

def validate_cookie(cookie, client_ip, server_secret, max_age):
try:
data = aes_decrypt(server_secret, cookie)
stored_ip, timestamp = parse(data)
if stored_ip != client_ip:
return False
if current_time() - timestamp > max_age:
return False
return True
except:
return False

セキュリティ強化措置

リプレイ攻撃防止

Cookie にタイムスタンプを含める
→ サーバーは期限切れの Cookie を拒否
→ Cookie の有効期間を制限(例:24 時間)

IP スプーフィング防止

Cookie をクライアント IP にバインド
→ 異なる IP のクライアントは同じ Cookie を使用できない
→ モバイルネットワークシナリオでは IP ドリフトを考慮する必要がある

3.5. 状態機械の拡張 (State Machine Extensions)

クライアントの状態機械

CLOSED
↓ (アプリケーションが接続をリクエスト + Cookie あり)
SYN-SENT (SYN + Cookie + Data を送信)
↓ (SYN-ACK を受信、ACK がデータを含む)
ESTABLISHED

[Fast Open 成功!]

サーバーの状態機械

LISTEN
↓ (SYN + 有効な Cookie + Data を受信)
SYN-RECEIVED (データを受け入れ、アプリケーションに通知)
↓ (SYN-ACK を送信、データを確認)
↓ (ACK を受信)
ESTABLISHED

[Fast Open 成功!]