net.ipv4.tcp_syn_retries如何SYN重试

联启 网络工具 12

本文目录导读:

net.ipv4.tcp_syn_retries如何SYN重试-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 核心机制
  2. 示例说明
  3. 影响因素与细节
  4. 配置与查看
  5. 典型应用场景

net.ipv4.tcp_syn_retries 是 Linux 内核中控制 TCP 三次握手中 SYN 报文重传次数的核心参数,它决定了客户端(或主动发起连接的一端)在发送初始 SYN 后,如果没有收到 SYN-ACK,会重试多少次才放弃连接。

核心机制

  1. 初始发送:发送第一个 SYN。
  2. 超时重传:等待一段时间(初始 RTO,通常为 1 秒),未收到 SYN-ACK 则重传。
  3. 指数退避:每次重传的超时时间都会翻倍。
  4. 最大重试次数net.ipv4.tcp_syn_retries 指定这个重试次数。
  5. 放弃:达到最大重试次数后,内核向应用层返回 ETIMEDOUTECONNREFUSED 错误。

示例说明

默认值net.ipv4.tcp_syn_retries = 6

  • 重传顺序

    1. 第 1 个 SYN(初始)
    2. 等待 1 秒 → 重传(第 1 次)
    3. 等待 2 秒 → 重传(第 2 次)
    4. 等待 4 秒 → 重传(第 3 次)
    5. 等待 8 秒 → 重传(第 4 次)
    6. 等待 16 秒 → 重传(第 5 次)
    7. 等待 32 秒 → 重传(第 6 次)
    8. 等待 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_mintcp_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 重传)混淆。

标签: 内核参数

抱歉,评论功能暂时关闭!