TCP报文段结构详解
字数 2493 2025-11-04 12:00:41

TCP报文段结构详解

TCP报文段是TCP协议传输数据的基本单位,理解其结构是掌握TCP工作原理的基础。一个TCP报文段分为两大块:首部(Header)和数据(Data)。数据部分是可选的,例如在建立连接的三次握手中,报文段就没有数据,但首部是必须存在的。

TCP首部的固定部分是20字节,此外还有可选的选项部分,因此首部长度是可变的,最小20字节,最大60字节。其具体结构如下图所示(通常用4字节一行来表示):

 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)                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移|  保留  |U|A|P|R|S|F|                               |        窗口大小 (Window Size)           |
| (4 bits)|(3 bits)|R|C|S|S|Y|I|           保留              |         |
|        |       |G|K|H|T|N|N|                               |         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           校验和 (Checksum)            |        紧急指针 (Urgent Pointer)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   选项 (Options, 可选,长度可变)                   |
|                                               +-+-+-+-+-+-+-+-+-+-+-+-+
|                                               |   填充 (Padding)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

下面我们逐一拆解每个字段的含义和作用。


步骤一:连接的两端——端口号(Port)

  1. 源端口号(Source Port, 16位)

    • 作用:标识发送数据包的应用程序进程。
    • 详解:可以理解为数据包从哪个“门”发出。通常,客户端程序的端口是随机分配的临时端口。
  2. 目的端口号(Destination Port, 16位)

    • 作用:标识接收数据包的应用程序进程。
    • 详解:可以理解为数据包要进入哪个“门”。服务器端知名服务使用固定端口,如HTTP是80,HTTPS是443。
    • 组合:源IP + 源端口 + 目的IP + 目的端口,这四元组唯一确定了一个TCP连接。

步骤二:保证数据有序——序列号与确认号

这是TCP实现可靠传输的核心字段。

  1. 序列号(Sequence Number, 32位)

    • 作用:标识本报文段所发送数据的第一个字节的序号。
    • 详解:TCP是面向字节流的,它为每个字节都分配一个序号。例如,假设初始序列号(ISN)为1000,如果这个报文段携带了1000个字节的数据,那么它的序列号就是1000,下一个报文段的序列号就是1000 + 1000 = 2000。
    • 意义:接收方根据序列号可以对收到的乱序数据包进行重新排序,也可以发现重复的数据包。
  2. 确认号(Acknowledgment Number, 32位)

    • 作用:期望收到对方下一个报文段的第一个数据字节的序号。同时,也表示确认号之前的所有数据都已正确接收。
    • 详解:确认号具有“累积确认”的特性。如果接收方收到的最后一个字节序号是1999,那么它发回的确认号就是2000,意思是“我已经收到了2000之前的所有数据,现在期望你从2000开始发送”。
    • 前提:只有当一个报文段的ACK标志位(见下文)为1时,确认号字段才有效。

步骤三:控制报文段本身——首部长度、标志位和窗口

这部分字段控制着报文段的行为和流量。

  1. 数据偏移(Data Offset, 4位)

    • 作用:指出TCP报文段的首部长度,即数据部分从何处开始。
    • 详解:这个字段的单位是4字节(32位字)。由于首部有可变长的选项部分,所以需要它来指明首部结束的位置。最小值是5(5 * 4字节 = 20字节,即标准首部),最大值是15(15 * 4字节 = 60字节)。
  2. 保留(Reserved, 6位)

    • 作用:保留给未来使用,必须设为0。
  3. 标志位(Flags, 6位,每位代表一个控制功能)

    • 作用:用于指示报文段的特殊性质和用途。
    • 详解
      • URG(Urgent):为1时,表示报文段中有紧急数据,应尽快传送。此时紧急指针字段有效。
      • ACK(Acknowledgment):为1时,表示确认号字段有效。建立连接后,所有报文段的ACK通常都为1。
      • PSH(Push):为1时,提示接收方应立即将数据提交给上层应用,而不是等缓冲区满了再提交。
      • RST(Reset):为1时,表示连接出现严重错误,必须释放并重新建立连接。
      • SYN(Synchronize):为1时,表示这是一个连接请求或连接接受报文。用于三次握手。
      • FIN(Finish):为1时,表示发送方数据已发送完毕,要求释放连接。用于四次挥手。
  4. 窗口大小(Window Size, 16位)

    • 作用:用于流量控制。指示从本报文段的确认号开始,接收方还能接收多少字节的数据。
    • 详解:这是TCP实现滑动窗口流量控制的基础。发送方根据接收方通告的窗口大小来调整自己的发送速率,避免接收方缓冲区溢出。

步骤四:保证报文段完整性与特殊功能

  1. 校验和(Checksum, 16位)

    • 作用:用于检验TCP首部、数据以及IP伪首部(包含源IP、目的IP、协议类型等)在传输过程中是否出现差错。
    • 详解:发送方计算,接收方验证。如果校验失败,接收方会直接丢弃该报文段,并不发送确认,从而触发发送方超时重传。
  2. 紧急指针(Urgent Pointer, 16位)

    • 作用:当URG标志为1时,本指针指出本报文段中紧急数据的末尾在数据部分中的位置。
    • 详解:紧急数据需要“插队”处理。紧急指针的值加上序列号,就得到了紧急数据最后一个字节的位置。

步骤五:可扩展部分——选项与填充

  1. 选项(Options, 长度可变)

    • 作用:用于扩展TCP功能,是首部长度可变的根源。
    • 常见选项
      • 最大报文段长度(MSS):在三次握手时通告,表示本端所能接受的最大报文段数据长度,以避免在IP层分片。
      • 窗口扩大因子:用于扩大16位窗口大小的表示范围,以支持高速网络。
      • 选择性确认(SACK):允许接收方告知发送方哪些不连续的数据块已经收到,提高重传效率。
      • 时间戳:用于计算往返时间(RTT)和防止序列号回绕(PAWS)。
  2. 填充(Padding)

    • 作用:确保TCP首部长度是4字节的整数倍。
    • 详解:由于选项字段长度可变,可能造成首部长度不是4字节的整数倍,这时需要用0进行填充,以满足“数据偏移”字段的要求。

总结

通过以上分解,我们可以看到TCP报文段的结构设计精妙,每个字段都肩负着重要使命:

  • 端口号定义了通信的端点。
  • 序列号和确认号构成了可靠传输的基石。
  • 标志位控制着连接的生命周期(SYN, FIN, RST)和数据处理方式(URG, PSH)。
  • 窗口和校验和分别负责流量控制和差错检测。
  • 选项则提供了协议的扩展能力。

理解TCP报文段结构,是深入掌握TCP连接管理、可靠传输、流量控制和拥塞控制等高级特性的第一步。

TCP报文段结构详解 TCP报文段是TCP协议传输数据的基本单位,理解其结构是掌握TCP工作原理的基础。一个TCP报文段分为两大块: 首部 (Header)和 数据 (Data)。数据部分是可选的,例如在建立连接的三次握手中,报文段就没有数据,但首部是必须存在的。 TCP首部的固定部分是20字节,此外还有可选的选项部分,因此首部长度是可变的,最小20字节,最大60字节。其具体结构如下图所示(通常用4字节一行来表示): 下面我们逐一拆解每个字段的含义和作用。 步骤一:连接的两端——端口号(Port) 源端口号(Source Port, 16位) : 作用 :标识发送数据包的应用程序进程。 详解 :可以理解为数据包从哪个“门”发出。通常,客户端程序的端口是随机分配的临时端口。 目的端口号(Destination Port, 16位) : 作用 :标识接收数据包的应用程序进程。 详解 :可以理解为数据包要进入哪个“门”。服务器端知名服务使用固定端口,如HTTP是80,HTTPS是443。 组合 :源IP + 源端口 + 目的IP + 目的端口,这四元组唯一确定了一个TCP连接。 步骤二:保证数据有序——序列号与确认号 这是TCP实现可靠传输的核心字段。 序列号(Sequence Number, 32位) : 作用 :标识本报文段所发送数据的第一个字节的序号。 详解 :TCP是面向字节流的,它为每个字节都分配一个序号。例如,假设初始序列号(ISN)为1000,如果这个报文段携带了1000个字节的数据,那么它的序列号就是1000,下一个报文段的序列号就是1000 + 1000 = 2000。 意义 :接收方根据序列号可以对收到的乱序数据包进行重新排序,也可以发现重复的数据包。 确认号(Acknowledgment Number, 32位) : 作用 :期望收到对方下一个报文段的第一个数据字节的序号。同时,也表示确认号之前的所有数据都已正确接收。 详解 :确认号具有“累积确认”的特性。如果接收方收到的最后一个字节序号是1999,那么它发回的确认号就是2000,意思是“我已经收到了2000之前的所有数据,现在期望你从2000开始发送”。 前提 :只有当一个报文段的ACK标志位(见下文)为1时,确认号字段才有效。 步骤三:控制报文段本身——首部长度、标志位和窗口 这部分字段控制着报文段的行为和流量。 数据偏移(Data Offset, 4位) : 作用 :指出TCP报文段的首部长度,即数据部分从何处开始。 详解 :这个字段的单位是4字节(32位字)。由于首部有可变长的选项部分,所以需要它来指明首部结束的位置。最小值是5(5 * 4字节 = 20字节,即标准首部),最大值是15(15 * 4字节 = 60字节)。 保留(Reserved, 6位) : 作用 :保留给未来使用,必须设为0。 标志位(Flags, 6位,每位代表一个控制功能) : 作用 :用于指示报文段的特殊性质和用途。 详解 : URG(Urgent) :为1时,表示报文段中有紧急数据,应尽快传送。此时 紧急指针 字段有效。 ACK(Acknowledgment) :为1时,表示 确认号 字段有效。建立连接后,所有报文段的ACK通常都为1。 PSH(Push) :为1时,提示接收方应立即将数据提交给上层应用,而不是等缓冲区满了再提交。 RST(Reset) :为1时,表示连接出现严重错误,必须释放并重新建立连接。 SYN(Synchronize) :为1时,表示这是一个连接请求或连接接受报文。用于三次握手。 FIN(Finish) :为1时,表示发送方数据已发送完毕,要求释放连接。用于四次挥手。 窗口大小(Window Size, 16位) : 作用 :用于流量控制。指示从本报文段的确认号开始,接收方还能接收多少字节的数据。 详解 :这是TCP实现滑动窗口流量控制的基础。发送方根据接收方通告的窗口大小来调整自己的发送速率,避免接收方缓冲区溢出。 步骤四:保证报文段完整性与特殊功能 校验和(Checksum, 16位) : 作用 :用于检验TCP首部、数据以及IP伪首部(包含源IP、目的IP、协议类型等)在传输过程中是否出现差错。 详解 :发送方计算,接收方验证。如果校验失败,接收方会直接丢弃该报文段,并不发送确认,从而触发发送方超时重传。 紧急指针(Urgent Pointer, 16位) : 作用 :当URG标志为1时,本指针指出本报文段中紧急数据的末尾在数据部分中的位置。 详解 :紧急数据需要“插队”处理。紧急指针的值加上序列号,就得到了紧急数据最后一个字节的位置。 步骤五:可扩展部分——选项与填充 选项(Options, 长度可变) : 作用 :用于扩展TCP功能,是首部长度可变的根源。 常见选项 : 最大报文段长度(MSS) :在三次握手时通告,表示本端所能接受的最大报文段数据长度,以避免在IP层分片。 窗口扩大因子 :用于扩大16位窗口大小的表示范围,以支持高速网络。 选择性确认(SACK) :允许接收方告知发送方哪些不连续的数据块已经收到,提高重传效率。 时间戳 :用于计算往返时间(RTT)和防止序列号回绕(PAWS)。 填充(Padding) : 作用 :确保TCP首部长度是4字节的整数倍。 详解 :由于选项字段长度可变,可能造成首部长度不是4字节的整数倍,这时需要用0进行填充,以满足“数据偏移”字段的要求。 总结 通过以上分解,我们可以看到TCP报文段的结构设计精妙,每个字段都肩负着重要使命: 端口号 定义了通信的端点。 序列号和确认号 构成了可靠传输的基石。 标志位 控制着连接的生命周期(SYN, FIN, RST)和数据处理方式(URG, PSH)。 窗口和校验和 分别负责流量控制和差错检测。 选项 则提供了协议的扩展能力。 理解TCP报文段结构,是深入掌握TCP连接管理、可靠传输、流量控制和拥塞控制等高级特性的第一步。