卷2 第25章 TCP的定时器

25.1 引言

TCP为每条连接维护7个定时器:

  1. 连接建立:75秒
  2. 重传:动态计算
  3. 延迟ACK:200ms
  4. 持续:5-60秒
  5. 保活:2小时
  6. FIN_WAIT_2:10分钟
  7. TIME_WAIT/2MSL:60秒

25.2 代码介绍

  • netinet/tcp_timer.h:定时器定义
  • netinet/tcp_timer.c:定时器实现

定时器数组索引

索引定时器
TCPT_REXMT重传
TCPT_PERSIST持续
TCPT_KEEP保活/连接建立
TCPT_2MSL2MSL/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 重传超时处理

处理流程

  1. 递增移位计数器
  2. 检查是否放弃
  3. 计算新RTO
  4. 慢启动和拥塞避免
  5. 重传数据

25.12 一个RTT的例子

详细跟踪了RTT计算过程。

25.13 小结

TCP使用多个定时器管理连接状态。RTT估计和拥塞控制是关键。