Wireshark 是抓包分析领域的事实标准,开箱支持 3000+ 种协议解析。它做三件事:从网卡抓原始数据包 → 按协议逐层解析 → 结构化地展示给你看。配套的命令行版本 tshark 可以让它在服务器、脚本、CI 里干活。

上一篇写的是 Bruno(主动发请求),这篇写它的反面——看真实流量。一个是构造请求,一个是观察结果,两者合起来才是一套完整的调试闭环。

⚠️ 先说法务边界:只能在你自己拥有、或已获得明确书面授权监控的网络上抓包。抓别人的网络流量,在多数国家和地区都可能触犯法律。本文所有例子都假设是自家网络、自有服务器或实验环境。


一、为什么是它

有些问题,日志和断点根本给不出答案:

  • 接口"就是慢",但不知道慢在 DNS 解析、TCP 握手、TLS 协商,还是服务端处理;

  • 客户端报连接超时,服务端日志里连一条请求记录都没有;

  • TLS 握手失败,两边都说是对方的问题;

  • 偶发丢包导致重传,压测才能复现,本地怎么都调不出来;

  • 第三方 SDK 到底有没有把数据发出去、发到哪个域名。

Wireshark 的价值在于:它不依赖任何一方的日志和自述,直接看线路上真实经过的字节。 一个原始以太网帧本来只是一串十六进制,而 Wireshark 会告诉你:"这是以太头,里面是 IPv4 包,里面是 TCP 段,里面是一个发往 /login 的 HTTP POST。"

原始数据变成信息,扯皮就结束了。


二、安装与权限配置

抓包需要驱动级权限,这也是 90% 新手"装好了却抓不到包"的原因。

Windows

从官网下载安装包(x64 / Arm64),安装过程中务必勾选安装 Npcap——它是 Windows 上的抓包驱动,WinPcap 早已停止维护。当前 Npcap 已到 1.88(2026 年 5 月发布)。

如果机器上有老软件依赖旧驱动接口,勾上 Install Npcap in WinPcap API-compatible Mode;要直接抓 802.11 无线帧(监听模式)再勾对应的选型,注意绝大多数笔记本内置网卡不支持监听模式。

macOS

下载 .dmg 拖进 Applications。第一次启动会申请安装 ChmodBPF 辅助工具并要管理员密码——这是给你免 sudo 抓包用的,答应它。之后在 系统设置 → 隐私与安全性 里确认 Wireshark 有网络监控权限。

Linux

# Debian / Ubuntu
sudo apt install wireshark
# Fedora
sudo dnf install wireshark
# Arch
sudo pacman -S wireshark-qt

安装时会弹窗问"是否允许非超级用户抓包",选 Yes。它会自动给 dumpcap 配置 Linux capabilities。然后把自己加进 wireshark 组:

sudo usermod -aG wireshark $USER
# 重新登录或重启后生效,验证:
groups | grep wireshark

如果弹窗时选了 No,或者界面里网卡列表是空的、灰的,手动补上:

sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
# 验证,应输出 ... cap_net_admin,cap_net_raw=eip
getcap /usr/bin/dumpcap

别用 root 跑 Wireshark 的图形界面。它是个复杂程序,历史上协议解析器出过不少漏洞;万一打开一个恶意构造的 pcap 触发漏洞,以 root 运行就是把整个系统交出去。用 wireshark 组 + capabilities 是标准做法。


三、界面:三个面板

启动后先选网卡(通常有线是 eth0、无线是 wlan0,本机内部通信看 lo),双击开始抓。主窗口分三块:

面板

内容

抓包列表(上)

每个包一行:序号、时间、源、目的、协议、长度、摘要

协议详情(中)

选中包展开成协议层级:Ethernet → IP → TCP → HTTP,可逐层点开

原始字节(下)

十六进制。点中间某个字段,这里会高亮对应字节

几个关键操作:

  • 左上蓝色鲨鱼鳍 = 开始抓包,红色方块 = 停止;

  • 顶部绿色输入框 = 显示过滤器,输入即时生效;

  • 右键某个包 → Follow → TCP/HTTP Stream,把整段会话拼成可读文本,这是最常用的一个功能;

  • Statistics → Protocol Hierarchy 看协议占比,Conversations 看谁跟谁聊了多少字节,I/O Graph 看流量随时间变化。


四、两种过滤器(最容易搞混的地方)

Wireshark 有两套完全不同的过滤语法,不可互换,这是新手第一大坑:

捕获过滤器

显示过滤器

生效时机

抓包之前,在网卡层丢弃

抓包之后,只影响显示

语法

BPF(和 tcpdump 一样)

Wireshark 自有语法

位置

抓包选项里填

顶部绿色输入框

能否中途改

不能,要重抓

随时改

典型写法

tcp port 80

tcp.port == 80

经验法:流量大就用捕获过滤器先把无关流量挡掉(避免丢包、避免文件爆炸),流量小就直接抓、然后慢慢用显示过滤器筛。

显示过滤器速查

目的

写法

某个 IP 相关

ip.addr == 192.168.1.100

某个源 / 目的 IP

ip.src == 10.0.0.5 / ip.dst == 10.0.0.5

某个端口

tcp.port == 8080

只要 HTTP 请求

http.request

某个方法

http.request.method == "POST"

4xx / 5xx 响应

http.response.code >= 400

按域名过滤 DNS

dns.qry.name contains "example.com"

TLS 握手 Client Hello

tls.handshake.type == 1

只看 SYN(建连尝试)

tcp.flags.syn == 1 and tcp.flags.ack == 0

重传

tcp.analysis.retransmission

重复 ACK(拥塞/丢包)

tcp.analysis.duplicate_ack

排除背景噪音

!(arp or icmp or dns)

限定时间窗

frame.time >= "2026-09-16 12:00:00"


五、速查表

tshark(命令行版)

命令

说明

tshark -D

列出可用网卡

sudo tshark -i eth0 -f "tcp port 8080" -w out.pcapng

按捕获过滤器抓包存文件

sudo tshark -i eth0 -b filesize:102400 -b files:10 -w cap.pcapng

环形缓冲:10 个 100MB 文件滚动覆盖

sudo tshark -i eth0 -a duration:60

抓 60 秒自动停

tshark -r cap.pcapng -Y "http.request"

读文件 + 显示过滤器

tshark -r cap.pcapng -Y "..." -w filtered.pcap

把筛出来的包另存一份

tshark -r cap.pcapng -T fields -e ip.src -e tcp.dstport -E header=y -E separator=,

导出指定字段为 CSV,方便丢给 awk / jq / pandas

tshark -r cap.pcapng -q -z follow,tcp,ascii,0

还原第 0 号 TCP 流为文本

tshark -r cap.pcapng -q -z conv,ip

会话统计(谁跟谁流量最大)

tshark -r cap.pcapng -q -z io,phs

协议层级统计

tshark -r cap.pcapng --export-objects http,./out/

把 HTTP 传输的文件导出到目录

tshark -r cap.pcapng -V -c 1

看第一个包的完整解析

tcpdump(服务器上更常见)

命令

说明

sudo tcpdump -i any -nn -s0 -w out.pcap 'tcp port 8080'

抓包存文件,-nn 不解析域名/服务名

sudo tcpdump -i eth0 -nn 'host 10.0.0.5 and port 443'

按主机 + 端口抓

sudo tcpdump -i any -nn icmp

只看 ping

sudo tcpdump -i any -nn 'port 53'

看 DNS 查询

sudo tcpdump -U -s0 -w - 'not port 22'

输出到标准输出(配合 SSH 管道)


六、五个真实场景

场景 1:接口慢,到底是慢在哪

这是最经典的一个。按顺序看:

  1. DNS 慢?dns 过滤,看查询发出到收到响应之间隔了多久。如果这里就几百毫秒,问题在解析环节,跟你的服务无关;

  2. TCP 建连慢? 找到 SYN 包,看 SYN → SYN-ACK 的间隔。跨地域机房这一跳慢很正常(比如重庆访问北京节点);

  3. TLS 协商慢? 看 Client Hello → Server Hello 的往返次数和耗时;

  4. 服务端处理慢? 看请求发完到第一个响应字节的间隔,Wireshark 直接给了 http.time 字段;

  5. 传输慢?tcp.window_size、有没有重传、有没有重复 ACK。

一条命令拉出所有 HTTP 请求的耗时:

tshark -r cap.pcapng -Y "http.response" -T fields \
  -e http.host -e http.request.uri -e http.response.code -e http.time

场景 2:TLS 握手失败 / 想知道连的是哪个域名

握手失败的现场证据全在包里。看 SNI(服务器名称指示)就知道客户端实际请求的域名——在排查"证书不匹配""请求打到了错误的 SLB 节点"这类问题时特别有用

tshark -r cap.pcapng -Y "tls.handshake.type == 1" \
  -T fields -e ip.dst -e tls.handshake.extensions_server_name | sort -u

如果只有 Client Hello 没有 Server Hello,甚至对方直接回 RST,那问题基本在 TLS 层之前(端口不通、被防火墙拦、SNI 被阻断)。

场景 3:偶发丢包与重传

压测或生产上偶发的"慢一下",抓包是唯一能定性的手段:

tcp.analysis.retransmission       ← 重传,说明包丢了
tcp.analysis.duplicate_ack        ← 重复 ACK,通常是接收端在喊"我没收到"
tcp.analysis.ack_rtt              ← 往返时延

这类包在抓包列表里会被 Wireshark 用黑色高亮标出来。重传集中在某一侧,问题通常就在那条链路上——是本地出口、中间链路,还是对端机房,能清晰区分开。

场景 4:服务器抓包,本地分析(运维最常用)

生产服务器上不方便装图形界面,标准做法是在服务器上用 tcpdump 抓、拉回本地用 Wireshark 慢慢看:

# 服务器上:抓 60 秒、只留 8080 端口、写到文件
sudo tcpdump -i any -nn -s0 -c 20000 -w /tmp/cap.pcap 'tcp port 8080'

# 或者远程实时流式抓包,本地 Wireshark 直接看(不需要落盘)
ssh user@server "sudo tcpdump -U -s0 -w - 'not port 22'" | wireshark -k -i -

第二种很爽:服务器这边一条命令都不留,本地图形界面实时出包。注意 -U 让输出不缓冲否则会卡顿,not port 22 排除掉 SSH 自己的流量免得自我循环。

服务器只装命令行版也行:

sudo apt install tshark      # 或 sudo yum install wireshark-cli

场景 5:从抓包里捞出文件和完整会话

排查问题时,"把整个会话原文打出来"往往比逐包看快得多:

# 还原第 0 号 TCP 流为可读文本
tshark -r cap.pcapng -q -z follow,tcp,ascii,0

# 把 HTTP 传输过的文件(图片、脚本、下载内容)导出来
tshark -r cap.pcapng --export-objects http,./http-objects/

图形界面里就是右键 → Follow → TCP Stream,效果一样,还能切换查看方向。


七、进阶:解密 HTTPS

Wireshark 本身不破解 TLS。它能解密的前提是:你拿到了会话密钥。

做法是让浏览器或程序把密钥导出到文件(SSLKEYLOGFILE),再告诉 Wireshark 去哪读:

  1. 设置环境变量,例如 SSLKEYLOGFILE=/tmp/sslkeys.log(浏览器需通过启动参数或系统环境变量生效);

  2. Wireshark 里 Preferences → Protocols → TLS → (Pre)-Master-Secret log filename 指向同一个文件;

  3. 重新抓包,原本的 TLS 流量就会显示出明文 HTTP/2 内容。

命令行等价写法:

tshark -r cap.pcapng \
  -o "tls.keylog_file:/tmp/sslkeys.log" \
  -Y "http2 or http" \
  -T fields -e http2.header.name -e http2.header.value

这只能用于你自己的客户端与你有权调试的服务。对别人流量做解密抓包是另一回事。


八、常见坑

现象

原因 / 解法

网卡列表是空的 / 抓不到包

Windows 没装 Npcap;Linux 没进 wireshark 组或 dumpcap 没有 capabilities;macOS 没授权。对照第二节

过滤器写法不生效

-f(BPF)和 -Y(显示过滤器)语法不同,不能混用;捕获过滤器语法写错通常是直接不抓包

抓包丢包严重、结果不可信

高流量下只用 -Y 会导致丢包。先用 -f 在网卡层挡掉无关流量

磁盘被 pcap 撑爆

用环形缓冲 -b filesize:102400 -b files:10,或 -a duration:60 限时

抓不到别的机器的流量

交换网络下默认只能看到和自己相关的流量,需要交换机端口镜像(SPAN)或在本机抓

多网卡环境抓错网卡

不确定就用 -i any,或先 tshark -D 列出所有接口

打开来路不明的 pcap 有风险

解析器有漏洞历史(如 ROHC、MACsec),及时升级到最新版本,且别用 root 打开


九、上手路径

  1. 第一天:装好、配好权限,抓一次自己的 ping 和 DNS 查询,熟悉三个面板;

  2. 第二天:练显示过滤器——ip.addrtcp.porthttp.request 这三组能覆盖大半日常;

  3. 第一周:拿一个自己写的接口,抓一次完整请求,用 Follow TCP Stream 看一遍原文,建立"包长什么样"的直觉;

  4. 第二周:学会 -f-Y 的分工,以及在服务器上用 tcpdump 抓、本地分析这套流程;

  5. 再往后:遇到重传、握手失败、SNI 异常时能立刻想到该看哪个字段——这时候它就从"玩具"变成了工具箱里的主力。

一句话总结:日志告诉你程序认为发生了什么,抓包告诉你线路上真正发生了什么。 两者不一致的地方,就是 bug 藏身之处。


参考

  • 官网与下载:https://www.wireshark.org/download.html

  • 官方用户手册:https://www.wireshark.org/docs/wsug_html_chunked/

  • 显示过滤器参考:https://www.wireshark.org/docs/dfref/

  • 抓包过滤器(BPF)语法:https://www.tcpdump.org/manpages/pcap-filter.7.html

  • tshark 手册:https://www.wireshark.org/docs/man-pages/tshark.html

本文基于 2026 年 Wireshark 4.x(4.7.2 / 4.6.x 稳定分支)与 Npcap 1.88 编写。过滤器字段名请以官方 dfref 参考为准。