首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_fastopen TCP Fast Open
sysctl 内核参数72 条

net.ipv4.tcp_fastopen TCP Fast Open

允许在 SYN 报文中携带数据(TFO),省去一次往返时延;取值 1 仅客户端、2 仅服务端、3 两端(按位组合)。

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 引起。

易错点

  • 只开参数不改应用:双向都需要软件侧支持,单改内核不产生任何效果
  • 用参数值代替效果验证:计数长期为零说明实际未命中,需要按数据判断
  • 忽略中间设备丢包风险:出现零星建连失败时可临时关闭做对照
  • 在长连接场景期待收益:TFO 只在新建连接时发挥作用
  • 服务端只开方向不确认应用能力:内核接受了 SYN 数据但应用读不到,收益为零

数据来源与参考

  • Linux 内核 Documentation/networking/ip-sysctl.rst(tcp_fastopen)
  • RFC 7413(TCP Fast Open)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌