Skip to content

3.1. 首部格式

TCP 报文段以互联网数据报的形式发送。IP 首部携带若干信息字段,包括源主机地址和目的主机地址(参见 RFC 791RFC 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 bitTCP 首部所包含的 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 注册表管理。当前已分配的控制位为 CWRECEURGACKPSHRSTSYNFIN

标志长度含义
CWR1 bitCongestion Window Reduced,拥塞窗口减小(参见 RFC 3168)。
ECE1 bitECN-Echo,ECN 回显(参见 RFC 3168)。
URG1 bit紧急指针字段有效。
ACK1 bit确认字段有效。
PSH1 bit推送功能(参见发送调用)。
RST1 bit复位连接。
SYN1 bit同步序列号。
FIN1 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 的整数倍。所有选项都计入校验和。选项可起始于任意八位组边界。选项的格式有两种:

  1. 仅含一个选项类型八位组。
  2. 包含一个选项类型八位组(Kind)、一个选项长度八位组,以及实际的选项数据八位组。

选项长度将选项类型八位组、选项长度八位组本身以及选项数据八位组一并计入。

选项列表可能短于数据偏移字段所指示的长度。选项列表结束选项之后的首部内容必须是值为零的首部填充(MUST-69)。

当前定义的所有选项由 IANA 管理,每个选项均在相应的 RFC 中定义。该集合还包括实验性选项,可扩展以支持多个并发用途(参见 RFC 6994)。

TCP 实现可以支持当前已定义的任何选项,但必须支持下列选项(MUST-4;对最大报文段大小选项的支持也是第 3.7.1 节MUST-14 的要求):

KindLength含义
0选项列表结束(End of Option List,EOL)。
1无操作(No-Operation,NOP)。
24最大报文段大小(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

Licensed under CC BY-NC-SA 4.0.