卷2 第29章 TCP的输入(续)

29.1 引言

继续分析tcp_input函数,处理ACK、窗口更新、紧急数据和FIN。

29.2 ACK处理概述

  1. 完成被动打开
  2. 快速重传/恢复
  3. 更新窗口
  4. 删除确认数据
  5. 状态变迁

29.3 完成被动打开和同时打开

  • SYN_RCVD收到ACK → ESTABLISHED
  • 设置窗口缩放因子

29.4 快速重传和快速恢复

快速重传

  • 3个重复ACK触发
  • 重传丢失报文段

快速恢复

  • ssthresh = cwnd/2
  • cwnd = ssthresh + 3×MSS
  • 每个重复ACK增加1段

29.5 ACK处理

有效ACK检查

snd_una < 确认序号 ⇐ snd_max

text

更新RTT

  • 使用时间戳或计时器

更新拥塞窗口

  • 慢启动:cwnd += MSS
  • 拥塞避免:cwnd += MSS/cwnd

状态变迁

  • FIN_WAIT_1 → FIN_WAIT_2(ACK确认FIN)
  • CLOSING → TIME_WAIT
  • LAST_ACK → CLOSED
  • TIME_WAIT → 重启2MSL

29.6 更新窗口信息

窗口更新条件

  1. 新数据到达
  2. 确认新数据
  3. 窗口增大

29.7 紧急方式处理

  • URG标志和紧急指针
  • 更新rcv_up
  • 通知应用进程

29.8 tcp_pulloutofband函数

  • 从数据流提取带外字节
  • 存储在t_iobc

29.9 处理已接收的数据

  • TCP_REASS宏处理数据
  • 猜测对端发送缓存大小

29.10 FIN处理

状态转移

当前状态新状态
SYN_RCVDCLOSE_WAIT
ESTABLISHEDCLOSE_WAIT
FIN_WAIT_1CLOSING
FIN_WAIT_2TIME_WAIT

29.11 最后的处理

  • 调用tcp_trace(调试)
  • 调用tcp_output
  • 发送ACK或RST

29.12 实现求精

  • 复制+检验和合并
  • 哈希表提高PCB查找性能

29.13 首部压缩

CSLIP压缩

  • 压缩IP/TCP首部(40→3-5字节)
  • 维持16个连接状态

压缩字段

  • C:连接ID
  • I:IP标识
  • S:序号
  • A:确认号
  • W:窗口
  • U:紧急指针

特殊情况

  • *SA:序号和确认都变化
  • *S:仅序号变化

29.14 小结

ACK处理、快速重传/恢复、紧急数据和FIN处理是TCP输入的核心。