卷2 第29章 TCP的输入(续)
29.1 引言
继续分析tcp_input函数,处理ACK、窗口更新、紧急数据和FIN。
29.2 ACK处理概述
- 完成被动打开
- 快速重传/恢复
- 更新窗口
- 删除确认数据
- 状态变迁
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 更新窗口信息
窗口更新条件
- 新数据到达
- 确认新数据
- 窗口增大
29.7 紧急方式处理
- URG标志和紧急指针
- 更新rcv_up
- 通知应用进程
29.8 tcp_pulloutofband函数
- 从数据流提取带外字节
- 存储在t_iobc
29.9 处理已接收的数据
- TCP_REASS宏处理数据
- 猜测对端发送缓存大小
29.10 FIN处理
状态转移
| 当前状态 | 新状态 |
|---|---|
| SYN_RCVD | CLOSE_WAIT |
| ESTABLISHED | CLOSE_WAIT |
| FIN_WAIT_1 | CLOSING |
| FIN_WAIT_2 | TIME_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输入的核心。