本文目录导读:

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 重传)混淆。
标签: 内核参数
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播