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),双击开始抓。主窗口分三块:
几个关键操作:
左上蓝色鲨鱼鳍 = 开始抓包,红色方块 = 停止;
顶部绿色输入框 = 显示过滤器,输入即时生效;
右键某个包 → Follow → TCP/HTTP Stream,把整段会话拼成可读文本,这是最常用的一个功能;
Statistics → Protocol Hierarchy看协议占比,Conversations看谁跟谁聊了多少字节,I/O Graph看流量随时间变化。
四、两种过滤器(最容易搞混的地方)
Wireshark 有两套完全不同的过滤语法,不可互换,这是新手第一大坑:
经验法:流量大就用捕获过滤器先把无关流量挡掉(避免丢包、避免文件爆炸),流量小就直接抓、然后慢慢用显示过滤器筛。
显示过滤器速查:
五、速查表
tshark(命令行版)
tcpdump(服务器上更常见)
六、五个真实场景
场景 1:接口慢,到底是慢在哪
这是最经典的一个。按顺序看:
DNS 慢? 抓
dns过滤,看查询发出到收到响应之间隔了多久。如果这里就几百毫秒,问题在解析环节,跟你的服务无关;TCP 建连慢? 找到 SYN 包,看 SYN → SYN-ACK 的间隔。跨地域机房这一跳慢很正常(比如重庆访问北京节点);
TLS 协商慢? 看 Client Hello → Server Hello 的往返次数和耗时;
服务端处理慢? 看请求发完到第一个响应字节的间隔,Wireshark 直接给了
http.time字段;传输慢? 看
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 去哪读:
设置环境变量,例如
SSLKEYLOGFILE=/tmp/sslkeys.log(浏览器需通过启动参数或系统环境变量生效);Wireshark 里
Preferences → Protocols → TLS → (Pre)-Master-Secret log filename指向同一个文件;重新抓包,原本的 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
这只能用于你自己的客户端与你有权调试的服务。对别人流量做解密抓包是另一回事。
八、常见坑
九、上手路径
第一天:装好、配好权限,抓一次自己的 ping 和 DNS 查询,熟悉三个面板;
第二天:练显示过滤器——
ip.addr、tcp.port、http.request这三组能覆盖大半日常;第一周:拿一个自己写的接口,抓一次完整请求,用 Follow TCP Stream 看一遍原文,建立"包长什么样"的直觉;
第二周:学会
-f和-Y的分工,以及在服务器上用 tcpdump 抓、本地分析这套流程;再往后:遇到重传、握手失败、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 参考为准。