卷2 第28章 TCP的输入

28.1 引言

tcp_input是最大的函数(约1100行)。

28.2 预处理

验证步骤

  1. 验证检验和
  2. 验证首部长度
  3. 处理TCP选项
  4. 查找Internet PCB

首部预测

  • 快速路径
  • 处理正常情况

28.3 tcp_dooptions函数

  • 处理EOL、NOP
  • MSS选项(仅SYN)
  • 窗口缩放选项(仅SYN)
  • 时间戳选项

28.4 首部预测

发送方预测

  1. 纯ACK测试
  2. 更新RTT
  3. 从发送缓存删除
  4. 重启定时器

接收方预测

  1. 顺序数据测试
  2. 更新接收窗口
  3. 提交数据

28.5 TCP输入:缓慢的执行路径

  • 首部预测失败时执行
  • 丢弃IP/TCP首部

28.6 完成被动打开或主动打开

被动打开(LISTEN)

  1. 检查SYN
  2. 分配PCB
  3. 设置本地地址
  4. 处理选项
  5. 初始化序号
  6. 发送SYN+ACK

主动打开(SYN_SENT)

  1. 验证ACK
  2. 处理RST
  3. 处理SYN
  4. 建立连接

28.7 PAWS:防止序号回绕

  • 使用时间戳
  • 丢弃旧报文段
  • 24天空闲后过期

28.8 裁剪报文段

  • 删除重复数据
  • 截断窗口外数据

28.9 自连接和同时打开

  • 自连接由代码特殊处理
  • 同时打开支持

28.10 记录时间戳

  • 更新ts_recent

28.11 RST处理

  • SYN_RCVD → ECONNREFUSED
  • ESTABLISHED → ECONNRESET

28.12 小结

tcp_input验证报文段、处理选项、执行首部预测和分用。