TCP Fast Open 是什么
TCP Fast Open 允许客户端在握手第一个报文里就带上应用数据,服务端也可以在第二个报文里就带回数据,从而省掉一个往返。它靠一个由服务端签发的令牌防止被滥用:首次连接只拿令牌不带数据,之后带着令牌的连接才能提前发送。收益在短连接与新建连接场景最明显,但对中间设备的兼容性要求较高,遇到不支持的链路需要能自动回退到普通握手。
基本信息
| 作用 | 在握手中提前携带数据,节省往返 |
|---|---|
| 安全机制 | 服务端签发令牌,客户端之后携带使用 |
| 内核开关 | net.ipv4.tcp_fastopen,位掩码控制 |
| 位含义 | 1 为客户端启用,2 为服务端启用,相加即两者都开 |
| 应用层开关 | 部分服务端软件需在监听配置里显式开启 |
| 兼容性 | 中间设备不支持时需回退普通握手 |
启停与验证
启停与验证
sysctl net.ipv4.tcp_fastopen # 1 客户端 2 服务端 3 两者
ss -ti state established | head -3 # 看连接细节
curl --tcp-fastopen -s -o /dev/null -w '%{time_connect}\n' https://example.com
# 服务端软件侧需显式开启,例如 nginx 在 listen 指令上配置 fastopen 参数开关含义
| 取值 | 含义 | 适用场景 |
|---|---|---|
| 1 | 仅客户端启用 | 主动出站较多的机器 |
| 2 | 仅服务端启用 | 接收连接的服务节点 |
| 3 | 客户端与服务端都启用 | 两端自控、链路可信的环境 |
典型使用场景
- 短连接密集型服务:每次请求都新建连接,省一个往返收益明显
- 移动网络与高时延链路:往返成本更高,提前发送数据的价值更大
- 配合加密握手:让客户端问候随首个报文一起到达
- 性能专项优化:在受控链路上评估实际收益后再决定是否全量开启
- 排障:确认连接随机失败是否由中间设备丢弃带数据的握手报文引起
该机制是可选优化,不开启也能正常工作。真正需要留意的是开启之后的行为变化:中间设备丢弃带数据的握手报文时,必须能顺利回退;否则会表现为「部分客户端连接随机失败」,而两端服务本身看不出异常。评估时应先在灰度链路观察失败率再扩大范围。