TCP协议栈中的定时器总结

TCP协议栈通过多种定时器机制确保可靠传输、流量控制和连接管理。以下是TCP协议栈中核心的定时器分类及其作用(基于RFC标准及主流实现):


一、连接建立阶段

  1. 连接建立定时器
    在发送SYN报文建立新连接时启动,若75秒内未收到响应则中止连接。此定时器防止因网络丢包导致客户端无限等待SYN-ACK响应。
  2. SYN-ACK定时器
    用于监听状态的服务器,发送SYN-ACK后启动。若未收到客户端的ACK,触发重传并最终关闭连接。

二、数据传输阶段

  1. 重传定时器(Retransmission Timer)
    • 功能:确保数据段或ACK丢失时触发重传。每个发送的数据段启动独立的定时器,超时后指数退避重传(如1s, 3s, 6s等)。 • 动态计算:基于往返时间(RTT)和其平滑估计值(SRTT)动态调整超时时间(RTO)。 • Karn算法:重传时不更新RTT估计,避免混淆原始包和重传包的ACK。
  2. 延迟ACK定时器(Delayed ACK Timer)
    • 作用:减少ACK报文数量,通过捎带机制将ACK与数据合并发送。默认延迟200ms,超时后立即发送ACK。 • 优化场景:适用于批量数据传输,降低网络负载。
  3. 坚持定时器(Persistent Timer)
    • 触发条件:接收方通告零窗口时启动,防止死锁(如窗口更新ACK丢失)。 • 机制:周期性发送1字节探测包,采用指数退避策略(如1.5s, 3s, 6s)。

三、连接维护阶段

  1. 保活定时器(Keepalive Timer)
    • 功能:检测空闲连接是否存活。默认每2小时发送探测包,若连续多次未响应则关闭连接。 • 争议性:可能误判短暂网络故障,需手动启用(通过SO_KEEPALIVE选项)。

四、连接终止阶段

  1. FIN_WAIT_2定时器
    主动关闭方进入FIN_WAIT_2状态后启动,若超时(默认10分钟)未收到FIN则强制关闭连接。
  2. TIME_WAIT定时器(2MSL Timer)
    • 作用:确保最后一个ACK到达,并等待网络中旧报文段消亡。定时器设为2倍最大报文段生存时间(MSL),通常为60秒。 • 意义:防止新连接接收旧连接的延迟报文,避免数据混淆。

五、其他特殊定时器

  1. 零窗口探测定时器
    与坚持定时器协同工作,专用于处理接收方窗口为0的场景,确保发送方能及时恢复数据传输。
  2. 快速重传与恢复机制
    非严格定时器,但依赖重复ACK计数(如收到3次重复ACK立即触发重传,无需等待超时)。

总结对比

定时器类型触发场景核心算法/策略典型超时值
重传定时器数据段未及时确认指数退避 + Karn算法动态计算(如1s, 3s…)
坚持定时器接收方窗口为0指数退避探测初始1.5s,最大60s
保活定时器连接长时间空闲固定间隔探测2小时探测 + 75s超时
TIME_WAIT定时器主动关闭后的等待状态2MSL等待60秒(2×30秒MSL)

扩展知识

  • 糊涂窗口综合症:由小窗口通告引发,通过坚持定时器和延迟ACK机制缓解。
  • 拥塞控制算法:如慢启动、拥塞避免与快速恢复,虽非定时器,但依赖RTT动态调整窗口。

如需深入某个定时器的实现细节(如Linux内核中的tcp_retransmit_timer()),可参考TCP/IP协议栈源码分析。

此条目发表在linux文章, 高性能网络分类目录,贴了, , , , , , 标签。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注