TCP的封装格式
2026/7/23大约 3 分钟

TCP 的封装格式(也称为 TCP 报文首部)是确保可靠传输的“指挥中心”。在没有选项的情况下,TCP 首部固定为 20 字节。
我们可以把 TCP 报文想象成一个极其严密的快递面单,上面不仅写了地址,还写了包裹的序号、确认号以及各种控制指令。
TCP 报文格式图解
核心字段详解
1. 端口号(各 16 位)
- 源端口 (Source Port):发送进程的端口。
- 目的端口 (Destination Port):接收进程的端口。
TCP 通过“IP地址 + 端口号”的组合(即套接字 Socket)来确定唯一的通信链路。
2. 序列号与确认号(各 32 位)—— 可靠性的基石
- 序列号 (Sequence Number):本报文段发送的数据组中第一个字节的编号。它保证了数据的有序性。
- 确认号 (Acknowledgment Number):期望收到对方下一个报文段的第一个数据字节的编号。比如确认号是 N,代表“前 N-1个字节我已收到,请发第 N个”。
3. 数据偏移(4 位)
- 指出 TCP 报文首部长度。因为“选项”字段长度不固定,所以需要这个字段告诉接收方数据从哪里开始。
4. 控制标志位 (Flags, 6 位)
这是 TCP 的“指挥旗语”,最关键的几个包括:
- ACK:确认标志。有效时,确认号字段才生效。(ackonwledge)
- SYN:同步标志。用于建立连接(三次握手)。(synchronous)
- FIN:结束标志。用于释放连接(四次挥手)。(finish)
- RST:复位标志。强制断开异常连接。(reset)
- PSH:推送标志。要求接收方尽快将数据交给应用层,而不是在缓冲区排队。(push)
- URG: 当 URG 标志位被设置为 1 时,它通常与 TCP 首部中的另一个字段——紧急指针 (Urgent Pointer) 配合使用。
5. 窗口大小 (Window Size, 16 位)
- 用于流量控制。它告诉对方:“我现在还能收多少字节的数据”,防止发送方发得太快把接收方的缓存撑破。
6. 校验和 (Checksum, 16 位)
- 用于检测首部和数据在传输过程中是否发生了位错误。如果校验失败,TCP 会直接丢弃该报文且不发 ACK。
7. 紧急指针 (Urgent Pointer)
- 配合 URG 标志使用,指示报文中有紧急数据,需要优先处理(现在已较少使用)。
8. 选项 (Options)
- 长度可变。最常见的是 MSS (Maximum Segment Size),用于协商每一个 TCP 段的最大长度,防止在 IP 层被分片。
数据封装的整体视角
当 TCP 报文传给下一层时,它会被嵌套进 IP 报文,再嵌套进以太网帧:
[以太网首部] [IP 首部] [TCP 首部] [应用层数据] [以太网尾部]
总结
TCP 首部的设计非常精巧:序列号和确认号解决了“丢包和乱序”问题,窗口大小解决了“速度匹配”问题,标志位解决了“状态切换”问题。
