3、抓包工具入门:tcpdump 核心参数与过滤表达式、Wireshark 基础使用
做吞吐测试,不会抓包就像开车不看仪表盘。你调了半天参数,性能上不去,却不知道问题出在哪儿。我个人习惯,拿到一台新机器或者新网络环境,第一件事就是先抓个包看看基线。今天我们就聊聊两个最趁手的工具:tcpdump 和 Wireshark。
核心观点:抓包不是目的,看懂包才是。工具只是手段,过滤和解读才是真功夫。
3.1 tcpdump:命令行下的网络显微镜
tcpdump 是 Linux 下最经典的抓包工具,没有之一。它轻量、高效,在嵌入式设备或者服务器上都能跑。我刚开始用的时候,觉得参数太多记不住,后来发现核心就那么几个。
3.1.1 核心参数速查
| 参数 | 作用 | 我的常用场景 |
|---|---|---|
-i |
指定网卡接口 | 抓 eth0 或 any |
-n |
不解析域名(IP 直出) | 避免 DNS 查询干扰 |
-nn |
不解析域名和端口名 | 显示 80 而不是 http |
-c |
抓 N 个包后退出 | 快速采样,比如 -c 100 |
-s |
抓取每个包的长度 | 默认 262144,够用 |
-w |
保存为 pcap 文件 | 后续用 Wireshark 分析 |
-r |
读取 pcap 文件 | 离线分析 |
举个例子,我最常用的命令长这样:
tcpdump -i eth0 -nn -c 1000 -w capture.pcap
这条命令的意思是:抓 eth0 网卡,不解析名字,抓 1000 个包,存到 capture.pcap 里。简单直接。
小技巧:如果你不确定用哪个网卡,试试 tcpdump -D 列出所有接口。我经常在有多网卡的服务器上用这个。
3.1.2 过滤表达式:精准打击
不设过滤的抓包,就像在菜市场里找人——全是噪音。过滤表达式是 tcpdump 的灵魂。我总结了三类最常用的:
- 基于主机:
host 192.168.1.1或src host 10.0.0.1 - 基于端口:
port 80或src port 443 - 基于协议:
tcp、udp、icmp
组合起来威力更大。比如我只想看从客户端发往 8080 端口的 TCP 包:
tcpdump -i eth0 -nn tcp and src host 10.0.0.2 and dst port 8080
嗯,这里要注意:tcpdump 的表达式用的是 pcap-filter 语法,逻辑运算符是 and、or、not,不是 && 和 ||。我刚开始就踩过这个坑。
避坑指南:我曾经在生产环境上直接 tcpdump -i any 没加过滤,结果抓了 10 分钟,生成了 2GB 的文件,差点把磁盘撑爆。记住:先过滤,后抓包。
3.2 Wireshark:图形化的包分析利器
tcpdump 适合在服务器上快速抓取,但真要深入分析,还得靠 Wireshark。它把二进制包解析成人类能看懂的结构,还能画时序图、统计流量。说白了,它就是网络工程师的「显微镜」。
3.2.1 基础操作三步走
- 打开文件:File → Open,选择 tcpdump 抓的 pcap 文件。
- 设置过滤:在顶部的 Filter 栏输入表达式,比如
tcp.port == 443。 - 查看详情:点开一个包,看中间的 Packet Details 面板,逐层解析。
Wireshark 的过滤语法和 tcpdump 不太一样,它用的是 display filter。比如:
| 场景 | tcpdump 表达式 | Wireshark 显示过滤 |
|---|---|---|
| 只看 HTTP 流量 | port 80 |
tcp.port == 80 |
| 只看特定 IP 对话 | host 10.0.0.1 |
ip.addr == 10.0.0.1 |
| 只看重传包 | 不支持直接过滤 | tcp.analysis.retransmission |
我个人习惯,先用 tcpdump 在服务器上抓包,然后 scp 到本地用 Wireshark 分析。这样既不影响线上性能,又能享受图形界面的便利。
3.2.2 吞吐测试中必看的几个指标
做吞吐测试时,Wireshark 有几个面板我几乎每次都会打开:
- Statistics → Summary:看总包数、平均速率、丢包率。
- Statistics → IO Graph:画时间-吞吐量曲线,一眼看出瓶颈。
- Statistics → TCP Stream Graph → Time-Sequence Graph:看 TCP 序列号变化,判断是否拥塞。
举个例子,有一次我调一个 HTTP 长连接的性能,发现吞吐量上不去。打开 IO Graph 一看,每隔 10 秒就有一个明显的「掉坑」——原来是应用层的心跳包和业务请求冲突了。这种问题,不看图根本发现不了。
小技巧:Wireshark 的 Follow TCP Stream 功能(右键 → Follow → TCP Stream)可以还原整个 TCP 会话的内容。调试应用层协议时特别好用。
3.3 本章知识体系
下面这张图总结了我们这章的核心脉络。你可以把它当成一个「抓包调优地图」:
3.4 实战:一次吞吐测试的抓包流程
光说不练假把式。我带你走一遍实际流程:
- 确定抓包点:在客户端还是服务端?我建议两端都抓,方便对比。
- 启动 tcpdump:
tcpdump -i eth0 -nn -s 0 -w test.pcap(-s 0 表示抓完整包) - 运行吞吐测试:比如 iperf3 或者 wrk。
- 停止抓包:Ctrl+C,或者等 -c 参数自动退出。
- 导入 Wireshark:打开 pcap,用
tcp.analysis.flags快速定位异常。
注意:抓包本身会消耗 CPU 和磁盘 IO。在高吞吐场景下(比如 10Gbps),tcpdump 可能丢包。这时候可以考虑用 afpacket 或者 PF_RING 加速。不过那是进阶话题了,我们后面会讲到。