抓包工具:Wireshark、tcpdump、tshark
协议分析第一步,你得有把好锤子——抓包工具。这些年我试过的抓包工具少说也有七八种,但真正能打硬仗的,翻来覆去就这三把:Wireshark、tcpdump、tshark。它们各自擅长什么?什么时候该用哪个?我今天一次说透。
一句话总结:
- 想可视化点一点就抓包、看协议层结构 → Wireshark
- 服务器上没图形界面、低资源消耗、做自动化脚本 → tcpdump
- 既要命令行又想要 Wireshark 的解析能力 → tshark
Wireshark:图形化抓包利器
Wireshark 我用了十年,它几乎是协议分析的行业标准。你想想看,双击就能选网卡,点一下开始就能看到实时流量,每个包的以太网帧、IP头、TCP头、应用层数据一层层展开,比看二进制舒服太多了。
它最让我佩服的是过滤引擎。比如我只想看本机 192.168.1.100 发往 8.8.8.8 的 DNS 查询,直接输入:
ip.src == 192.168.1.100 && ip.dst == 8.8.8.8 && dns
结果瞬间过滤出来。我曾经在线上环境排查一个 DNS 超时问题,就是用 Wireshark 的 dns.time 列快速定位到某台 DNS 服务器响应延迟超过 5 秒,才发现上游链路带宽打满了。
但 Wireshark 也有短板:吃内存。抓大流量包时,我见过它吃掉几个 G 内存然后卡死。所以现在大规模抓包我一般先用 tcpdump 抓完再用 Wireshark 打开。
| 参数 | Wireshark |
|---|---|
| 界面 | 图形化,支持协议树展开 |
| 过滤语法 | 展示过滤器 + 捕获过滤器(BPF) |
| 适用场景 | 交互式分析、协议调试、教学 |
| 消耗 | 内存大,不适合长时间高流量捕获 |
tcpdump:命令行抓包老将
tcpdump 是 Linux 系统自带的老牌工具,说它是工程部署第一选择毫不过分。我习惯直接在服务器上跑一条命令就开始抓,不用管有没有 X11 或显示器:
tcpdump -i eth0 -w capture.pcap port 53
这条命令在 eth0 网卡上抓所有 53 端口的流量,直接写 pcap 文件,CPU 和内存占用极低。我曾经在单台服务器上连续抓 72 小时,文件大小 30 多 G,tcpdump 稳如泰山。
tcpdump 的过滤语法是伯克利包过滤(BPF),表达能力很强但写法不像 Wireshark 那么直观。比如抓 SYN 包:
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
嗯,你得懂一点 TCP 头部偏移才能用好。所以 tcpdump 更适合脚本化、远程、无人值守的场景。
| 参数 | tcpdump |
|---|---|
| 界面 | 命令行,无图形 |
| 过滤语法 | BPF 原始表达式 |
| 适用场景 | 服务器抓包、自动化采集、低资源环境 |
| 消耗 | 低,适合长时间运行 |
tshark:Wireshark 的命令行兄弟
tshark 是 Wireshark 家族的命令行版本。我用它最多的场景是对已抓好的 pcap 文件做二次分析。比如我想快速统计一个文件里所有 HTTP 响应的状态码分布:
tshark -r capture.pcap -Y http.response.code -T fields -e http.response.code | sort | uniq -c
你看,-Y 后面直接写 Wireshark 的展示过滤器语法!这意味着你可以在命令行里用和 Wireshark 一样的过滤逻辑,不用再去记 BPF。
但 tshark 有个小毛病:解析 pcap 时会把整个文件读入内存再分析,文件太大(超过几个 G)时容易爆内存。碰到这种情况,我推荐用 tshark -r file.pcap -w out.pcap 先切分。
| 参数 | tshark |
|---|---|
| 界面 | 命令行,支持管道和脚本 |
| 过滤语法 | 展示过滤器(同 Wireshark) |
| 适用场景 | pcap 离线分析、统计、自动化报告 |
| 消耗 | 中等,大文件需注意内存 |
三个工具怎么选?一张图看懂
抓包时的几个避坑点
小技巧:如果你不确定用什么工具抓,先跑 tcpdump 抓个 10 秒,产生一个几百 KB 的 pcap,拿到本地用 Wireshark 查看。这样既省服务器资源,又能用 Wireshark 的强分析能力。
避坑指南:
- 我曾经用 Wireshark 直接抓线上服务器流量,开了自动解析后 CPU 飙到 100%,导致业务接口响应延迟。记住:生产环境用 tcpdump 抓原始包,别开解析。
- tcpdump 默认只抓前 96 字节(snapshot length)。如果你要分析 HTTP 或 protobuf 负载,务必加参数
-s 0抓全包,否则拿到的是半截数据。 - tshark 对大 pcap 文件的 -Y 过滤速度很快,但不要用 -z 统计模式跑超大文件(几十 G),会耗尽内存。建议先切分成小文件再统计。