TCP报文段的首部格式是保证可靠传输和连接管理的关键。
TCP报文段首部格式图示
各字段详细说明
-
源端口(16位)
- 发起TCP连接的应用程序端口号(范围:1-65535)
- 示例:HTTP客户端通常使用随机临时端口(如49152-65535)
-
目的端口(16位)
- 目标应用程序的端口号
- 示例:HTTP服务默认端口80,HTTPS默认443
-
序列号(32位)
- 作用:标识发送的数据字节流中第一个字节的编号
- 特性:初始值ISN在握手时随机生成(防止伪造)
- 示例:若SYN段的序列号为x,后续数据第一个字节为x+1
-
确认号(32位)
- 作用:期望收到的下一个报文段的第一个字节序号
- 仅在ACK标志置1时有效
- 规则:确认号=已成功接收的最后字节序号+1
-
数据偏移(4位)
- 作用:指示TCP首部长度(以4字节为单位)
- 公式:首部长度 = 数据偏移值 × 4字节
- 示例:若值为5,则首部长度=5×4=20字节(无选项)
-
保留位(6位)
- 保留供未来使用,目前必须置0
-
控制位(6位)
- URG:紧急指针有效(需配合紧急指针字段)
- ACK:确认号有效(建立连接后所有报文必须置1)
- PSH:接收方应立即将数据提交给应用层
- RST:强制断开异常连接(如收到不存在的端口请求)
- SYN:同步序列号(用于建立连接)
- FIN:结束连接(用于正常关闭)
-
窗口大小(16位)
- 作用:流量控制,标识接收方当前可接收的字节数
- 示例:窗口值=500表示发送方最多发送500字节而不必等待确认
-
校验和(16位)
- 范围:覆盖TCP首部、数据和伪首部(含源/目的IP地址)
- 伪首部结构:仅用于计算校验和,不计入实际传输
┌───────────┬───────────┬───────────┬───────────┐ │ 源IP地址 (32位) │ 目的IP地址 (32位) │ ├───────────┼───────────┼───────────┼───────────┤ │ 协议字段 (8位) │ 零填充 (8位) │ TCP长度 (16位) │ └───────────┴───────────┴───────────┴───────────┘
-
紧急指针(16位)
- 当URG=1时生效,指示紧急数据结束位置(与序列号的偏移量)
-
选项字段
- MSS(最大报文长度):协商双方可接受的最大数据长度
- 格式:0x01(类型) 0x04(长度) 0xXX 0xXX(具体值)
- 示例:MSS=1460(以太网MTU=1500时的典型值)
- 时间戳:计算RTT和防止序列号回绕
- 窗口缩放:扩展窗口大小(通过左移位数)
- MSS(最大报文长度):协商双方可接受的最大数据长度
完整TCP首部示例
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口 (16) | 目的端口 (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序列号 (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号 (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移 |保留位|U|A|P|R|S|F| 窗口大小 (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 校验和 (16) | 紧急指针 (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项(可变长度,最大40字节) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
关键应用场景
-
连接建立(SYN控制位)
-
三次握手中SYN和ACK的组合:
客户端 → SYN=1, seq=x 服务端 → SYN=1, seq=y, ack=x+1 客户端 → seq=x+1, ack=y+1
-
-
流量控制(窗口字段)
- 动态调整发送速率避免接收方缓冲区溢出
-
快速重传(序列号与确认号)
- 连续收到3个重复ACK时触发快速重传