TCP(传输控制协议)是互联网协议套件中的核心传输层协议,其报头(Header)包含了确保数据可靠传输的关键信息。以下是 TCP 报头的详细解析:
TCP 报头的结构与字段详解
TCP 报头通常由 20 字节的固定部分和可选的选项字段组成,各字段功能如下:
1. 源端口号(Source Port)- 16 位
- 作用:标识发送数据的应用程序端口,用于接收方回复时的源端口标识。
- 示例:客户端向 Web 服务器发起 HTTP 请求时,会随机选用一个 1024-65535 范围内的动态端口(如 50001)作为源端口,而 Web 服务器则使用 80 端口作为目标端口响应请求。
2. 目标端口号(Destination Port)- 16 位
- 作用:标识接收数据的应用程序端口,如 HTTP 默认使用 80 端口,HTTPS 使用 443 端口。
3. 序列号(Sequence Number)- 32 位
- 作用:
- 首次建立连接时(SYN 包),该值为初始序列号(ISN),后续按实际发送字节数递增。
- 为发送的每个字节数据分配唯一编号,用于接收方重组排序分片数据。
- 示例:若发送 100 字节数据,序列号为 N,则下一段数据序列号为 N+100。
4. 确认号(Acknowledgment Number)- 32 位
- 作用:
- 接收方用于告知发送方已成功接收的数据序列号,即期望接收的下一个字节编号。
- 若确认号为 M,表示序号 0 到 M-1 的字节已被正确接收。
- 示例:接收方收到序列号为 N 的 100 字节数据后,确认号会设为 N+100。
5. 数据偏移(Data Offset)- 4 位
- 作用:标识 TCP 报头的总长度(包含选项字段),单位为 4 字节(32 位)。
- 计算方式:例如值为 5,则报头长度为 5×4=20 字节(无选项字段时)。
6. 保留字段(Reserved)- 3 位
- 作用:保留给未来扩展使用,目前全为 0。
7. 控制位(Control Bits)- 9 位(标志位)(6+2+1)
标志位 | 缩写 | 作用描述 |
拥塞窗口减少标志 | CWR | 当发送方收到接收方设置了 ECE 标志位的确认报文后,知道网络出现拥塞,会调整拥塞窗口大小,并在后续发送的 TCP 报文中设置 CWR 标志,告知接收方自己已经采取了拥塞控制措施 。 |
显式拥塞通知回显 | ECE | 当接收方收到的数据包中 IP 头部的 ECN 字段被设置为 “拥塞即将发生”,并且 TCP 头部的 SYN 标志位未置位时,接收方会在发回给发送方的确认报文中设置 ECE 标志,用于通知发送方网络出现了拥塞 。 |
紧急指针有效 | URG | 标识报文中包含紧急数据,需优先处理。 |
确认有效 | ACK | 确认号字段有效,通常在连接建立后所有报文都需设置该位。 |
推送请求 | PSH | 通知接收方立即将数据交付应用层,无需等待缓冲区满。 |
重置连接 | RST | 重置连接,用于处理异常情况(如端口不可用)。 |
同步序列号 | SYN | 用于建立连接时同步序列号,发起连接(SYN=1)或响应连接(SYN=1, ACK=1)。 |
结束连接 | FIN | 标识发送方已完成数据传输,请求关闭连接。 |
8. 窗口大小(Window Size)- 16 位
- 作用:
- 接收方告知发送方当前接收缓冲区的空闲容量,单位为字节,用于流量控制。
- 窗口大小越大,发送方允许发送的数据量越多。
- 示例:窗口大小为 1000,表示接收方最多可接收 1000 字节数据。
9. 校验和(Checksum)- 16 位
- 作用:
- 用于检测 TCP 报文在传输过程中是否发生错误,校验范围包括报头、数据及伪报头(IP 层信息)。
- 发送方计算校验和,接收方重新计算并验证,若不一致则丢弃报文。
10. 紧急指针(Urgent Pointer)- 16 位
- 作用:
- 当 URG 标志位为 1 时有效,标识紧急数据的末尾位置(相对于序列号的偏移量)。
- 紧急数据可跳过正常缓冲区处理,优先交付应用层。
11. 选项字段(Options)- 可选,长度可变
- 常见选项:
- 最大段大小(MSS):告知对方本端能接收的最大 TCP 数据段长度,通常在 SYN 包中发送。
- 窗口扩大因子(Window Scale):扩展窗口大小的表示范围(超过 65535 字节)。
- 时间戳(Timestamp):用于计算往返时间(RTT),优化拥塞控制。
- 长度限制:选项总长度需为 4 字节的倍数,不足时用填充位(0)补齐。
TCP 报头的可视化结构
1 2 3 4
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 ________
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port (16) | Destination Port (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 固
| Sequence Number | 定
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 报
| Acknowledgment Number | 头
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 长
|Data |Rese-| Control Bits | Window Size | 长
|Offset |rved | C E U A P R S F| | 20
| | | W C R C S S Y I| | 个
| | | R E G K H T N N| | 字
| (4b) |(3b) | (9b) | (16b) | 节
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum (16b) | Urgent Pointer (16b) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---
| Options (if any) | Padding | 可变长度报头(4N)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ————————
| Data | 字节流数据
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP 报头的关键作用
可靠传输:通过序列号、确认号和重传机制确保数据按序到达。
流量控制:利用窗口大小字段避免发送方过载接收方。
连接管理:通过 SYN、ACK、FIN 等标志位实现三次握手和四次挥手。
错误检测:校验和字段确保数据完整性。
扩展知识:TCP 与 UDP 报头的对比
字段 | TCP 报头 | UDP 报头 |
源 / 目标端口 | 包含 | 包含 |
序列号 / 确认号 | 包含(可靠传输) | 无 |
控制位 | 包含(SYN/ACK/FIN 等) | 无 |
窗口大小 | 包含(流量控制) | 无 |
校验和 | 必须计算 | 可选 |
紧急指针 | 包含 | 无 |
选项字段 | 可选 | 无 |
报头长度 | 20 字节(固定部分) | 8 字节 |
传输特性 | 面向连接,可靠 | 无连接,不可靠 |
通过 TCP 报头的复杂设计,TCP 协议实现了互联网中数据的可靠传输,是 HTTP、FTP 等高层协议的基础。