2、抓包工具入门:Wireshark 基础使用、过滤规则、抓取本地回环包
做协议栈开发,说白了就是跟各种报文打交道。设备入网失败、数据丢包、协议交互卡死——这些问题光靠看日志,很多时候根本看不出名堂。这时候,Wireshark 就是我最顺手的“照妖镜”。
这一章,我带你快速上手这个工具。不扯那些用不着的理论,直接讲怎么装、怎么用、怎么抓本地回环包。你跟着操作一遍,后面调试协议栈的时候会省很多力气。
2.1 为什么非要用 Wireshark?
你可能觉得,看日志不也能定位问题吗?嗯,日志确实能告诉你“发生了什么”,但很难告诉你“报文长什么样”。
举个例子。有一次我调试 CoAP 协议,设备一直入网失败。日志里只显示“响应超时”。我折腾了半天,最后用 Wireshark 一抓包才发现——服务器返回的 Token 字段长度错了,客户端解析直接跳过。这种问题,看日志根本看不出来。
Wireshark 能让你看到最原始的二进制报文,还能帮你解析协议字段。对于嵌入式通信调试来说,它是必备工具。
2.2 安装与初始配置
安装没什么难度,但有几个坑我得提前跟你说。
2.2.1 下载与安装
- Windows:去官网下载安装包,一路 Next。注意安装时会提示安装 Npcap,一定要勾选。没有 Npcap,Wireshark 抓不了包。
- Linux:直接用包管理器装。Ubuntu 下执行
sudo apt install wireshark。安装过程中会问是否允许非 root 用户抓包,我建议选“是”,省得每次都要 sudo。 - macOS:用 Homebrew 装,
brew install wireshark。装完可能需要授权安装 ChmodBPF,按提示操作就行。
wireshark 用户组(Linux/macOS)。否则你打开 Wireshark 会发现网卡列表是空的。我曾经在这上面浪费了十分钟,还以为是软件装坏了。
2.2.2 界面速览
打开 Wireshark,你会看到三个主要区域:
| 区域 | 作用 |
|---|---|
| 网卡列表 | 显示所有可抓包的网络接口。双击某个接口就开始抓包。 |
| 报文列表 | 抓到的所有报文按时间顺序排列。每一行是一个包。 |
| 报文详情 | 选中某个报文后,这里会分层显示协议字段。这是最常用的区域。 |
我个人习惯先把界面语言改成英文。因为很多协议字段的中文翻译不太准确,而且网上查资料时英文术语更通用。改法:菜单栏 View → Display → Language → English。
2.3 抓包实操:从网卡到报文
理论说完了,咱们直接上手抓一把。
2.3.1 选择网卡并开始抓包
- 打开 Wireshark,看到网卡列表。
- 找到你正在用的网卡。如果你连着 Wi-Fi,通常叫
Wi-Fi或wlan0;插着网线就是Ethernet或eth0。 - 双击网卡名称,Wireshark 立刻开始抓包。你会看到报文像流水一样刷屏。
- 想停下来,点工具栏上的红色方块(停止按钮)。
2.3.2 保存抓包结果
抓完包记得保存。按 Ctrl+S,选择保存路径。默认格式是 .pcapng。我建议你养成习惯,每次调试都保存一份原始抓包文件。万一后面发现漏看了什么,还能回头重新分析。
2.4 过滤规则:从海量报文中找到目标
不夸张地说,过滤规则是 Wireshark 最核心的功能。没有过滤,你就是在垃圾堆里找针。
Wireshark 有两种过滤:抓包过滤和显示过滤。我重点讲显示过滤,因为平时用得最多。
2.4.1 显示过滤(最常用)
显示过滤是在已经抓到的报文里筛选。你在界面上方的过滤栏里输入表达式,按回车,符合条件的报文就留下了。
常用的过滤表达式:
| 过滤表达式 | 作用 |
|---|---|
ip.addr == 192.168.1.100 |
只看某个 IP 的报文(源或目标) |
tcp.port == 5683 |
只看某个 TCP/UDP 端口的报文 |
udp |
只看 UDP 报文 |
icmp |
只看 ICMP 报文(比如 ping) |
http |
只看 HTTP 报文 |
dns |
只看 DNS 查询和响应 |
!arp |
排除 ARP 报文(ARP 通常很吵) |
多个条件可以组合:
ip.addr == 192.168.1.100 and tcp.port == 5683—— 与关系udp or icmp—— 或关系not arp—— 非关系
ip.addr == 设备IP 过滤出所有相关报文,再根据协议类型进一步缩小范围。比如 CoAP 协议用 coap,MQTT 用 mqtt。Wireshark 能自动识别很多应用层协议,非常方便。
2.4.2 抓包过滤(了解即可)
抓包过滤是在抓包之前就设置好,只抓符合条件的报文。语法和显示过滤不同,用的是 BPF(Berkeley Packet Filter)语法。比如:
host 192.168.1.100
port 5683
udp
我个人很少用抓包过滤。因为一旦设置错了,漏掉的报文就再也找不回来了。显示过滤更灵活,随时可以调整。
2.5 抓取本地回环包
调试设备入网协议时,很多时候你是在开发板上跑服务端,在 PC 上用客户端工具测试。但也有一些场景,客户端和服务端都在同一台机器上。这时候就需要抓本地回环包。
回环地址是 127.0.0.1 或 localhost。默认情况下,Wireshark 抓不到回环接口上的报文。原因很简单:回环流量不经过物理网卡。
2.5.1 Windows 下抓回环包
Windows 下需要安装 Npcap,并且在安装时勾选 "Install Npcap in WinPcap API-compatible Mode"。装好之后,Wireshark 的网卡列表里会出现一个叫 Npcap Loopback Adapter 的接口。双击它就能抓回环包了。
2.5.2 Linux 下抓回环包
Linux 下简单得多。Wireshark 的网卡列表里会有一个叫 lo 或 Loopback 的接口。双击它就能抓。如果看不到,检查一下当前用户有没有权限。
2.5.3 macOS 下抓回环包
macOS 稍微麻烦一点。需要先创建一个虚拟接口:
sudo ifconfig lo0 alias 127.0.0.2 up
然后 Wireshark 里选择 lo0 接口抓包。注意,macOS 的回环抓包有时会漏掉一些报文,我建议你尽量在 Linux 或 Windows 上做回环测试。
2.6 本章知识体系
下面这张图帮你梳理了本章的核心内容。你可以把它当作一个快速索引。
2.7 本章小结
这一章我们走通了 Wireshark 的完整使用流程:安装、抓包、过滤、保存。还专门讲了怎么抓本地回环包——这个技能在调试本地协议栈时特别有用。
你可能会觉得,这些操作看起来很简单。嗯,确实不难。但真正调试的时候,能不能快速从几千个报文里找到关键的那一个,靠的就是对过滤规则的熟练程度。我建议你花点时间把常用的过滤表达式记下来,最好能盲打出来。