抓包分析基础:工欲善其事,必先利其器
各位好,欢迎来到第二章。上一章我们聊了吞吐测试的整体思路,从这章开始,咱们要真正动手了。
抓包分析,说白了就是“偷看”网络上的对话。你得知道数据长什么样,才能分析它为什么慢、为什么丢包。我刚开始学的时候,对着Wireshark满屏的十六进制发懵——后来才发现,只要把结构拆开看,其实没那么复杂。
本章核心目标:装好工具、学会过滤、看懂数据包的三层结构。这三件事做扎实了,后面的吞吐分析才有根基。
2.1 Wireshark 安装与界面初识
Wireshark 是抓包界的“瑞士军刀”。免费、开源、跨平台,几乎所有的网络工程师都在用。我个人习惯在 Windows 和 Linux 上都备一份,因为不同场景下抓包策略不一样。
2.1.1 安装要点
- Windows:去官网下载安装包,一路 Next。注意安装时会提示安装 Npcap(或 WinPcap),一定要装——这是抓包的底层驱动。我遇到过有人装完 Wireshark 发现抓不到包,结果就是没装 Npcap。
- macOS:用 Homebrew 最省事:
brew install wireshark。也可以下载 .dmg 安装包。 - Linux:以 Ubuntu 为例:
sudo apt install wireshark。安装后记得把当前用户加入wireshark组,否则普通用户没权限抓包。
避坑指南:我曾经在生产环境的服务器上直接装 Wireshark,结果被安全部门约谈。记住:生产环境尽量用 tcpdump 命令行抓包,抓完拿回本地用 Wireshark 分析。别在线上机器装图形界面。
2.1.2 界面速览
打开 Wireshark,你会看到这样一个界面(我描述一下,你对照着看):
- 顶部菜单栏:文件、编辑、视图、捕获、分析…… 常用的就“捕获”和“分析”。
- 过滤栏:就在菜单下面,一个长条输入框。这是你以后最常打交道的地方。
- 数据包列表区:默认显示所有抓到的包。每一行是一个包,列字段包括:序号、时间、源IP、目的IP、协议、长度、信息摘要。
- 数据包详情区:选中一个包,中间区域会分层展开——物理层、网络层、传输层、应用层。
- 数据包字节区:最下面,显示原始十六进制和 ASCII 码。说实话,日常分析很少看这里,除非做底层协议逆向。
小技巧:刚启动时 Wireshark 会列出所有网络接口。如果你不确定用哪个,看“流量”那一列——有波动的就是正在通信的接口。我一般先选接口,点“开始捕获”,几秒钟后点“停止”,看看抓到的东西对不对。
2.2 抓包过滤器与显示过滤器
很多新手一上来就点“开始捕获”,结果几秒钟抓了几万个包,直接看花眼。嗯,这里有个关键概念:过滤器分两种,用途完全不同。
| 类型 | 作用时机 | 语法基础 | 典型场景 |
|---|---|---|---|
| 抓包过滤器 | 捕获之前设置,只抓符合条件的包 | BPF(Berkeley Packet Filter) | 只抓某台主机的流量,减少抓包文件体积 |
| 显示过滤器 | 捕获之后设置,从已抓到的包中筛选显示 | Wireshark 专有语法(更丰富) | 从全量数据中找出 HTTP 请求或特定 TCP 流 |
2.2.1 抓包过滤器(Capture Filter)
抓包过滤器在捕获开始前设置。语法是 BPF,比较简洁。举个例子:
# 只抓 192.168.1.100 的流量
host 192.168.1.100
# 只抓 HTTP 流量(TCP 80 端口)
tcp port 80
# 只抓某网段的广播包
net 192.168.1.0/24 and broadcast
你想想看,如果吞吐测试时只关心客户端和服务器之间的流量,用 host 10.0.0.1 and host 10.0.0.2 就能过滤掉所有无关噪声。我在一次数据中心搬迁项目中,就是靠这个过滤器在千兆链路上精准抓到两台存储设备之间的交互,文件大小从 2GB 降到了 200MB。
2.2.2 显示过滤器(Display Filter)
显示过滤器更强大,因为它能基于协议字段做精细筛选。语法是 Wireshark 自己的,支持自动补全。常用的有:
# 只看 TCP 流量
tcp
# 只看源 IP 为 10.0.0.1 的包
ip.src == 10.0.0.1
# 只看 TCP 端口 443 且 SYN 标志位为 1 的包
tcp.port == 443 and tcp.flags.syn == 1
# 只看 HTTP 请求(GET 或 POST)
http.request
我的习惯:抓包时用抓包过滤器做粗筛,保留核心流量;分析时用显示过滤器做细筛,层层下钻。比如先看 tcp,再看 tcp.analysis.lost_segment 找丢包,最后定位到具体流。
2.3 数据包结构解析
数据包在网络上传输,就像寄快递——外面套一层又一层的信封。每一层都有特定的头部信息。咱们从下往上拆。
2.3.1 以太网帧(Layer 2)
以太网帧是最外层的“信封”。结构如下:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 目的 MAC | 6 | 接收方网卡地址 |
| 源 MAC | 6 | 发送方网卡地址 |
| 类型/长度 | 2 | 0x0800 表示 IPv4,0x0806 表示 ARP |
| 载荷 | 46-1500 | 上层数据(IP 包) |
| FCS | 4 | 帧校验序列(Wireshark 通常不显示) |
在 Wireshark 里展开一个包,最上面就是 Ethernet II 部分。你会看到 Source 和 Destination 两个 MAC 地址。吞吐测试中,如果发现 MAC 地址频繁变化,说明数据经过了交换机或路由器——这会影响延迟计算。
2.3.2 IP 头(Layer 3)
IP 头是网络层的核心。IPv4 头部通常是 20 字节(无选项时)。关键字段:
- 版本:4 或 6。现在大部分还是 IPv4。
- 总长度:整个 IP 包的长度,包括头部和数据。最大 65535 字节。
- 标识 + 标志 + 片偏移:用于 IP 分片。吞吐测试中如果看到大量分片包,说明 MTU 设置有问题。
- TTL:生存时间。每经过一个路由器减 1,减到 0 就丢弃。我常用 TTL 判断两台设备之间隔了几跳。
- 协议:6 表示 TCP,17 表示 UDP。
- 源 IP 和 目的 IP:各 4 字节。
实战经验:有一次吞吐测试结果忽高忽低,我抓包一看,发现 TTL 值在 64 和 128 之间交替出现。这说明流量走了两条不同的路径——一条经过三层设备,一条直连。后来排查发现是路由表配置了等价多路径(ECMP),导致数据包乱序。调整策略后吞吐就稳定了。
2.3.3 TCP 头(Layer 4)
TCP 头部比 UDP 复杂得多,因为要保证可靠传输。标准 TCP 头 20 字节,关键字段:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 源端口 / 目的端口 | 各 2 | 标识应用层协议(如 80=HTTP) |
| 序列号 | 4 | 标识数据字节流的位置 |
| 确认号 | 4 | 期望收到的下一个序列号 |
| 标志位 | 1(实际 9 位) | SYN、ACK、FIN、RST 等 |
| 窗口大小 | 2 | 接收方还能收多少数据(流量控制) |
| 校验和 | 2 | 校验头部和数据完整性 |
吞吐测试中,我最关注三个东西:
- 窗口大小:如果窗口突然变成 0,说明接收方处理不过来——这是性能瓶颈的信号。
- 重传:Wireshark 会用黑色背景标记重传包。重传率超过 1% 就要警惕了。
- 三次握手延迟:从 SYN 到 SYN-ACK 的时间,能反映网络往返时延(RTT)。
2.3.4 UDP 头(Layer 4)
UDP 就简单多了,只有 8 个字节:源端口、目的端口、长度、校验和。没有序列号、没有确认、没有窗口。说白了就是“发了就不管了”。
吞吐测试中,UDP 常用于测试纯带宽(比如 iperf 的 UDP 模式)。但要注意:UDP 没有拥塞控制,如果网络有丢包,你看到的“吞吐”可能虚高——因为丢掉的包也算在发送速率里了。
2.4 本章知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以把它当作一个“思维导图”来用。
2.5 本章小结
这一章我们做了三件事:
- 装好了 Wireshark,熟悉了界面布局。
- 学会了两种过滤器的用法——抓包过滤器用来“节流”,显示过滤器用来“精筛”。
- 拆解了数据包的三层结构:以太网帧、IP 头、TCP/UDP 头。每个头部都有关键字段,吞吐测试中重点关注 MAC 地址变化、TTL 跳数、TCP 窗口和重传。