在网络排障与性能分析过程中,理解 TCP 报文结构以及抓包工具的使用至关重要。本章将详细讲解 TCP 报文的每个字段,并结合实际抓包案例,教你如何通过抓包分析网络问题。
一、TCP 报文结构总览
TCP 是一种面向连接的传输层协议,具备可靠性。其报文格式如下:
0 4 8 12 16 20 24 28 32
+-------+-------+--------+----------------+------------+-------------+----------------+--------+
| 源端口 | 目标端口 | 序列号(SEQ) | 确认号(ACK) |
+------------------------+----------------+----------------+----------------+
| 数据偏移 | 保留 | 控制位 | 窗口大小(Window) |
+------------------------+----------------+----------------+
| 校验和(Checksum) | 紧急指针(Urgent Pointer) |
+------------------------+----------------+
| 可选项(Options)... |
+------------------------+
| 数据(Data)... |
+------------------------+
二、重要字段详解
字段名称 | 描述 |
---|---|
源/目的端口 | 表示通信双方的端口号 |
序列号(SEQ) | 表示本段数据的起始序号 |
确认号(ACK) | 告知对方下一个期望接收的数据序号 |
数据偏移 | 表头长度(以 4 字节为单位) |
控制位(Flags) | 控制连接状态,例如 SYN、ACK、FIN、RST 等 |
窗口大小 | 告知接收方的缓冲区剩余容量,用于流量控制 |
校验和 | 用于校验数据完整性 |
紧急指针 | 用于紧急数据传输(很少使用) |
可选字段 | 如最大段长 MSS、窗口扩大因子、时间戳等 |
三、常见 TCP 控制位及含义
控制位 | 说明 |
---|---|
SYN | 请求建立连接 |
ACK | 确认应答 |
FIN | 请求释放连接 |
RST | 强制重置连接 |
PSH | 接收方应尽快处理 |
URG | 表示紧急数据 |
四、抓包实战:tcpdump 使用基础
安装工具
sudo apt install tcpdump # Debian/Ubuntu
sudo yum install tcpdump # CentOS/RHEL
抓取 TCP 报文示例
sudo tcpdump -i eth0 tcp
抓取指定端口的通信:
sudo tcpdump -i eth0 port 80
抓取并保存到文件:
sudo tcpdump -i eth0 tcp -w tcp_traffic.pcap
五、分析报文示例(抓包解析)
使用 Wireshark
打开 .pcap
文件后,重点关注:
-
三次握手是否正常(SYN → SYN-ACK → ACK)
-
四次挥手是否完整(FIN → ACK → FIN → ACK)
-
是否有重传(Retransmission)
-
是否存在 TCP window full 报文
-
是否有 DUP ACK 或 RST 报文
示例 1:正常三次握手
1. 客户端 → 服务端:SYN
2. 服务端 → 客户端:SYN, ACK
3. 客户端 → 服务端:ACK
示例 2:连接重传情况
查找是否出现如下字段:
-
[TCP Retransmission]
-
[TCP Dup ACK #x]
-
[TCP Out-Of-Order]
六、常用 Wireshark 过滤器
表达式 | 说明 |
---|---|
tcp.port == 80 | 指定端口为 80 |
tcp.flags.syn == 1 | 只看 SYN 报文 |
tcp.analysis.retransmission | 显示重传的数据包 |
ip.addr == 192.168.1.1 | 指定某个 IP 的通信 |
tcp.len > 0 | 显示包含数据的 TCP 报文 |
七、进阶分析技巧
-
使用
tcpdump
+Wireshark
组合,灵活掌控线上流量 -
识别流量瓶颈:是否存在 Zero Window(窗口为 0)
-
分析延迟问题:利用 TCP Timestamp 选项字段
-
用过滤器快速定位问题源头(IP、端口、连接状态)