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 选择网卡并开始抓包

  1. 打开 Wireshark,看到网卡列表。
  2. 找到你正在用的网卡。如果你连着 Wi-Fi,通常叫 Wi-Fi 或 wlan0;插着网线就是 Ethernet 或 eth0。
  3. 双击网卡名称,Wireshark 立刻开始抓包。你会看到报文像流水一样刷屏。
  4. 想停下来,点工具栏上的红色方块(停止按钮)。
小技巧:刚开始抓包时报文会非常多。你可以先点停止,再设置过滤规则,然后重新开始抓。这样能减少干扰。

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 的接口。双击它就能抓回环包了。

踩坑提醒:我曾经在 Windows 上折腾了半天,发现回环接口就是不出现。后来才发现是 Npcap 安装时没勾选那个选项。重装一遍就好了。记住,安装时一定要仔细看选项。

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 本章知识体系

下面这张图帮你梳理了本章的核心内容。你可以把它当作一个快速索引。

Wireshark 入门知识体系 Wireshark 入门知识体系 安装与配置 抓包操作 过滤规则 Windows / Linux / macOS Npcap / 用户权限 选择网卡 / 开始/停止 保存 .pcapng 文件 显示过滤(常用) 抓包过滤(BPF) 特殊场景:抓取本地回环包 Windows: Npcap Loopback Linux: lo 接口 macOS: lo0 别名 核心思路:先抓全量包,再用显示过滤缩小范围,最后定位问题报文

2.7 本章小结

这一章我们走通了 Wireshark 的完整使用流程:安装、抓包、过滤、保存。还专门讲了怎么抓本地回环包——这个技能在调试本地协议栈时特别有用。

你可能会觉得,这些操作看起来很简单。嗯,确实不难。但真正调试的时候,能不能快速从几千个报文里找到关键的那一个,靠的就是对过滤规则的熟练程度。我建议你花点时间把常用的过滤表达式记下来,最好能盲打出来。