卷2 第25章 TCP的定时器
25.1 引言
TCP为每条连接维护7个定时器:
- 连接建立:75秒
- 重传:动态计算
- 延迟ACK:200ms
- 持续:5-60秒
- 保活:2小时
- FIN_WAIT_2:10分钟
- TIME_WAIT/2MSL:60秒
25.2 代码介绍
netinet/tcp_timer.h:定时器定义netinet/tcp_timer.c:定时器实现
定时器数组索引
| 索引 | 定时器 |
|---|---|
| TCPT_REXMT | 重传 |
| TCPT_PERSIST | 持续 |
| TCPT_KEEP | 保活/连接建立 |
| TCPT_2MSL | 2MSL/FIN_WAIT_2 |
25.3 tcp_canceltimers函数
- 清除所有定时器
25.4 tcp_fasttimo函数
- 每200ms调用
- 处理延迟ACK
25.5 tcp_slowtimo函数
- 每500ms调用
- 递减所有定时器
- 递增ISS(128000/秒)
- 递增时间戳(tcp_now)
25.6 tcp_timers函数
2MSL/FIN_WAIT_2定时器
- TIME_WAIT:60秒后关闭
- FIN_WAIT_2:10分钟+75秒后关闭
持续定时器
- 强制发送窗口探查
- 指数退避(5-60秒)
保活/连接建立定时器
- 连接建立:75秒超时
- 保活:2小时空闲后探测
25.7 重传定时器的计算
RTT测量公式
Err = M - A A ← A + g × Err D ← D + h × (|Err| - D) RTO = A + 4 × D
text
- g = 1/8,h = 1/4
Karn算法
- 重传后不更新RTT估计器
25.8 tcp_newtcpcb算法
初始化
- t_srtt = 0
- t_rttvar = 3秒 × 4
- t_rxtcur = 6秒
- cwnd = 1
25.9 tcp_setpersist函数
- 计算持续定时器值
- 指数退避
25.10 tcp_xmit_timer函数
- 更新RTT估计器
- 计算RTO
25.11 重传超时处理
处理流程
- 递增移位计数器
- 检查是否放弃
- 计算新RTO
- 慢启动和拥塞避免
- 重传数据
25.12 一个RTT的例子
详细跟踪了RTT计算过程。
25.13 小结
TCP使用多个定时器管理连接状态。RTT估计和拥塞控制是关键。