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",就必须加双引号。 - 用颜色标记辅助:如果你不确定过滤条件对不对,可以先在显示过滤器里输入,看下面的状态栏。绿色表示语法正确,红色表示有错误。我经常靠这个快速调试。
好了,逻辑运算符和比较运算符就聊这么多。说白了,就是「组合条件」和「数值比较」这两件事。你多练几次,形成肌肉记忆,以后抓包排查的时候,手指会比脑子还快。