TCP报文格式
TCP(Transmission Control Protocol)头部是传输层协议的核心结构,用于建立连接、可靠传输、流量控制和拥塞控制。以下是 TCP 头部 的详细解析,包括各字段的作用和典型值。
1. 源端口(Source Port)
-
长度:16 比特(2 字节)
-
作用:标识发送方的应用程序端口号(0~65535)。
-
示例:
-
HTTP 客户端随机端口:
49152
(动态端口范围) -
服务器 SSH 端口:
22
-
2. 目的端口(Destination Port)
-
长度:16 比特(2 字节)
-
作用:标识接收方的应用程序端口号。
-
示例:
-
HTTP 服务器端口:
80
-
DNS 查询端口:
53
-
3. 序列号(Sequence Number)
-
长度:32 比特(4 字节)
-
作用:
-
在 连接建立(SYN) 时,初始序列号(ISN)由系统随机生成(防预测攻击)。
-
后续数据按字节编号,用于 数据排序和可靠性确认。
-
-
示例:
-
第一个数据包:
ISN = 123456789
-
发送 100 字节后:
123456789 + 100 = 123456889
-
4. 确认号(Acknowledgment Number)
-
长度:32 比特(4 字节)
-
作用:
-
仅在 ACK=1 时有效,表示接收方期望收到的下一个字节序号(即已成功接收
Ack-1
之前的所有数据)。 -
用于 可靠传输(接收方确认数据,发送方重传丢失数据)。
-
-
示例:
-
发送方发送
Seq=1, Len=100
,接收方回复Ack=101
(表示期望收到第 101 字节)。
-
5. 数据偏移(Data Offset / Header Length)
-
长度:4 比特
-
作用:
-
表示 TCP 头部长度(以 4 字节 为单位),最小
5
(20 字节),最大15
(60 字节,含可选字段)。 -
用于定位 数据部分 的起始位置。
-
-
示例:
-
0101
(5 × 4 = 20 字节,标准头部)
-
6. 保留(Reserved)
-
长度:6 比特
-
作用:保留字段,必须设为
0
(未来扩展用)。
7. 控制标志(Control Flags)
-
长度:6 比特(每个标志占 1 比特)
-
作用:控制 TCP 连接状态和数据传输行为:
标志位 | 名称 | 作用 |
---|---|---|
URG | 紧急指针 | 表示数据需要优先处理(如 Ctrl+C 中断信号) |
ACK | 确认 | 表示 Acknowledgment Number 有效 |
PSH | 推送 | 要求接收方立即提交数据给应用层(如 Telnet 实时交互) |
RST | 重置 | 强制终止异常连接(如端口未监听) |
SYN | 同步 | 发起连接请求(三次握手阶段) |
FIN | 结束 | 正常关闭连接(四次挥手阶段) |
示例:
-
三次握手:
SYN=1, ACK=0
→SYN=1, ACK=1
→ACK=1
-
四次挥手:
FIN=1, ACK=1
→ACK=1
→FIN=1, ACK=1
→ACK=1
8. 窗口大小(Window Size)
-
长度:16 比特(2 字节)
-
作用:
-
接收方告知发送方 当前可接收的数据量(字节数),用于 流量控制。
-
受接收方缓冲区剩余空间限制(可通过
SO_RCVBUF
调整)。
-
-
示例:
-
Window=8192
(表示可接收 8KB 数据)
-
9. 校验和(Checksum)
-
长度:16 比特(2 字节)
-
作用:
-
校验 TCP 头部 + 数据 + 伪头部(IP 部分字段) 的完整性。
-
计算方法:反码求和(类似 IP 校验和)。
-
-
伪头部字段(12 字节,仅用于计算校验和):
复制
源 IP(4)| 目的 IP(4)| 保留(1)| 协议(1)| TCP 长度(2)
10. 紧急指针(Urgent Pointer)
-
长度:16 比特(2 字节)
-
作用:
-
仅在
URG=1
时有效,表示紧急数据的末尾偏移量(相对于Sequence Number
)。 -
用于中断或高优先级数据(如 Telnet
Ctrl+C
)。
-
-
示例:
-
Seq=100, URG=1, Urgent Pointer=50
→ 紧急数据范围:100~149
-
11. 可选字段(Options)
-
长度:可变(最多 40 字节)
-
作用:扩展 TCP 功能,常见选项:
-
MSS(Maximum Segment Size):协商最大报文段长度(如
1460
字节)。 -
SACK(Selective ACK):选择性确认,优化重传。
-
Window Scaling:窗口缩放因子(扩大窗口至 1GB)。
-
Timestamp:时间戳(计算 RTT,防序列号回绕)。
-
格式:
复制
Kind(1)| Length(1)| Data(可变)
示例(MSS 选项):
复制
02(Kind) 04(Length) 05 B4(MSS=1460)
12. 填充(Padding)
-
作用:确保 TCP 头部长度是 4 字节的倍数(对齐)。
-
示例:若选项字段占 3 字节,则填充 1 字节
0x00
。
TCP 头部示例(Wireshark 抓包)
复制
Transmission Control Protocol, Src Port: 54321, Dst Port: 80 Source Port: 54321 Destination Port: 80 Sequence Number: 123456789 Acknowledgment Number: 987654321 0101 .... = Header Length: 20 bytes Flags: 0x018 (PSH, ACK) Window: 8192 Checksum: 0x7a3d [correct] Urgent Pointer: 0 Options: MSS 1460, SACK Permitted
关键总结
-
核心字段:
-
端口号(定位应用)、序列号/确认号(可靠传输)、窗口(流量控制)。
-
-
控制连接:
-
SYN/FIN
管理连接,ACK
确认数据,RST
强制终止。
-
-
优化机制:
-
选项字段(MSS、SACK、Window Scaling)提升性能。
-
-
典型长度:
-
标准头部 20 字节,含选项最多 60 字节。
-
理解 TCP 头部有助于分析网络问题(如丢包、拥塞)和优化传输性能(如调整窗口大小)。