TCP协议栈通过多种定时器机制确保可靠传输、流量控制和连接管理。以下是TCP协议栈中核心的定时器分类及其作用(基于RFC标准及主流实现):
一、连接建立阶段
- 连接建立定时器
在发送SYN报文建立新连接时启动,若75秒内未收到响应则中止连接。此定时器防止因网络丢包导致客户端无限等待SYN-ACK响应。 - SYN-ACK定时器
用于监听状态的服务器,发送SYN-ACK后启动。若未收到客户端的ACK,触发重传并最终关闭连接。
二、数据传输阶段
- 重传定时器(Retransmission Timer)
• 功能:确保数据段或ACK丢失时触发重传。每个发送的数据段启动独立的定时器,超时后指数退避重传(如1s, 3s, 6s等)。 • 动态计算:基于往返时间(RTT)和其平滑估计值(SRTT)动态调整超时时间(RTO)。 • Karn算法:重传时不更新RTT估计,避免混淆原始包和重传包的ACK。 - 延迟ACK定时器(Delayed ACK Timer)
• 作用:减少ACK报文数量,通过捎带机制将ACK与数据合并发送。默认延迟200ms,超时后立即发送ACK。 • 优化场景:适用于批量数据传输,降低网络负载。 - 坚持定时器(Persistent Timer)
• 触发条件:接收方通告零窗口时启动,防止死锁(如窗口更新ACK丢失)。 • 机制:周期性发送1字节探测包,采用指数退避策略(如1.5s, 3s, 6s)。
三、连接维护阶段
- 保活定时器(Keepalive Timer)
• 功能:检测空闲连接是否存活。默认每2小时发送探测包,若连续多次未响应则关闭连接。 • 争议性:可能误判短暂网络故障,需手动启用(通过SO_KEEPALIVE
选项)。
四、连接终止阶段
- FIN_WAIT_2定时器
主动关闭方进入FIN_WAIT_2状态后启动,若超时(默认10分钟)未收到FIN则强制关闭连接。 - TIME_WAIT定时器(2MSL Timer)
• 作用:确保最后一个ACK到达,并等待网络中旧报文段消亡。定时器设为2倍最大报文段生存时间(MSL),通常为60秒。 • 意义:防止新连接接收旧连接的延迟报文,避免数据混淆。
五、其他特殊定时器
- 零窗口探测定时器
与坚持定时器协同工作,专用于处理接收方窗口为0的场景,确保发送方能及时恢复数据传输。 - 快速重传与恢复机制
非严格定时器,但依赖重复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协议栈源码分析。