本文目录导读:

net.ipv4.tcp_syn_retries 是 Linux 内核中控制 TCP 三次握手中 SYN 报文重传次数的核心参数,它决定了客户端(或主动发起连接的一端)在发送初始 SYN 后,如果没有收到 SYN-ACK,会重试多少次才放弃连接。
核心机制
- 初始发送:发送第一个 SYN。
- 超时重传:等待一段时间(初始 RTO,通常为 1 秒),未收到 SYN-ACK 则重传。
- 指数退避:每次重传的超时时间都会翻倍。
- 最大重试次数:
net.ipv4.tcp_syn_retries指定这个重试次数。 - 放弃:达到最大重试次数后,内核向应用层返回
ETIMEDOUT或ECONNREFUSED错误。
示例说明
默认值:net.ipv4.tcp_syn_retries = 6
-
重传顺序:
- 第 1 个 SYN(初始)
- 等待 1 秒 → 重传(第 1 次)
- 等待 2 秒 → 重传(第 2 次)
- 等待 4 秒 → 重传(第 3 次)
- 等待 8 秒 → 重传(第 4 次)
- 等待 16 秒 → 重传(第 5 次)
- 等待 32 秒 → 重传(第 6 次)
- 等待 64 秒 → 放弃连接,返回错误。
-
总耗时:约 1 + 2 + 4 + 8 + 16 + 32 + 64 = 127 秒(约 2 分钟)。
更小的值,net.ipv4.tcp_syn_retries = 2:
- 总耗时:约 1 + 2 + 4 = 7 秒。
影响因素与细节
- 初始 RTO(Retransmission Timeout):初始超时通常是 1 秒,但可能会受
tcp_rto_min和tcp_base_rto_jiffies影响,在较新内核中,初始值可能基于内核的时钟粒度(通常是 200ms 的倍数),但实际行为仍大致遵循上述指数退避(初始 1s,翻倍)。 tcp_syn_retries的语义:该参数是重试次数,不是总尝试次数,因此总尝试次数 =tcp_syn_retries+ 1(初始 SYN),内核源码中,当sysctl_tcp_syn_retries设为 0 时,仍会发送一个 SYN,然后立即放弃。- 与
tcp_synack_retries的区别:tcp_syn_retries:控制主动连接方(客户端)的 SYN 重传。tcp_synack_retries:控制被动连接方(服务器)在收到 SYN 后,回复 SYN-ACK 的重传次数。
- 内核版本差异:在非常老的 2.6 内核中,RTO 的计算方式略有不同,但现代内核(4.x、5.x、6.x)基本遵循上述规则。
配置与查看
# 查看当前值 sysctl net.ipv4.tcp_syn_retries # 临时修改(立即生效,重启后失效) sudo sysctl -w net.ipv4.tcp_syn_retries=3 # 永久修改(某些系统) # 编辑 /etc/sysctl.conf 或 /etc/sysctl.d/99-sysctl.conf # 添加:net.ipv4.tcp_syn_retries=3 # 然后执行:sudo sysctl -p
典型应用场景
- 快速失败(Fast Fail):在移动端(Android、iOS)或微服务架构中,希望快速感知对端不可达,可将
tcp_syn_retries设为 2 或 3,一个 HTTP 客户端如果 7~15 秒无法建立连接,就应该放弃并切换服务器(或降级),而不是等待 2 分钟。 - 高延迟链路:如果网络 RTT 较高(如卫星链路),可能需要增加重试次数或依赖应用层超时,但通常不建议单纯依赖增加
tcp_syn_retries,因为指数退避会让后续重试间隔很快变得很大(32秒、64秒),对高延迟链路收效甚微,更适合使用应用层 heartbeat 或专门的链路探测协议。 - 负载均衡与 NAT:NAT 设备、防火墙或负载均衡器上的连接跟踪表(conntrack)有超时。
tcp_syn_retries过大,客户端可能还在重试,但中间设备已将连接跟踪条目删除,后续的 SYN 可能被设备视为新连接处理,导致混乱,适当减少tcp_syn_retries有助于减少此类问题。 - SYN Flood 攻击:服务器收到大量虚假 SYN 时,不会响应 SYN-ACK,客户端的
tcp_syn_retries会导致其多次重试,浪费资源,合理设置该值可以减轻客户端自身压力,但不直接防御攻击。
- 重试次数 =
tcp_syn_retries,超时时间按1s, 2s, 4s, ...指数递增。 - 默认 6 次(约 127 秒),适合大多数局域网或稳定的互联网连接。
- 对于需要快速响应的应用(如 Web 服务、RPC 框架、移动端),建议调低到 2~5(对应 7~63 秒)。
- 不要与
tcp_synack_retries(服务器端 SYN-ACK 重传)混淆。
标签: 内核参数
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。