Wireshark 过滤器完全手册:精准过滤提升分析效率
一个几百万包的抓包文件,如果没有过滤器,基本等于没法看。Wireshark 过滤器是把"海量数据"压缩成"几十个关键包"的唯一手段,也是新手和老手之间最直观的能力分水岭。
这份手册把过滤器的语法、字段、配方和踩坑点整理在一起,可以当速查表用。建议配合Wireshark 零基础入门教程一起看,先会用再求精。
一、两种过滤器:先搞清楚用哪个
Wireshark 里有两套完全不同的过滤器,很多人卡在这里。
| 对比项 | 捕获过滤器(Capture Filter) | 显示过滤器(Display Filter) |
|---|---|---|
| 语法 | BPF(伯克利包过滤),与 tcpdump 通用 | Wireshark 自研语法 |
| 生效时机 | 抓包之前,只捕获匹配的包 | 抓包之后,只显示匹配的包 |
| 能否找回 | 被过滤掉的包永久丢失 | 随时清掉条件即可恢复显示全部 |
| 示例 | host 10.0.0.1 and tcp port 443 | ip.addr == 10.0.0.1 && tcp.port == 443 |
| 典型用途 | 长时间抓包、控制文件大小 | 分析阶段定位问题 |
捕获过滤器常用写法
# 指定主机
host 192.168.1.100
# 指定网段
net 192.168.1.0/24
# 指定端口与协议
tcp port 443
udp port 53
# 端口范围
tcp portrange 8000-8100
# 排除某类流量
not arp and not port 22
# 只看 SYN 包(不含 SYN-ACK)
tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) = 0
捕获过滤器写错不会温柔提示,直接抓不到东西。写完先观察界面右下角的包计数是否在涨,这是最直接的验证。
二、显示过滤器语法基础
比较运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
== / eq | 等于 | ip.src == 10.0.0.1 |
!= / ne | 不等于 | http.request.method != "GET" |
> / gt | 大于 | frame.len > 1000 |
< / lt | 小于 | tcp.time_delta < 0.01 |
>= / ge | 大于等于 | tcp.window_size >= 65535 |
&& / and | 逻辑与 | http && ip.src == 10.0.0.1 |
|| / or | 逻辑或 | dns || http |
! / not | 逻辑非 | !arp |
contains | 包含子串 | http contains "login" |
matches | 正则匹配 | http.host matches "^api\." |
in | 属于集合 | tcp.port in {80 443 8080} |
值的写法
- IPv4:
ip.addr == 192.168.1.1,支持 CIDR:ip.addr == 192.168.1.0/24 - 字符串:双引号
http.host == "example.com" - 十六进制:
data.data[0:2] == 0x0800 - 布尔字段:直接写字段名即表示"存在且为真",如
tcp.flags.reset
字段名全部小写。输入时 Wireshark 会自动补全,按 Ctrl+空格 可强制唤出候选列表——记不住字段时靠它比翻文档快得多。
三、按协议速查
TCP / UDP
| 目的 | 过滤器 |
|---|---|
| 某端口的所有流量 | tcp.port == 443 |
| 只看 SYN(连接建立) | tcp.flags.syn == 1 && tcp.flags.ack == 0 |
| 只看 RST(连接被重置) | tcp.flags.reset == 1 |
| 所有重传 | tcp.analysis.retransmission |
| 乱序包 | tcp.analysis.out_of_order |
| 接收窗口为 0 | tcp.analysis.zero_window |
| 有载荷的包(排除纯 ACK) | tcp.len > 0 |
| 握手往返时间 | tcp.time_delta > 0.2 |
HTTP
| 目的 | 过滤器 |
|---|---|
| 所有请求 | http.request |
| 指定方法 | http.request.method == "POST" |
| 服务器错误响应 | http.response.code >= 500 |
| 404 请求 | http.response.code == 404 |
| 指定域名 | http.host contains "example.com" |
| 请求完整 URI | http.request.uri contains "/api/" |
| 含 JSON 的响应 | http.content_type contains "json" |
DNS / TLS / ICMP
| 目的 | 过滤器 |
|---|---|
| 所有 DNS 查询 | dns.flags.response == 0 |
| 解析失败 | dns.flags.rcode != 0 |
| 查询特定域名 | dns.qry.name contains "example.com" |
| TLS Client Hello | tls.handshake.type == 1 |
| TLS 告警 | tls.alert_message |
| 查看访问的域名(SNI) | tls.handshake.extensions_server_name |
| ping 请求 | icmp.type == 8 |
| 目标不可达 | icmp.type == 3 |
四、高级技巧
1. 用时间维度过滤
定位"某个时刻之后开始出问题"时,时间过滤非常有用:
# 抓包开始 30 秒之后的包
frame.time_relative > 30
# 时间区间内
frame.time_relative > 30 && frame.time_relative < 60
# 与上一个包间隔超过 200 毫秒(找卡顿点)
tcp.time_delta > 0.2
2. 按包长过滤
找大包、小包、异常载荷时常用。frame.len > 1400 能快速筛出可能触发分片或 MTU 问题的包;tcp.len == 0 则能找出纯确认包,用于计算 ACK 频率。
3. 字节切片与偏移
需要匹配协议中某个特定字节时用切片语法:
# TCP 载荷前 3 个字节
tcp.payload[0:3] == 47:45:54 # 即 "GET"
# UDP 载荷第 3 个字节为 0x01
udp.payload[2] == 01
# 以太网帧类型字段
eth.type == 0x0800
4. 正则匹配要谨慎
# 匹配 api 开头的子域名
http.host matches "^api\."
# 匹配多种图片后缀
http.request.uri matches "\.(jpg|png|gif)$"
正则在百万级包的文件上会明显变慢。能拆成多个 contains 加 || 的,就别用正则。
5. 过滤器按钮与宏
常用的过滤器输一次就该存下来:在过滤栏输入后点右侧加号,会生成一个可点击的按钮,右键可改名、改颜色。按故障类型建一组(重传、重置、DNS 失败、TLS 告警),排查时连点几下就能扫完全部可能性。
五、诊断类过滤器速查
Wireshark 的 tcp.analysis.* 系列是排查专用字段,基本覆盖了所有 TCP 异常:
| 字段 | 含义 | 通常指向 |
|---|---|---|
tcp.analysis.retransmission | 重传 | 链路丢包 |
tcp.analysis.fast_retransmission | 快速重传 | 少量丢包,TCP 已自愈 |
tcp.analysis.spurious_retransmission | 虚假重传 | 抓包点重复或延迟抖动 |
tcp.analysis.duplicate_ack | 重复 ACK | 接收方未收到后续段 |
tcp.analysis.out_of_order | 乱序 | 多路径路由、无线 |
tcp.analysis.zero_window | 零窗口 | 接收端处理能力不足 |
tcp.analysis.window_full | 窗口满 | 发送被接收端限制 |
tcp.analysis.flags | 任意 TCP 异常 | 快速总览 |
直接输入 tcp.analysis.flags 可以一次性列出所有被标记为异常的包,配合统计 → 会话看哪些会话异常最多。
六、十个实战配方
- 网站打不开:
dns.flags.rcode != 0 || tcp.analysis.retransmission - 页面加载慢:
http && tcp.time_delta > 0.5 - 接口报 5xx:
http.response.code >= 500 - HTTPS 握手失败:
tls.alert_message || tcp.flags.reset == 1 - 疑似被扫描:
tcp.flags.syn == 1 && tcp.flags.ack == 0 && tcp.analysis.retransmission - 内网 ARP 异常:
arp.duplicate-address-detected || arp.opcode == 2 - 找出上传大文件:
http.request.method == "POST" && frame.len > 1400 - 定位某台主机的全部通信:
ip.addr == 192.168.1.50 - 只看异常不看正常:
tcp.analysis.flags && !tcp.analysis.keep_alive - 排除干扰流量:
!arp && !ssdp && !mdns && !nbns
七、常见错误
| 错误写法 | 问题 | 正确写法 |
|---|---|---|
IP.SRC == 10.0.0.1 | 字段名必须小写 | ip.src == 10.0.0.1 |
http.host = example.com | 字符串要加引号 | http.host == "example.com" |
tcp.port = 80 or 443 | 需写完整比较 | tcp.port == 80 || tcp.port == 443 |
host 10.0.0.1 | 这是 BPF 语法,不能用于显示过滤 | ip.addr == 10.0.0.1 |
tcp.flags.syn = 1 | 单个等号是赋值,不合法 | tcp.flags.syn == 1 |
常见问题
下一步
过滤器熟练之后,配合Wireshark 网络故障排除完整指南里的五步定位法,基本能覆盖日常 80% 的排查场景。如果想系统学习从安装到第一次抓包的全过程,可以从零基础入门教程开始。更多中文教程见Wireshark 中文站。

