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)
-
源端口号(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连接管理、可靠传输、流量控制和拥塞控制等高级特性的第一步。