做网络排障或接口调试时,一打开 Wireshark 就满屏飘红——DNS、ARP、LLMNR、Bonjour、系统心跳包……真正想看的 HTTP 请求反而被埋得严严实实。这不是抓包工具不行,是没用对过滤方法。
先分清两种过滤:捕获 vs 显示
很多人一上来就狂点「Filter」框,结果啥都没看到——那是把显示过滤(Display Filter)当成了捕获过滤(Capture Filter)。两者完全不同:
捕获过滤在数据进内存前就筛掉,省资源、不占磁盘;显示过滤是抓完再筛,适合反复调整。日常调试建议先用捕获过滤压住噪音,再用显示过滤精确定位。
常用捕获过滤写法(libpcap 语法)
启动抓包前,在「Capture Options」→「Capture Filter」里填:
host 192.168.1.100 and port 8080只抓目标 IP 和端口的双向流量;
tcp port 443 and host api.example.com注意:这里 host 后必须是 IP,域名不生效,可先 nslookup api.example.com 查出 IP 再填;
not arp and not icmp and not udp port 53直接干掉 ARP、ICMP 和 DNS,清爽很多。
显示过滤更灵活,调试时主力用它
抓完后,在顶部 Filter 栏输入(支持自动补全):
http.request.method == "POST"只留 POST 请求;
ip.addr == 10.0.2.5 and http查某台测试机发的所有 HTTP 流量;
tcp.stream eq 12点中某个 TCP 包 → 右键「Follow」→「TCP Stream」,Wireshark 会自动给你算出 stream ID,之后输这个就能把整条会话串起来,避开重传、乱序干扰。
几个真实场景的小技巧
开发微信小程序联调时,手机连电脑热点,Wireshark 抓不到 HTTPS 请求?别急着换代理——先加显示过滤:tls.handshake.type == 1 and ip.src == 192.168.137.102
这样能看到手机发起的 TLS 握手请求,确认是否连上了正确后端。
公司内网老有设备发 LLMNR 广播(IP: 224.0.0.252),刷屏严重。捕获过滤直接加一句:not ip multicast
或者更精准:not (ip.dst == 224.0.0.252 or ip.dst == 224.0.0.251)
有时候想排除本机流量,只看外部交互:!ip.src == 192.168.1.5 and !ip.dst == 192.168.1.5
(把 192.168.1.5 换成你本机 IP)
别迷信「过滤」,也看看「着色规则」
Wireshark 的「View」→「Coloring Rules」里,可以把特定协议标成黄色、红色,比如把所有 DNS 标灰、HTTP 标绿。眼睛扫过去,干扰项自动弱化,关键流量跳出来——这比每回敲过滤更快。