Skip to main content

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) 支持以下选项:

KindLength含义
0-End of Option List (选项列表结束)
1-No-Operation (无操作)
24Maximum 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 官方文档, 包含详细的:

  • 选项定义和处理
  • 序列号机制
  • 连接建立的三次握手
  • 连接关闭的四次挥手
  • 数据分段和重组
  • 流量控制和拥塞控制
  • 重传机制
  • 用户接口规范
  • 事件处理逻辑