3. プロトコルの詳細 (Protocol Details)
本章では TCP Fast Open の技術的な実装の詳細(オプション形式、状態機械の遷移、データ処理ルールを含む)を詳しく説明します。
3.1. TCP Fast Open Cookie リクエスト (Cookie Request)
TCP オプション形式
+-------------+-------------+
| Kind=34 | Length=2 |
+-------------+-------------+
フィールド説明:
- Kind: 8 ビット、値は 34(TCP Fast Open 実験的オプション番号)
- Length: 8 ビット、値は 2(Cookie データなし、これはリクエスト)
クライアントの動作仕様
クライアントが Cookie をリクエストする際に MUST 従うこと:
-
初回接続:
- SYN パケットの TCP オプションに Kind=34, Length=2 を含める
- アプリケーションデータを運ばない
- 通常の 3 ウェイハンドシェイクを完了する
-
再送処理:
- SYN パケットを再送する必要がある場合、MUST TFO オプションを保持する
3.2. TCP Fast Open Cookie 付与 (Cookie Grant)
TCP オプション形式
+-------------+-------------+-------------------+
| Kind=34 | Length | Cookie (4-16バイト)|
+-------------+-------------+-------------------+
フィールド説明:
- Kind: 8 ビット、値は 34
- Length: 8 ビット、値は 6 〜 18(2 + Cookie 長)
- Cookie: 4 〜 16 バイトの暗号化トークン
Cookie 構造の推奨
推奨される 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 従うこと:
-
Cookie の包含:
- SYN パケットの TCP オプションにキャッシュされた Cookie を含める
- Cookie は対象サーバーから受信した有効な Cookie でなければならない
-
データの運搬:
- 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 状態に移行
3.4. Cookie 処理 (Cookie Handling)
Cookie のライフサイクル管理
サーバー側:
# 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 成功!]