卷2 第26章 TCP输出
26.1 引言
tcp_output函数负责发送报文段。
调用场景
- 用户写数据(PRU_SEND)
- 延迟ACK定时器超时
- 重传定时器超时
- 持续定时器超时
- 收到ACK后需要发送
26.2 tcp_output概述
处理框架
- 检查是否等待ACK
- 返回慢启动(如果空闲)
- 决定是否发送
26.3 决定是否发送
条件
- 强制发送(t_force)
- 满长度报文段
- Nagle算法允许
- 窗口足够大
糊涂窗口避免
- 发送方避免小窗口
26.4 TCP选项
支持选项
| 选项 | 说明 |
|---|---|
| 0 | EOL |
| 1 | NOP |
| 2 | MSS |
| 3 | 窗口缩放 |
| 8 | 时间戳 |
26.5 窗口大小选项
- 在SYN中协商
- 移位计数器(0-14)
- 最大窗口:1GB
26.6 时间戳选项
格式
+--------+--------+--------+--------+ | type=8 | len=10 | 时间戳值 | +--------+--------+--------+--------+ | 时间戳回显应答 | +--------+--------+--------+--------+
text
PAWS保护
- 防止序号回绕
26.7 发送一个报文段
构造选项
- MSS选项(SYN时)
- 窗口缩放选项(SYN时)
- 时间戳选项
填充首部
- 序号、确认号
- 标志、窗口
- 紧急指针
- 检验和
启动重传定时器
- 数据报文段计时
- 更新snd_max
26.8 tcp_template函数
- 创建IP/TCP首部模板
- 减少输出开销
26.9 tcp_respond函数
- 发送RST报文段
- 发送保活探测
26.10 小结
tcp_output决定何时发送和发送什么内容。选项协商在SYN中完成。