3. Functional Specification (功能规范)
本章描述了 TCP 的功能规范, 包括头部格式, 选项定义, 序列号管理, 连接管理和数据传输机制.
3.1. Header Format (头部格式)
TCP 段作为互联网数据报发送. IP 头部携带多个信息字段, 包括源和目标主机地址. TCP 头部跟随 IP 头部, 提供特定于 TCP 的信息.
TCP 头部结构
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |C|E|U|A|P|R|S|F| |
| Offset| Rsrvd |W|C|R|C|S|S|Y|I| Window |
| | |R|E|G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| [Options] |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
/ Data /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段说明
Source Port (源端口): 16 位
- 源端口号
Destination Port (目标端口): 16 位
- 目标端口号
Sequence Number (序列号): 32 位
- 本段中第一个数据八位字节的序列号 (除非设置了 SYN 标志)
- 如果设置了 SYN, 序列号是初始序列号 (ISN), 第一个数据八位字节是 ISN+1
Acknowledgment Number (确认号): 32 位
- 如果设置了 ACK 控制位, 此字段包含段发送方期望接收的下一个序列号的值
- 一旦建立连接, 此字段始终被发送
Data Offset (数据偏移): 4 位
- TCP 头部中 32 位字的数量
- 指示数据从何处开始
- TCP 头部 (即使包含选项) 长度是 32 位的整数倍
Reserved (保留): 4 位
- 保留供将来使用的控制位集
- 在生成的段中必须为零
- 如果发送或接收主机未实现相应的未来功能, 则在接收的段中必须忽略
Control Bits (控制位): 控制位也称为"标志". 分配由 IANA 从"TCP Header Flags"注册表管理. 当前分配的控制位是 CWR, ECE, URG, ACK, PSH, RST, SYN 和 FIN.
-
CWR (Congestion Window Reduced, 拥塞窗口减少): 1 位
- 参见 RFC 3168
-
ECE (ECN-Echo, ECN 回显): 1 位
- 参见 RFC 3168
-
URG (Urgent, 紧急): 1 位
- 紧急指针字段有效
-
ACK (Acknowledgment, 确认): 1 位
- 确认字段有效
-
PSH (Push, 推送): 1 位
- 推送功能
-
RST (Reset, 重置): 1 位
- 重置连接
-
SYN (Synchronize, 同步): 1 位
- 同步序列号
-
FIN (Finish, 结束): 1 位
- 发送方不再有数据
Window (窗口): 16 位
- 从确认字段中指示的序列号开始, 本段发送方愿意接受的数据八位字节数
- 当使用窗口缩放扩展时, 该值会被移位
- 窗口大小必须 (MUST-1) 被视为无符号数, 否则大窗口将显示为负窗口, TCP 将无法工作
Checksum (校验和): 16 位
- 头部和文本中所有 16 位字的补码和的 16 位补码
- TCP 校验和永远不是可选的
- 发送方必须 (MUST-2) 生成它, 接收方必须 (MUST-3) 检查它
Urgent Pointer (紧急指针): 16 位
- 将紧急指针的当前值作为本段中序列号的正偏移量进行通信
- 紧急指针指向紧急数据后面的八位字节的序列号
- 仅在设置了 URG 控制位的段中解释此字段
Options (选项): 可变长度
- 选项可以占据 TCP 头部末尾的空间, 长度为 8 位的倍数
- 所有选项都包含在校验和中
注意: 本章内容非常庞大. 完整的功能规范包括选项定义, 术语概述, 序列号管理, 连接建立, 连接关闭, 分段, 数据通信, 接口和事件处理等详细内容. 请参阅 RFC 9293 官方文档的完整第 3 章内容.
3.2. 强制选项
TCP 实现必须 (MUST-4) 支持以下选项:
| Kind | Length | 含义 |
|---|---|---|
| 0 | - | End of Option List (选项列表结束) |
| 1 | - | No-Operation (无操作) |
| 2 | 4 | Maximum Segment Size (最大段大小) |
3.3. 连接状态
TCP 连接在其生命周期中经历一系列状态:
- CLOSED - 表示无连接的虚构状态
- LISTEN - 等待来自任何远程 TCP 和端口的连接请求
- SYN-SENT - 发送连接请求后等待匹配的连接请求
- SYN-RECEIVED - 接收并发送连接请求后等待确认连接请求的确认
- ESTABLISHED - 表示开放连接, 可以将接收的数据传递给用户
- FIN-WAIT-1 - 等待来自远程 TCP 的连接终止请求或先前发送的终止请求的确认
- FIN-WAIT-2 - 等待来自远程 TCP 的连接终止请求
- CLOSE-WAIT - 等待来自本地用户的连接终止请求
- CLOSING - 等待来自远程 TCP 的连接终止请求确认
- LAST-ACK - 等待先前发送给远程 TCP 的终止请求的确认
- TIME-WAIT - 等待足够的时间以确保远程 TCP 收到其终止请求的确认
完整的第 3 章内容请参阅 RFC 9293 官方文档, 包含详细的:
- 选项定义和处理
- 序列号机制
- 连接建立的三次握手
- 连接关闭的四次挥手
- 数据分段和重组
- 流量控制和拥塞控制
- 重传机制
- 用户接口规范
- 事件处理逻辑