背景
一般常用软件的自动更新推送,我习惯上是来者不拒,但很少关注软件版本更新说明。前两天也是第一时间更新了 Wireshark Version 3.6.0 ,同样没注意有什么变动,还是朋友聊天提醒说是更新版本 3.6.0,并发来一堆发布说明,仔细瞅了瞅,看到了以下一条说明:
The expression “a != b” now always has the same meaning as “!(a == b)”. In particular this means filter expressions with multi-value fields like “ip.addr != 1.1.1.1” will work as expected (the result is the same as typing “ip.src != 1.1.1.1 and ip.dst != 1.1.1.1”). This avoids the contradiction (a == b and a != b) being true.
之前个人专栏也写过一篇文章 《Wireshark 提示和技巧 | 显示过滤之 a 不等于 b》
Wireshark Version 3.6.0 终于把这个 != 的显示过滤逻辑给更新了。(🤣 估计吐槽太多 )
另本文标题原为:《Wireshark 提示和技巧 | !(ip.addr == x.x.x.x) 和 (ip.addr != x.x.x.x) 再无区别》,CSDN 标题禁止词 ! 🤣
说明
版本 3.6.0 之前 “a != b”不完全等同于“!(a == b)”
在具有多值字段的显示过滤表达式中,譬如 ip.addr != 1.2.3.4,并不会显示所有不包含 IP 地址 1.2.3.4 的数据包,因为 IP 数据包包含源和目的 IP 地址,当两个地址中至少有一个与 1.2.3.4 不同时,表达式的值将为 True 。在显示过滤器栏中为 黄色显示(正确的应为 绿色显示 ),表示过滤表达式被接受,但可能无法按预期工作 !
而 !(ip.addr == 1.2.3.4) ,才是正确显示所有不包含 IP 地址 1.2.3.4 数据包的过滤表达式。
版本 3.6.0 之后 “a != b”完全等同于“!(a == b)”
在具有多值字段的显示过滤表达式中,譬如 ip.addr != 1.2.3.4,等同于 ip.src != 1.2.3.4 and ip.dst != 1.2.3.4 ,等同于 !(ip.addr == 1.2.3.4) ,均显示所有不包含 IP 地址 1.2.3.4 的数据包。当两个地址中都与 1.2.3.4 不同时,表达式的值将为 True 。在显示过滤器栏中为正确的 绿色显示 !
实例
仍以 TCP 三次握手的数据包做一个简单实例演示,如下:
显示过滤器中应用 ip.addr == 10.0.0.1
,正确过滤所需数据包。
绿色显示,表达式被接受,正常过滤。
显示过滤器中应用 !(ip.addr == 10.0.0.1)
,正确过滤所需数据包。
显示过滤器中应用 ip.addr != 10.0.0.1
,Version 3.6.0 确实能正确过滤所需数据包。
对比 Version 3.6.0 之前的版本,未能按预期过滤所需数据包,仍然存在 IP 地址为 10.0.0.1 的数据包。
黄色显示,表达式被接受,但可能无法按预期过滤。
扩展
那么在新版本之后,是否仍然有方法达到之前版本中具有多值字段下的 != 过滤效果呢,如下说明:
It is possible to use the syntax “a ~= b” or “a any_ne b” to recover the previous (inconsistent with “==”) logic for not equal.
可以使用 ~= 或 any_ne 。
显示过滤器中应用 ip.proto ~= tcp
,不等于效果,正确过滤所需数据包。
而在具有多值字段的情况下,应用 ip.addr ~= 10.0.0.1
或 ip.addr any_ne 10.0.0.1
,仍是存在 IP 地址为 10.0.0.1 的数据包,结果和之前版本保持一致。
即在具有多值字段的情况下,只要有一个值字段不匹配,表达式的值将为 True 。
感谢阅读,更多技术文章可关注个人公众号:Echo Reply ,谢谢。