卷2 第28章 TCP的输入
28.1 引言
tcp_input是最大的函数(约1100行)。
28.2 预处理
验证步骤
- 验证检验和
- 验证首部长度
- 处理TCP选项
- 查找Internet PCB
首部预测
- 快速路径
- 处理正常情况
28.3 tcp_dooptions函数
- 处理EOL、NOP
- MSS选项(仅SYN)
- 窗口缩放选项(仅SYN)
- 时间戳选项
28.4 首部预测
发送方预测
- 纯ACK测试
- 更新RTT
- 从发送缓存删除
- 重启定时器
接收方预测
- 顺序数据测试
- 更新接收窗口
- 提交数据
28.5 TCP输入:缓慢的执行路径
- 首部预测失败时执行
- 丢弃IP/TCP首部
28.6 完成被动打开或主动打开
被动打开(LISTEN)
- 检查SYN
- 分配PCB
- 设置本地地址
- 处理选项
- 初始化序号
- 发送SYN+ACK
主动打开(SYN_SENT)
- 验证ACK
- 处理RST
- 处理SYN
- 建立连接
28.7 PAWS:防止序号回绕
- 使用时间戳
- 丢弃旧报文段
- 24天空闲后过期
28.8 裁剪报文段
- 删除重复数据
- 截断窗口外数据
28.9 自连接和同时打开
- 自连接由代码特殊处理
- 同时打开支持
28.10 记录时间戳
- 更新ts_recent
28.11 RST处理
- SYN_RCVD → ECONNREFUSED
- ESTABLISHED → ECONNRESET
28.12 小结
tcp_input验证报文段、处理选项、执行首部预测和分用。