TCP Fast Open 是什么
net.ipv4.tcp_fastopen 控制 TCP Fast Open(TFO)功能:允许客户端在首个 SYN 报文里就携带应用数据,服务端提前把数据交给应用处理,从而省掉一次往返协商。取值按位组合:1 表示客户端方向启用,2 表示服务端方向启用,3 表示双向启用,0 为关闭。它最适合短请求反复重连的场景,比如移动端的接口调用;对已建立的长连接没有意义。
基本信息
| 参数 | net.ipv4.tcp_fastopen |
|---|---|
| 取值 | 0 关闭 / 1 仅客户端 / 2 仅服务端 / 3 双向(按位组合) |
| 生效前提 | 应用需要显式使用该特性,服务端还要能读取 SYN 中的数据 |
| 性能收益 | 每个新建连接省去一次往返时延 |
| 统计指标 | TcpExt 中的 TCPFastOpenActive、TCPFastOpenPassive 等计数 |
| 风险点 | 部分中间设备会丢弃携带数据的 SYN |
典型使用场景
- 移动端接口调用:短请求为主,省一次往返对首字节时间提升明显
- 客户端频繁重连:连接建立开销占比高,TFO 收益最直接
- 服务端支持评估:确认应用与框架是否具备读取 SYN 数据的能力
- 灰度验证:在内核参数与中间链路之间做小流量验证,确认未被丢弃
- 效果量化:用计数指标确认是否真的命中,而不是只看参数值
查看与启用
查看与启用
sysctl net.ipv4.tcp_fastopen # 读当前模式
sysctl -w net.ipv4.tcp_fastopen=1 # 仅客户端方向启用
nstat -az TcpExtTCPFastOpenActive # 客户端实际使用次数
nstat -az TcpExtTCPFastOpenPassive # 服务端实际接受 TFO 的次数
ss -ti | head # 观察连接的 TCP 选项情况落盘与回读
落盘与回读
# /etc/sysctl.d/99-net-tuning.conf
net.ipv4.tcp_fastopen = 1 # 仅客户端启用;双向时写 3
# 回读命令:sysctl net.ipv4.tcp_fastopen取值与方向
| 取值 | 含义 | 适用角色 |
|---|---|---|
| 0 | 关闭 TFO | 默认状态,需要显式开启 |
| 1 | 仅客户端使用 | 调用方为主的主机,风险最小 |
| 2 | 仅服务端接受 | 服务提供方,需要应用层配合 |
| 3 | 双向启用 | 同时承担两种角色时使用 |
只改内核参数不代表生效:客户端要主动请求 TFO,服务端要能读取 SYN 携带的数据,链路上的中间设备还不能丢弃带数据的 SYN。三者缺一,实际都没有收益。判断依据是计数指标是否有增量。
中间设备对带数据的 SYN 处理不一致是这项技术推广慢的主要原因。如果启用后出现零星的建连失败而抓包看不到明显异常,可以临时关闭做对照,确认是否由 TFO 引起。