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)
关键点
- 透明性:不支持 TFO 的服务器会忽略该选项,连接正常建立
- 兼容性:客户端必须准备好回退到标准 TCP 三次握手
- 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: 服务器生成的加密 Token
服务器行为
- MUST:在 SYN-ACK 中包含 TFO Cookie 选项
- SHOULD:使用加密强度足够的算法生成 Cookie
- MUST:定期更换服务器密钥以增强安全性
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 请求)
服务器验证流程
服务器收到 Fast Open SYN 时:
1. 验证 TFO Cookie
├─ 有效 → 接受 SYN 数据,进入 SYN-RECEIVED 状态
└─ 无效 → 丢弃 SYN 数据,按标准 TCP 握手处理
2. 如果 Cookie 有效
├─ 将 SYN 数据传递给应用层
├─ 应用可以立即处理并生成响应
└─ 在 SYN-ACK 中携带响应数据(可选)
3. 完成三次握手
└─ 收到 ACK 后,连接进入 ESTABLISHED 状态
2.4. Cookie 重用 (Cookie Reuse)
Cookie 生命周期
有效期管理:
- 典型有效期:数小时到数天
- 更新策略:客户端可以定期请求新 Cookie
- 过期处理:Cookie 过期后,服务器拒绝 Fast Open,客户端回退到标准握手
Cookie 失效场景
Cookie 可能在以下情况下失效:
- 时间过期:超过服务器设定的有效期
- 服务器密钥更换:服务器轮换加密密钥
- IP 地址变更:客户端 IP 地址改变(移动网络)
- 服务器策略:服务器主动撤销 Cookie(安全原因)
客户端缓存策略
SHOULD 实现的功能:
- 为每个服务器 IP:Port 缓存独立的 Cookie
- 实现 Cookie 过期管理
- Cookie 失效时自动重新请求
- 支持多个服务器的 Cookie 管理
回退机制
当 Fast Open 失败时,客户端必须能够回退:
尝试 Fast Open
├─ 成功 → 继续使用
├─ Cookie 被拒绝 → 完成标准握手,请求新 Cookie
└─ 超时 → 重传 SYN(可能不带数据)
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
性能指标
| 连接类型 | 数据传输开始时间 | 相对性能 |
|---|---|---|
| 标准 TCP | 1.5 RTT | 基准 |
| TFO (首次) | 1.5 RTT | 与标准 TCP 相同 |
| TFO (后续) | 0.5 RTT | 提升 66% |
兼容性矩阵
| 客户端 | 服务器 | 结果 |
|---|---|---|
| 支持 TFO | 支持 TFO | Fast Open 成功 |
| 支持 TFO | 不支持 TFO | 回退到标准 TCP |
| 不支持 TFO | 支持 TFO | 标准 TCP |
| 不支持 TFO | 不支持 TFO | 标准 TCP |
下一章节: 3. 协议详细说明 (Protocol Details) 将深入介绍 TFO 选项格式、状态机和实现细节。