两套过滤器分别管什么
Wireshark/tshark 有两套互不兼容的过滤器:捕获过滤器用 BPF 语法(与 tcpdump 完全一致),在抓包那一刻生效,直接决定内核丢弃哪些包;显示过滤器用字段式语法,作用在已经抓到的数据上,随时可改。关键差别在于可逆性——显示过滤器写错了改一下就行,捕获过滤器写窄了,没抓到的包再也救不回来。
基本信息
| 捕获过滤器语法 | tcp port 443 and host 10.0.0.5(BPF,pcap-filter 语法) |
|---|---|
| 显示过滤器语法 | tcp.port == 443 && ip.addr == 10.0.0.5 |
| 生效时机 | 捕获过滤器在抓取时;显示过滤器在加载后 |
| 对性能的影响 | 捕获过滤器收窄后能显著降低内核拷贝与丢包率 |
| tshark 参数 | -f 指定捕获过滤器,-Y 指定显示过滤器,两者可同时用 |
典型使用场景
- 生产环境长时间抓包:必须用捕获过滤器把量压到可承受范围,否则丢包严重
- 分析别人给的 pcap:不能改捕获条件,只能靠显示过滤器逐层精筛
- 复现偶发故障:先用较宽的捕获条件捞全,再用显示过滤器反复切角度分析
- 大流量排查只要握手包:捕获写 tcp port X,显示再叠 tcp.flags.syn == 1
- 区分两层责任:确认包里到底有没有某字段(捕获决定),还是只是没显示(显示决定)
对应写法与组合
对应写法与组合
# 捕获过滤器(BPF,与 tcpdump 语法一致):
tcp port 443 and host 10.0.0.5
# 显示过滤器(Wireshark 字段语法):
tcp.port == 443 && ip.addr == 10.0.0.5
# 只显示 TCP 握手包
tcp.flags.syn == 1 && tcp.flags.ack == 0
# tshark 同时使用两者:-f 捕获,-Y 显示
tshark -i eth0 -f 'tcp port 443' -Y 'tls.handshake.type == 1' -c 50
# 从已有文件里读并精筛
tshark -r capture.pcap -Y 'http.response.code >= 500' -T fields -e frame.time -e ip.src -e http.response.code两套过滤器对照
| 方面 | 捕获过滤器 | 显示过滤器 |
|---|---|---|
| 语法风格 | BPF:逻辑词 and/or/not | 字段式:==、&&、||,支持 in 与正则 |
| 生效时机 | 抓包时,由内核执行 | 加载后,由 Wireshark 执行 |
| 能否事后修改 | 不能,未捕获的包永久丢失 | 随时可改,不影响已抓数据 |
| 主要用途 | 控制抓取范围、降低丢包 | 分析定位、逐层收窄 |
| 常见错误 | 填了字段式语法导致报错或抓不到 | 把捕获语法填进显示栏直接标红 |
分析时发现「需要的包不在文件里」,先怀疑捕获过滤器写窄了或抓错点位,而不是急着怀疑对端没发包。