TFO 是什么
TCP Fast Open(RFC 7413)允许客户端在 SYN 报文里直接携带应用数据,服务端则在响应中下发一枚 TFO Cookie;客户端后续向同一目标建连时复用该 Cookie,即可在握手阶段就把数据送出去,省掉一个往返的数据等待时间,收益体现在首字节时间而不是带宽。抓包里有两类识别线索:SYN 的 TCP 载荷长度大于零(普通握手 SYN 不带数据);SYN 中带 TFO 选项与 Cookie 字段。是否为首次连接很关键,首次没有 Cookie 的握手拿不到这份收益。
基本信息
| 协议依据 | RFC 7413(TCP Fast Open) |
|---|---|
| 抓包字段 | tcp.options.tfo 选项与 tcp.len 载荷长度 |
| 客户端条件 | 应用开启 TFO 且持有该目标的有效 Cookie |
| 服务端条件 | 内核与上层服务同时启用 TFO |
| 生效前提 | 客户端、服务端与路径上设备全部放行 |
典型使用场景
- 首字节优化评估:对比启用前后 SYN 发出到首字节的时间差
- 排查建连超时:带数据的 SYN 被中间设备丢弃时表现为无响应而非报错
- 高延迟链路优化:移动网络与跨境链路上省一个往返收益更明显
- 设备行为核查:确认安全设备是否剥离了 TFO 选项
- 升级验证:内核或应用升级后确认 TFO 是否按预期生效
观察与过滤
观察与过滤
tcp.options.tfo # TFO 选项是否存在
tcp.flags.syn == 1 && tcp.len > 0 # SYN 携带应用数据
tcp.options.tfo.cookie # Cookie 字段有无与长度
# SYN-ACK 侧:看是否回带 Cookie 或数据
tcp.flags.syn == 1 && tcp.flags.ack == 1线索对照
| 线索 | 含义 | 注意 |
|---|---|---|
| SYN 带载荷 | 客户端在建连阶段就发数据 | 合法行为,但部分中间设备会丢弃 |
| SYN 含 TFO 选项 | 两端握手协商中 | 需要有效 Cookie 才会真正带数据 |
| 重复连接无数据 | Cookie 未获取或未复用 | 回看首次连接响应是否下发 Cookie |
| 选项被剥离 | 路径设备不支持 | 需两端抓包对照才能确认剥离点 |
TFO 要客户端、服务端和路径上所有设备一起放行;跨境链路或经过老旧设备时,带数据的 SYN 常被静默丢弃,表现为建连超时或首连秒级重试,排查先看 SYN 是否带了数据却迟迟没有 SYN-ACK。
它的收益只是一个往返的时间,连接复用(HTTP/2 多路复用、连接池)通常带来的节省更大;排优化优先级时不要把 TFO 当成主力手段。