TCP 流分析82 条

TCP Fast Open 识别

TFO 允许数据随 SYN 携带(借助 TFO Cookie 免去握手往返):抓包可见 SYN 带数据或 TFO 选项,缩短首字节时间。

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 当成主力手段。

易错点

  • 中间设备对携带数据的 SYN 处理差异很大,不支持的设备会直接丢弃,故障表现是建连超时而不是明确报错,容易误判成链路丢包
  • Cookie 有有效期并与客户端地址绑定,换网络或超期后首次连接拿不到 TFO 收益,属正常现象
  • 用没有 Cookie 的首次连接去评估收益会明显低估效果,测量必须区分首连与复用连接
  • 只在客户端单点看到 TFO 选项不能说明全路径支持,两端同时抓包对照才能定位选项被剥离的位置

数据来源与参考

  • RFC 7413(TFO)
  • Wireshark 显示过滤器参考
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌