Appearance
3.1. 首部格式
TCP 报文段以互联网数据报的形式发送。IP 首部携带若干信息字段,包括源主机地址和目的主机地址(参见 RFC 791 和 RFC 8200)。TCP 首部紧随 IP 首部之后,提供 TCP 特有的信息。这种分层设计使得 TCP 之外的其他主机级协议得以存在。在互联网协议族的早期开发阶段,IP 首部字段曾是 TCP 的一部分。
本文描述的 TCP 使用 TCP 首部。
TCP 首部之后可以跟随报文段中的用户数据,其格式如下所示。本图采用增强型 ASCII 报文首部图的图示风格,图中每个刻度线代表一个比特位置。
text
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 :
: |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+图 1:TCP 首部格式。
TCP 首部由下列字段组成:
| 字段 | 长度 | 含义 |
|---|---|---|
| Source Port(源端口) | 16 bit | 源端口号。 |
| Destination Port(目的端口) | 16 bit | 目的端口号。 |
| Sequence Number(序列号) | 32 bit | 本报文段中第一个数据八位组的序列号(设置 SYN 时例外)。若设置了 SYN,则该字段为初始序列号(ISN),第一个数据八位组的序列号为 ISN+1。 |
| Acknowledgment Number(确认号) | 32 bit | 若设置了 ACK 控制位,则该字段包含本报文段发送方期望接收的下一个序列号。连接一旦建立,便总是发送该字段。 |
| Data Offset(数据偏移,DOffset) | 4 bit | TCP 首部所包含的 32 位字的个数,用于指示数据的起始位置。TCP 首部的长度(即使包含选项)必须是 32 位的整数倍。 |
| Reserved(保留,Rsrvd) | 4 bit | 保留供未来使用的一组控制位。在生成的报文段中,这些位必须为零;若发送方或接收方未实现相应的未来特性,在收到的报文段中也必须忽略这些位。 |
| Window(窗口) | 16 bit | 本报文段发送方愿意接收的数据八位组数量,自确认字段所指示的序列号起算。使用窗口缩放扩展时,该值会经过移位。 |
| Checksum(校验和) | 16 bit | 首部与正文中所有 16 位字的反码和的 16 位反码。 |
| Urgent Pointer(紧急指针) | 16 bit | 紧急指针的当前值,表示为相对于本报文段序列号的正偏移量;紧急指针指向紧急数据之后那个八位组的序列号。仅当报文段设置了 URG 控制位时才解释此字段。 |
| Options(选项) | 可变 | TCP 选项及其尾部填充,仅当 DOffset > 5 时存在。 |
| Data(数据) | 可变 | TCP 报文段携带的用户数据。 |
控制位
控制位也称为“标志”,其分配由 IANA 的 TCP Header Flags 注册表管理。当前已分配的控制位为 CWR、ECE、URG、ACK、PSH、RST、SYN 和 FIN。
| 标志 | 长度 | 含义 |
|---|---|---|
CWR | 1 bit | Congestion Window Reduced,拥塞窗口减小(参见 RFC 3168)。 |
ECE | 1 bit | ECN-Echo,ECN 回显(参见 RFC 3168)。 |
URG | 1 bit | 紧急指针字段有效。 |
ACK | 1 bit | 确认字段有效。 |
PSH | 1 bit | 推送功能(参见发送调用)。 |
RST | 1 bit | 复位连接。 |
SYN | 1 bit | 同步序列号。 |
FIN | 1 bit | 发送方没有更多数据。 |
窗口大小必须按无符号数处理,否则较大的窗口会表现为负窗口,TCP 将无法工作(MUST-1)。建议实现为连接记录中的发送窗口和接收窗口大小预留 32 位字段,并以 32 位完成所有窗口计算(REC-1)。
校验和与伪首部
校验和字段是对首部和正文中所有 16 位字求反码和后,再取该和的 16 位反码所得到的值。计算校验和时,必须保证参与求和的数据按 16 位对齐。如果首部和正文包含奇数个八位组,可以在最后一个八位组右侧补零,构成用于校验和计算的 16 位字;补入的字节不作为报文段的一部分发送。计算校验和时,校验和字段本身以零代入。
校验和还覆盖一个概念上置于 TCP 首部之前的伪首部(图 2)。IPv4 伪首部为 96 位,IPv6 伪首部为 320 位。将伪首部纳入校验和,可使 TCP 连接免受误路由报文段的影响。这些信息携带在 IP 首部中,并作为 TCP 实现对 IP 层调用的参数或返回结果,经 TCP/网络接口传递。
text
+--------+--------+--------+--------+
| Source Address |
+--------+--------+--------+--------+
| Destination Address |
+--------+--------+--------+--------+
| zero | PTCL | TCP Length |
+--------+--------+--------+--------+图 2:IPv4 TCP 伪首部。
IPv4 伪首部包含:
- Source Address(源地址): 网络字节序的 IPv4 源地址。
- Destination Address(目的地址): 网络字节序的 IPv4 目的地址。
- zero: 设置为零的比特。
- PTCL: IP 首部中的协议号。
- TCP Length(TCP 长度): TCP 首部长度与数据长度之和(以八位组为单位);该量并非显式发送,而是计算得出,且不计入伪首部自身的 12 个八位组。
对于 IPv6,伪首部在 RFC 8200 第 8.1 节中定义,包含 IPv6 源地址和目的地址、上层分组长度(32 位,其含义与 IPv4 伪首部中的 TCP Length 相同)、三个字节的零填充,以及 Next Header 值。如果 IPv6 与 TCP 之间存在扩展首部,Next Header 值可能与 IPv6 首部中的值不同。
TCP 校验和绝不能省略。发送方必须生成校验和(MUST-2),接收方必须检查校验和(MUST-3)。
选项
选项可占用 TCP 首部末尾的空间,长度为 8 bit 的整数倍。所有选项都计入校验和。选项可起始于任意八位组边界。选项的格式有两种:
- 仅含一个选项类型八位组。
- 包含一个选项类型八位组(
Kind)、一个选项长度八位组,以及实际的选项数据八位组。
选项长度将选项类型八位组、选项长度八位组本身以及选项数据八位组一并计入。
选项列表可能短于数据偏移字段所指示的长度。选项列表结束选项之后的首部内容必须是值为零的首部填充(MUST-69)。
当前定义的所有选项由 IANA 管理,每个选项均在相应的 RFC 中定义。该集合还包括实验性选项,可扩展以支持多个并发用途(参见 RFC 6994)。
TCP 实现可以支持当前已定义的任何选项,但必须支持下列选项(MUST-4;对最大报文段大小选项的支持也是第 3.7.1 节中 MUST-14 的要求):
| Kind | Length | 含义 |
|---|---|---|
| 0 | — | 选项列表结束(End of Option List,EOL)。 |
| 1 | — | 无操作(No-Operation,NOP)。 |
| 2 | 4 | 最大报文段大小(Maximum Segment Size,MSS)。 |
表 1:必需选项集合。
TCP 实现必须能够在任何报文段中接收 TCP 选项(MUST-5)。
TCP 实现必须无差错地忽略任何自身未实现的 TCP 选项,前提是该选项带有长度字段(MUST-6)。除选项列表结束(EOL)和无操作(NOP)外,所有 TCP 选项都必须带有长度字段,未来的所有选项亦然(MUST-68)。TCP 实现必须做好处理非法选项长度(例如零)的准备;一种建议的做法是复位连接并记录错误原因(MUST-7)。
选项空间扩展
目前仍在开展扩展 TCP 选项可用空间的工作,例如 TCP Extended Data Offset Option。