首页/网络/抓包与流量分析速查/Wireshark 取反与否定过滤
Wireshark 技巧75 条

Wireshark 取反与否定过滤

用 !(或 not)排除干扰流量:!arp、!(http || dns)、tcp && !tcp.analysis.retransmission,让视图只留下关注对象。

取反运算符

显示过滤器的取反写作 !,也可以写 not。它在排查中的主要价值是排除噪音:只关心传输层就排掉广播类协议,只关心业务流就剔掉扫描器与健康检查。要特别注意优先级,!tcp.port == 80 会被解析成「先对端口字段取反、再与 80 比较」,语义完全错,正确写法是 !(tcp.port == 80)。

基本信息

适用平台Wireshark 显示过滤器语法,各平台一致
语法!表达式 / !(A || B) / 字段 != 值
优先级! 高于比较运算,复合条件必须加括号
常见用途排除协议、排除异常标记、反转状态码条件

典型使用场景

  • 排除广播噪音:!arp && !icmp 让视图只剩业务流量
  • 只看干净数据:tcp && !tcp.analysis.flags 剔除所有带异常标注的包
  • 反转状态码:http.response.code != 200 找出非成功响应
  • 屏蔽干扰主机:!(ip.addr == 10.0.0.5) 排除采集器或扫描器
  • 分层排查:!(http || dns) 先把应用层放一边,专注传输层问题

常用示例

常用示例
!(arp || icmp)                    # 排除广播类噪音
!(ip.addr == 10.0.0.5)           # 剔除指定主机
tcp && !tcp.analysis.flags        # 只看没有被标注异常的 TCP 包
http.response.code != 200         # 非 200 的响应
!(tcp.port == 8080) && tcp        # 排除某个端口,务必带括号

写法对照

写法实际含义结论
!tcp.port == 80(!tcp.port) == 80语义错误或恒假
!(tcp.port == 80)端口不等于 80正确
! http.host字段缺失也算真会命中所有非 HTTP 包
http.response.code != 200响应码非 200正确,但不含无响应码的包
否定条件对「字段缺失」的包同样为真,所以 !http.host 会把所有非 HTTP 流量都算进去。写这类过滤时通常要再加一个协议条件,把候选集框在想要的范围内。
长时间只靠排除法分析,会漏掉「不存在的证据」——被排除的流量里可能恰好藏着线索。对重要结论要换回正向条件复核一遍,确认不是自己把关键报文滤掉了。
对 tcp.analysis 这类由 Wireshark 计算出来的字段取反要格外谨慎:它们只在程序判定存在异常时才被赋值,!tcp.analysis.retransmission 实际会连所有与重传无关的包一起命中,范围远比直觉更大。

易错点

  • 否定条件对字段缺失的包同样为真(如 !http.host 会命中所有非 HTTP 包)
  • 长时间依赖排除法分析会漏掉"不存在的证据",重要结论用正向条件复核
  • 复合条件忘了加括号会得到语义完全不同的结果,且过滤器不一定报错
  • 用 != 过滤数值字段时,缺该字段的包不会出现,统计总数时容易与预期不符

数据来源与参考

  • Wireshark User's Guide(过滤器语法)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌