TCP 基础篇-第二篇:什么是 TCP?拆开报文头看个明白
逐字节解剖 TCP 头部:从源端口到选项,理解每个字段的使命
在上一篇文章中,我们了解了 TCP 在传输层中的核心地位。但 TCP 究竟是如何工作的?它的“语言”是什么?答案就藏在 TCP 报文段(Segment) 的头部结构中。如果说 TCP 是互联网的“可靠快递员”,那么报文头就是快递单上的所有信息——源地址、目的地址、包裹序号、校验码、特殊指令……只有彻底读懂这份“快递单”,才能真正理解 TCP 的可靠传输、流量控制、连接管理等核心机制。本文将以最直观的方式,逐字段拆解 TCP 头部,带你从字节层面看透 TCP 的精髓。

一、TCP 报文段整体结构
TCP 报文段由 头部(Header) 和 数据(Payload) 两部分组成。头部长度通常为 20 字节(不含选项),最多可达 60 字节。数据部分承载应用层数据(如 HTTP 请求、FTP 命令等)。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) | 目的端口(Dest Port) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 序列号(Sequence Number) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 确认号(Acknowledgment Number) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |C|E|U|A|P|R|S|F| | | Offset| 保留 |W|C|R|C|S|S|Y|I| 窗口大小(Window) | | | |R|E|G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 校验和(Checksum) | 紧急指针(Urgent Pointer) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 选项(Options)... | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 数据(Data) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
二、固定头部字段详解(20 字节)
1. 源端口(Source Port)和目的端口(Destination Port)——各 16 位
这两个字段用于标识发送方和接收方的应用程序。端口号与 IP 地址共同构成套接字(Socket),唯一确定一个通信端点。源端口通常由客户端随机分配(大于 1024),目的端口则是服务端监听的知名端口(如 80 用于 HTTP,443 用于 HTTPS)。正是通过端口,TCP 才能将数据交付给正确的进程。
2. 序列号(Sequence Number)——32 位
序列号是 TCP 可靠性的基石。它表示本端发送的数据流中,当前报文段第一个数据字节的序号(如果是 SYN 或 FIN,也消耗一个序号)。初始序列号(ISN)在连接建立时随机生成,后续每个字节都对应一个唯一的序号。接收方通过序列号来确认已收到的数据,并检测重复或乱序的报文。没有序列号,TCP 就无法实现“按序交付”和“去重”。
3. 确认号(Acknowledgment Number)——32 位
确认号字段仅在 ACK 标志位为 1 时有效。它表示接收方期望收到的下一个字节的序号,同时也隐式确认了该序号之前的所有数据都已正确接收。例如,若确认号为 x+1,则说明序列号 x 及之前的数据都已收到。确认号机制是 TCP 实现“正向确认”和“超时重传”的关键。
4. 数据偏移(Data Offset)——4 位
该字段指示 TCP 头部的总长度(以 4 字节为单位的倍数)。因为头部长度可变(取决于选项字段),所以需要告知接收方数据起始位置。最小值为 5(即 5*4=20 字节),最大值为 15(60 字节)。这也意味着 TCP 头部最多可有 40 字节的选项。
5. 保留位(Reserved)——3 位
保留给未来使用,目前必须置为 0。
6. 标志位(Flags)——9 位(实际常用 6 位)
标志位用于控制 TCP 的状态机和行为。最核心的六个标志如下:
URG(Urgent):紧急指针有效,用于通知接收方尽快处理紧急数据。
ACK(Acknowledgment):确认号字段有效。除了初始 SYN 报文外,几乎所有报文都会置此位。
PSH(Push):接收方应立即将数据交付给应用层,而非等待缓冲区填满。
RST(Reset):强制复位连接,用于异常终止。
SYN(Synchronize):同步序列号,用于连接建立阶段。
FIN(Finish):发送方完成数据发送,用于关闭连接。
此外,还有 CWR 和 ECE 用于显式拥塞通知(ECN),但较少讨论。
7. 窗口大小(Window)——16 位
这是 TCP 流量控制的核心。窗口字段指示本端当前可接收的数据量(以字节为单位),即接收窗口(rwnd)。发送方根据该值限制未确认数据的大小,避免淹没接收方。窗口大小可以动态变化,以实现端到端的流量调节。最大值为 65535 字节,但通过窗口缩放选项(Window Scale)可扩展至更大。
8. 校验和(Checksum)——16 位
校验和覆盖整个 TCP 报文段(头部 + 数据)以及一个伪头部(包含源 IP、目的 IP、协议号、TCP 长度)。它用于检测数据在传输过程中是否发生损坏。如果接收方计算出的校验和与字段值不匹配,则会丢弃该报文段。这是 TCP 保证数据完整性的重要手段。
9. 紧急指针(Urgent Pointer)——16 位
当 URG 标志置位时,该字段指向紧急数据最后一个字节的序号,用于指示紧急数据的位置。现代应用较少使用,但在某些传统协议(如 Telnet)中仍有存在。
三、选项(Options)——可变长度
选项字段是 TCP 头部最具扩展性的部分。常见的选项包括:
MSS(Maximum Segment Size):在 SYN 中交换,告知对端本端能接收的最大报文段大小,避免 IP 分片。
Window Scale(窗口缩放):用于扩大窗口大小,支持高速网络。
Timestamps(时间戳):用于 RTT 测量和 PAWS(防止序列号回绕)。
SACK(选择性确认):允许接收方告知发送方哪些数据块已收到,提高重传效率。
NOP(No-Operation):填充字节,用于对齐。
选项的存在使得 TCP 能够适应不同的网络环境和应用需求,但同时也增加了头部开销。
四、为什么这些字段如此重要?——它们如何协同工作
单个字段的意义有限,但它们组合在一起就构成了 TCP 强大的控制能力。举几个典型场景:
可靠传输:序列号 + 确认号 + 校验和 + 超时重传,保证数据无差错、不丢失、不重复。
流量控制:窗口字段 + 确认号,让接收方控制发送速率。
连接管理:SYN、ACK、FIN 标志位配合序列号,实现三次握手和四次挥手。
拥塞控制:虽然没有专用字段,但依赖窗口和确认号来感知网络状态。
💡 思考: 如果去掉序列号,TCP 还能可靠吗?不能。序列号是 TCP 一切可靠性机制的基础,没有它,重传、排序、去重都无从谈起。
五、头部长度与 MTU 的关系
TCP 报文段最终要封装在 IP 数据报中,而 IP 数据报的大小受限于链路层的 MTU(最大传输单元)。以太网 MTU 通常为 1500 字节,减去 IP 头部(20 字节)和 TCP 头部(至少 20 字节),留给数据的最大空间约为 1460 字节。这就是 MSS 的由来。如果 TCP 选项较多(如时间戳 + SACK),头部可能达到 40~60 字节,则数据部分会更小。因此,合理配置选项和 MSS 对网络性能有直接影响。
六、抓包实战:Wireshark 中的 TCP 头部
理论结合实践,我们可以用 Wireshark 捕获一个 HTTP 请求,展开 TCP 层查看每个字段的实际值。例如:
源端口:52034(随机)
目的端口:443(HTTPS)
序列号:0(相对值,实际为 ISN)
确认号:0
标志位:SYN=1,ACK=0
窗口:65535
MSS 选项:1460
通过观察这些值,你可以清晰地看到三次握手、数据传输、窗口更新等过程。强烈建议读者亲自抓包验证,加深理解。
七、常见误区澄清
误区1:TCP 头部固定 20 字节 → 错,基础是 20 字节,但选项可扩展至 60 字节。
误区2:序列号从 0 开始 → 错,是随机初始值,防止历史连接干扰。
误区3:窗口大小代表缓冲区大小 → 更准确地说,是接收方当前可用的缓冲区空间,动态变化。
八、为什么理解报文头如此重要?
对于网络工程师、协议开发者或性能调优专家,深刻理解 TCP 头部能帮助你:
排查网络问题(如丢包、乱序、零窗口)
优化内核参数(如调整窗口缩放因子)
理解协议交互流程(为何握手需要 3 次,挥手需要 4 次)
设计更高效的应用层协议(如选择合适的选项)
可以说,TCP 头部就是 TCP 协议的“心脏”,读懂它,你就掌握了 TCP 的灵魂。
结语:从头部出发,走向 TCP 深处
本文详细拆解了 TCP 报文头的每一个字段,从端口到选项,从序列号到校验和。这些看似枯燥的二进制位,组合在一起却构建了互联网最可靠的传输基石。在下一篇中,我们将对比 TCP 与 UDP,探讨两者的选择与适用场景,敬请期待。


客服1