本文目录导读:

net.ipv4.tcp_synack_retries 这个内核参数并不是控制 SYN-ACK 包的重传次数的参数。
这是一个非常常见的误解,控制 SYN-ACK 重传次数的参数是 net.ipv4.tcp_synack_retries。
让我为你澄清这两个关键参数的区别以及 tcp_synack_retries 的具体工作机制:
核心概念澄清
| 参数名称 | 控制位置 | |
|---|---|---|
net.ipv4.tcp_syn_retries |
客户端 (主动发起连接方) | 控制 SYN 包的重传次数 |
net.ipv4.tcp_synack_retries |
服务端 (被动接收连接方) | 控制 SYN-ACK 包的重传次数 |
tcp_synack_retries 的工作原理
这个参数决定了服务端发送 SYN-ACK 后,如果没有收到客户端的 ACK(即三次握手的第三步),服务端会重传 SYN-ACK 多少次。
详细流程:
- 服务端收到客户端的 SYN
- 服务端回复 SYN-ACK
- 服务端启动一个定时器,等待客户端的 ACK
- 如果没有收到 ACK,服务端会重传 SYN-ACK
- 重传次数达到
tcp_synack_retries配置的值后,服务端放弃重传,从半连接队列(SYN Queue)中移除该连接条目
重传间隔(指数退避)
- 第一次重传:1秒后
- 第二次重传:2秒后
- 第三次重传:4秒后
- 第四次重传:8秒后
- 总等待时间 ≈ $(2^{retries} - 1)$ 秒
默认值 5:
- 总时间 ≈ 1 + 2 + 4 + 8 + 16 = 31秒
- 第一个 SYN-ACK 发送后的最后一次重传发生在约31秒时
- 再等待一个 RTO(约24秒),客户端才最终连接失败
默认值
- Linux 默认值:
5 - 范围:0 到 255
与 tcp_syn_retries 的对比
| 特性 | tcp_syn_retries |
tcp_synack_retries |
|---|---|---|
| 角色 | 客户端 | 服务端 |
| 重传对象 | SYN | SYN-ACK |
| 触发条件 | 未收到 SYN-ACK | 未收到 ACK |
| 默认值 | 6 | 5 |
实际应用建议
高延迟/不稳定网络环境
# 增加重试次数,提高连接成功率 echo 10 > /proc/sys/net/ipv4/tcp_synack_retries
防止 SYN Flood 攻击
# 降低重试次数,快速释放半连接资源 echo 2 > /proc/sys/net/ipv4/tcp_synack_retries
与 SYN Cookies 配合
当系统开启 SYN Cookies(net.ipv4.tcp_syncookies = 1)时,tcp_synack_retries 的效果会受到一定影响,因为 SYN Cookie 机制会改变正常的半连接管理方式。
常见误区
谬误:
tcp_synack_retries控制的是服务端发送 SYN 的重试次数。
事实:服务端从来不发送 SYN(除非是主动连接其他服务端),服务端发送的是 SYN-ACK。
结论是:net.ipv4.tcp_synack_retries 就是直接控制 SYN-ACK 重传次数的参数,不是 tcp_syn_retries。
标签: SYNACK