本文目录导读:

tcp_syn_retries 是 Linux 内核中用于控制 TCP 三次握手中 SYN 报文(主动发起连接) 重试次数的参数,它决定了一个 TCP 连接在首次发送 SYN 后,如果没有收到 SYN-ACK,内核会重试多少次,以及每次重试的间隔。
核心机制:指数退避 + 固定上限
- 触发条件:当客户端调用
connect()发送第一个 SYN 后,开始等待SYN-ACK,如果超时未收到,则触发重试。 - 重试间隔:采用 指数退避 算法。
- 第一次超时:1 秒(默认的初始 RTO,即
tcp_rto_min,通常为 HZ/5 = 200ms,但第一次重传通常是 1 秒,具体取决于内核实现)。 - 后续重试:每次超时时间翻倍(1s -> 2s -> 4s -> 8s ...)。
- 上限:总的重试次数由
tcp_syn_retries决定(默认值通常为 6)。
- 第一次超时:1 秒(默认的初始 RTO,即
- 总超时时间:总等待时间约为
初始超时 * (2^(retries+1) - 1)。retries=6时,总时间约 63 秒(1+2+4+8+16+32+64=127 秒理论上限,但实际上内核会限制在 60-120 秒左右,具体看内核实现和 RTO 基数)。
参数值含义
- 取值:整数,通常范围是 0 到 255。
- 默认值:在大多数 Linux 发行版上为
6。 - 推荐值:
- 对可靠性要求高(如数据库、内网服务):6,即使丢包严重,也能等待 60-120 秒,确保绝大多数情况下连接能建立。
- 对响应速度要求高(如 Web 服务器面向公网):3 或 4,7-15 秒内还没收到 SYN-ACK,大概率是对端不可达或拒绝连接(如端口未开放),继续等待无意义,此时缩短等待时间可以更快释放资源(内存、端口)并返回错误给应用层。
- 极低延迟场景(如高频交易、实时通信):1 或 2,快速失败,快速切换。
如何查看和修改
查看当前值:
sysctl net.ipv4.tcp_syn_retries # 或 cat /proc/sys/net/ipv4/tcp_syn_retries
临时修改(立即生效,重启丢失):
sysctl -w net.ipv4.tcp_syn_retries=3
永久修改(写入配置文件):
echo "net.ipv4.tcp_syn_retries = 3" >> /etc/sysctl.conf sysctl -p # 立即生效
与其他参数的对比
| 参数 | 作用 | 重试对象 | 场景 | 默认值 |
|---|---|---|---|---|
tcp_syn_retries |
主动发起连接时,SYN 的重试次数 | 客户端的 SYN | 连接建立阶段 | 6 |
tcp_synack_retries |
被动接受连接时,SYN-ACK 的重试次数 | 服务端的 SYN-ACK | 连接建立阶段 | 5 |
tcp_retries1 |
数据包重传的下限(阈值),达到后内核会提示上层 | 已建立连接后的数据包 | 连接存活阶段 | 3 |
tcp_retries2 |
数据包重传的上限,达到后放弃连接 | 已建立连接后的数据包 | 连接存活阶段 | 15 |
实际案例分析
场景:客户端尝试连接一个不存在的 IP 或端口未开放的服务。
tcp_syn_retries=6:客户端会重试 6 次(共发送 7 个 SYN 包),总耗时约 60-120 秒,connect()返回ETIMEDOUT。tcp_syn_retries=3:客户端重试 3 次(共发送 4 个 SYN 包),总耗时约 7-15 秒,然后快速返回错误。
优化建议:
- 如果你是一个 公网 Web 服务器,面向大量来自互联网的客户端请求,设置
tcp_syn_retries=3可以:- 让有问题的连接(如网络不通、客户端崩溃)更快释放操作系统资源(端口、内存)。
- 让应用层(如 Nginx)更快收到失败结果,从而处理下一个请求或记录错误。
- 如果是 内部服务(数据库、微服务 RPC),网络环境稳定可靠,建议保留默认值 6,避免因偶发的网络抖动导致连接频繁失败。
注意事项
- 仅对主动连接方:
tcp_syn_retries只影响主动调用connect()的一方(通常是客户端),对于被动监听方(服务端),SYN-ACK 的重试由tcp_synack_retries控制。 - 攻击防御:如果将
tcp_syn_retries设得过小(如 0 或 1),攻击者可以很容易地通过发送大量伪造的 SYN 包来耗尽服务端的半连接队列(SYN Flood),但这与参数本身的正规用途无关,防御 SYN Flood 主要靠tcp_syncookies等机制。 - RTO 细节:第一次重试的超时时间并不是固定的 1 秒,它取决于内核中的
tcp_rto_min和tcp_init_cwnd等参数的动态计算,但通常首次 RTO 在 1 秒左右,指数退避的基数也不是严格的 2,会略微随机化以防止全局同步。
标签: SYN重试
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播