linux tcp重传超时策略由多定时器协同实现,核心是重传定时器(icsk_retransmit_timer),它在发包后启动,超时则检查状态、次数限制,重发数据并更新rto应用指数退避。

Linux TCP 协议栈依靠一套分工明确、协同工作的定时器机制保障连接可靠性,其中重传超时策略是核心环节。它不是单一计时器,而是由多个定时器按场景触发,并配合动态RTO计算、指数退避与用户约束共同作用的结果。
重传定时器:驱动数据可靠送达的主引擎
重传定时器(icsk_retransmit_timer)在每次发送新数据或SYN报文后启动,监控对应报文是否收到ACK确认。一旦超时,内核调用tcp_retransmit_timer()执行重传逻辑:
- 检查当前是否仍处于可重传状态(如未被关闭、未进入TIME-WAIT)
- 判断是否达到最大重传次数限制(由
sysctl_tcp_retries1和sysctl_tcp_retries2分阶段控制) - 调用
tcp_retransmit_skb()实际重发未确认的数据段 - 更新RTO值,应用指数退避:
icsk_rto = min(icsk_rto
RTO计算与退避策略:兼顾响应与网络友好
初始RTO并非固定值,而是基于RTT采样动态估算(Karn算法+Jacobson公式),再结合退避策略调整:
- 常规流采用指数退避,避免短时间密集重传加剧拥塞
- 薄流(thin stream,如SSH交互)启用线性退避,防止过度延迟小包传输
- 若设置
SO_USER_TIMEOUT,内核通过tcp_clamp_rto_to_user_timeout()强制截断RTO,确保不超应用层容忍上限 - 当累计重传耗时 ≥ 用户设定超时值,立即触发失败判定,不再等待下一次定时器到期
其他关键定时器协同保障连接生命周期
重传只是TCP定时器体系的一环,其余定时器在不同阶段承担不可替代角色:
-
延迟确认定时器:推迟发送ACK,合并多个数据段确认,减少小包数量;默认40ms,可通过
tcp_delack_timer_handler()控制 -
保活定时器:连接空闲超时后发送探测包,检测对端是否存活;由
tcp_keepalive_timer()驱动,参数受net.ipv4.tcp_keepalive_time等控制 - 持续定时器(Persistent Timer):接收方通告零窗口后,定期发送窗口探测报文,防止死锁
-
SYN重传定时器:三次握手中,客户端SYN未响应时独立计时,由
tcp_syn_retries(默认5次)和指数增长RTO决定总等待约63秒
内核参数调优要点:从行为到实效
实际运维中,需结合业务特征调整以下关键参数:
-
net.ipv4.tcp_retries1:RTO超时后开始快速重传前的最小重试次数(默认3),影响丢包初期响应灵敏度 -
net.ipv4.tcp_retries2:导致连接彻底中断的最大重传次数(默认15),决定长时异常下的连接寿命 -
net.ipv4.tcp_syn_retries:SYN阶段重传上限(默认5),直接影响建连失败速度 -
net.ipv4.tcp_fin_timeout:TIME-WAIT状态保持时间(默认60秒),影响端口复用效率 - 修改后需注意:部分参数仅对新建连接生效,已有连接不受影响











