卷2 第26章 TCP输出

26.1 引言

tcp_output函数负责发送报文段。

调用场景

  1. 用户写数据(PRU_SEND)
  2. 延迟ACK定时器超时
  3. 重传定时器超时
  4. 持续定时器超时
  5. 收到ACK后需要发送

26.2 tcp_output概述

处理框架

  1. 检查是否等待ACK
  2. 返回慢启动(如果空闲)
  3. 决定是否发送

26.3 决定是否发送

条件

  1. 强制发送(t_force)
  2. 满长度报文段
  3. Nagle算法允许
  4. 窗口足够大

糊涂窗口避免

  • 发送方避免小窗口

26.4 TCP选项

支持选项

选项说明
0EOL
1NOP
2MSS
3窗口缩放
8时间戳

26.5 窗口大小选项

  • 在SYN中协商
  • 移位计数器(0-14)
  • 最大窗口:1GB

26.6 时间戳选项

格式

+--------+--------+--------+--------+ | type=8 | len=10 | 时间戳值 | +--------+--------+--------+--------+ | 时间戳回显应答 | +--------+--------+--------+--------+

text

PAWS保护

  • 防止序号回绕

26.7 发送一个报文段

构造选项

  1. MSS选项(SYN时)
  2. 窗口缩放选项(SYN时)
  3. 时间戳选项

填充首部

  • 序号、确认号
  • 标志、窗口
  • 紧急指针
  • 检验和

启动重传定时器

  • 数据报文段计时
  • 更新snd_max

26.8 tcp_template函数

  • 创建IP/TCP首部模板
  • 减少输出开销

26.9 tcp_respond函数

  • 发送RST报文段
  • 发送保活探测

26.10 小结

tcp_output决定何时发送和发送什么内容。选项协商在SYN中完成。