4. 显示过滤器进阶:逻辑运算符与比较运算符

好,咱们继续往下聊。上一节我们把显示过滤器的基础用法过了一遍,说白了就是教你怎么「搜」到想要的数据包。但实际抓包的时候,你很快会发现一个问题——光靠单个条件根本不够用。

举个例子。你只想看 192.168.1.1 发给 8.8.8.8 的 DNS 查询,或者只想看 HTTP 协议里状态码是 404 的那些响应。这时候,你就得把多个条件组合起来。嗯,这就是我们今天要聊的——逻辑运算符和比较运算符。

4.1 逻辑运算符:and、or、not

这三个词,你写代码的时候肯定天天见。在 Wireshark 里,它们的作用一模一样:把多个过滤条件串起来。

  • and(也可以写成 &&):两个条件都满足,才显示。
  • or(也可以写成 ||):两个条件满足其一,就显示。
  • not(也可以写成 !):取反,不满足条件的才显示。

我个人习惯用英文单词,因为可读性更好。你想想看,过几个月回头翻自己的过滤表达式,ip.src == 1.1.1.1 and dns 一眼就能看懂,换成 &&|| 反而得多想半秒。

实战场景:

我在项目中遇到过一个问题:某台服务器间歇性丢包,但又不是全丢。我当时的过滤条件是:

ip.addr == 10.0.0.5 and tcp.analysis.lost_segment

这样就能只看那台服务器相关的重传和丢包事件,其他机器的流量全部过滤掉。排查效率直接翻倍。

4.2 比较运算符:==、!=、>、<

比较运算符,说白了就是「等于、不等于、大于、小于」。在 Wireshark 里,它们的使用场景比你想的要多。

运算符含义示例
==等于ip.src == 192.168.1.1
!=不等于ip.src != 192.168.1.1
>大于frame.len > 1000
<小于tcp.window_size < 65535
>=大于等于ip.ttl >= 64
<=小于等于udp.length <= 500

这里有个容易踩的坑——等于号是双等号。单等号在 Wireshark 里是赋值,不是比较。我刚开始用的时候也犯过这错,写了个 ip.src = 1.1.1.1,结果啥都没显示,还以为是软件坏了。

避坑指南:

我曾经在排查一个 HTTP 慢响应问题时,想过滤出响应时间超过 5 秒的包。一开始我写的是:

http.time > 5

结果发现不对——http.time 的单位是秒,但 Wireshark 里有些时间字段的单位是微秒。后来我改成:

http.time > 5000000

才抓到那些慢得像蜗牛的响应。所以,用比较运算符之前,一定先确认字段的单位是什么。

4.3 组合使用:逻辑 + 比较

这两个东西组合起来,才是真正的杀手锏。你可以写出非常精确的过滤条件。

比如,我只想看 从外网发来的、长度大于 1500 字节的 TCP 数据包

ip.src != 192.168.0.0/16 and tcp and frame.len > 1500

再比如,我想排除所有广播包和组播包,只看单播:

not (eth.dst == ff:ff:ff:ff:ff:ff or eth.dst[0] & 1 == 1)

嗯,第二个例子稍微有点复杂。简单解释一下:eth.dst[0] & 1 == 1 是判断目的 MAC 地址的第一个字节最低位是否为 1,如果是,那就是组播或广播地址。加上 not 之后,就只剩下单播了。

我的小技巧:

写复杂过滤条件时,我习惯先用括号把逻辑分组写清楚。就像写代码一样,括号不花钱,多写几个不会亏。比如:

(ip.src == 10.0.0.1 or ip.src == 10.0.0.2) and (tcp.port == 80 or tcp.port == 443)

这样一眼就能看出:源 IP 是这两台机器之一,并且端口是 80 或 443。不加括号的话,优先级搞混了,结果可能完全不一样。

4.4 常见误区与调试技巧

最后,分享几个我踩过的坑,你遇到了可以少走弯路。

  • 字段名大小写:Wireshark 的显示过滤器是大小写不敏感的,但协议字段名是大小写敏感的。比如 IP.SRC 不行,得写成 ip.src
  • 字符串要加引号:比较字符串值时,比如 http.request.method == GET,GET 不用加引号。但如果是带空格的字符串,比如 http.user_agent == "Mozilla/5.0",就必须加双引号。
  • 用颜色标记辅助:如果你不确定过滤条件对不对,可以先在显示过滤器里输入,看下面的状态栏。绿色表示语法正确,红色表示有错误。我经常靠这个快速调试。

好了,逻辑运算符和比较运算符就聊这么多。说白了,就是「组合条件」和「数值比较」这两件事。你多练几次,形成肌肉记忆,以后抓包排查的时候,手指会比脑子还快。