提抓包,很多人第一反应是命令行、十六进制、满屏看不懂的协议。Wireshark 其实没这么玄乎,它本质就是一个图形化的协议分析器,把网卡上经过的数据帧解包、还原成人们能读懂的层次结构。我日常排查网页加载慢、接口超时、设备掉线这类问题,十次里有八次会先打开 Wireshark 看一眼。这篇文章不按官方手册的顺序讲,而是按一个新手下载安装之后最容易产生困惑的路径来组织:先弄懂抓包原理,完成第一次抓包,再学会用过滤器缩小范围,然后完整拆解一个 HTTP 请求,最后是性能统计与问题排查技巧。全程基于真实环境下的操作习惯和踩坑经验,你可以直接照着做。
1. 抓包前必须弄懂的几个底层概念与界面布局
1.1 抓包到底抓的是什么
抓包不是抓“数据”这么模糊,准确说是抓网卡上流过的数据帧。以太网环境里,一个数据帧的最小结构包含目标 MAC 地址、源 MAC 地址、上层协议类型,然后才是 IP 头、TCP/UDP 头、应用层内容。Wireshark 会把这些帧收下来,按照协议规范逐层拆开,展示成树状结构。
默认情况下,网卡只处理发给自己的帧,其他主机的流量即使从网线里经过也不会被系统收上来。这就是为什么会有“混杂模式”(Promiscuous Mode)这个概念——打开它之后,网卡会把经过的所有帧都交给上层,Wireshark 才有机会看到同网段其他设备的流量。很多教程默认让你勾上混杂模式,但从来不解释为什么。记住一句话:不抓别人的包,混杂模式开不开无所谓;要抓其他设备流量,这个开关就是基础前提。
Wireshark 的抓包链路本身不难理解:网卡收帧 -> 内核交给抓包驱动 -> Wireshark 解析显示。Windows 上要靠 Npcap 这种底层驱动,Linux 上则需要 libpcap 权限。所以有些新手装完软件却发现接口列表是空的,十有八九是驱动没装好,或者权限不足。
1.2 为什么自己的电脑抓不到同一局域网其他设备的流量
这是新手最容易栽的一个坑。很多人以为只要装了 Wireshark,同一 WiFi 下别人手机访问了什么网站我都能看到,实际上绝大多数家用无线路由器、普通交换机环境下,根本抓不到。
原因在交换机。交换机是“按目标 MAC 地址转发”的二层设备。A 主机发给 B 主机的数据帧到了交换机端口之后,交换机看一眼目标 MAC 是 B,就只把这个帧从连接 B 的那个口送出去,其他端口根本不会收到这份数据。只有在广播、多播、泛洪的情况下,交换机才会把帧复制到所有端口。所以用笔记本连在同一交换机下去抓手机流量,通常只能看到一些零碎的广播包,真正想看的内容基本没有。
那想抓其他设备流量有哪些办法?常见的是端口镜像,也就是交换机上把某个接口的流量复制一份到你的抓包接口上;或是在中间串一个分光器、网络分流器;再或者直接把抓包设备放在转发路径上,比如让目标设备把网关指向你的机器。这些方案都需要设备和权限支持。但在绝大部分开发调试场景里,我们只需要抓本机自己发出的和收到的流量,这已经完全够用了。先摆正这个预期,能少走很多弯路。
1.3 主界面三件套与几个关键快捷键
打开 Wireshark 主界面,从上到下大致是:菜单栏、工具栏、过滤器输入框、数据包列表区、数据包详情区、数据包字节区。
数据包列表区是核心战场。每行一个数据包,默认列包括编号、时间、源地址、目标地址、协议、长度、信息。信息列非常重要,它会把“这个包在干嘛”用一句话概括出来,比如“TCP 三次握手的 SYN 包”“HTTP GET 请求”等。抓包分析大半时间就是盯着这一列扫。
数据包详情区选中某个包后,以树形展示层次:链路层(Frame + Ethernet)、网络层(IP)、传输层(TCP/UDP)、应用层(HTTP/DNS 等)。数据包字节区显示原生的十六进制和 ASCII 内容,直接看二进制比较费眼睛,一般很少用。
快捷键先记四个就好:
- Ctrl+E:开始/停止抓包
- Ctrl+K:打开抓包选项
- Ctrl+F:在当前结果里搜索
- 双击一个包:进入详情区的快速跟读
主界面颜色规则也有价值。没改过配置时,TCP 三次握手相关包偏淡蓝,HTTP 流量偏绿,UDP/DNS 偏紫色,重传、异常包偏红或黑。颜色能帮你在一堆流量里快速扫出异常点。
2. 第一次抓包:从安装到拿到人生第一个数据包
2.1 安装与权限问题
Windows 上安装 Wireshark 时,会提示安装 Npcap。这一步建议勾上“支持回环流量”的选项,否则后面抓本地服务流量会少一块。装完 Npcap 之后最好重启一次系统,别偷懒,不重启可能出现接口识别不全的怪毛病。Wireshark 本体则建议装最新稳定版,老版本对新协议的解析能力差一大截,实测 TLS 1.3 和新版 HTTP/2 流量在老版本上经常显示成乱码或“Unknown”。
Linux 系下安装完第一次打开,十有八九提示没有权限打开网卡。这是因为抓包驱动需要系统底层权限。主流发行版会把 Wireshark 用户加入 wireshark 用户组,加完重新登录即可。嫌麻烦可以临时用超级管理员启动 Wireshark,但日常不建议长期这样做。
macOS 上安装驱动后如果提示“系统扩展已被阻止”,需要去“安全性与隐私”里手动允许,否则打开软件但看不到任何接口。
2.2 选择网卡接口并开始捕获
启动 Wireshark 后,会看到一个接口列表界面,每个接口后面会跟着一个实时波浪图,这个图表示该接口当前的流量速率。如果某块网卡的曲线完全不动,检查一下你是不是插了网线但没插对机器,或者网卡确实没流量经过。
第一次练习,建议选你正在上网的那个接口。怎么判断是哪个?打开一个网页或视频,然后观察接口列表里哪个数字在跳,跳得最欢的就是你要选的。这一招能解决一半“我该点哪个口”的困惑。
选中接口后点开始按钮,Wireshark 会立刻进入抓包状态。你打开浏览器随便访问几个网站,隔十几秒回来后点红色方块停止。这时候包列表区应该已经有几百上千条数据了。第一眼看到这么多包肯定会懵,没关系,接着往下做。
2.3 保存文件与抓包工程的几个习惯
抓包结果默认不保存,停止后一切都在内存里,关掉软件就丢。需要存档时用“文件 -> 保存”,默认格式是 .pcapng。日常调试可以临时不保存,但要长期排查、复现问题,建议抓包前就规划好文件输出。
抓包选项(Ctrl+K)里有“多文件模式”和“环形缓冲”。多文件就是每个文件写到设定大小就自动切下一个,比如每个文件 20MB;环形缓冲就是只保留最近 N 个文件,旧文件自动删掉。我在长时间挂机抓某个间歇性故障时,一般会设成“每 50MB 一个文件、最多保留 20 个文件”,这样既不撑爆磁盘,又能保住故障前后的关键时刻。逻辑很简单——故障是不可预期的,持续的完整记录才能保证现场。
还有一个职业素养层面的提醒:抓包前先确认自己有没有权限抓这些流量。公司网络环境里,抓别人的流量前一定要先和网络管理员确认合规性;自己私人的设备、自己的开发环境则没有这个问题。Wireshark 是调试利器,不是偷窥工具,这个边界从第一天就要拎清。
3. 过滤器:决定你是“会抓包”还是“看得懂包”的关键分水岭
3.1 捕获过滤器与显示过滤器到底差在哪
很多人搞混这两类过滤器,其实它们是在两个完全不同的阶段起作用。
| 对比维度 | 捕获过滤器 | 显示过滤器 |
|---|---|---|
| 作用时机 | 抓包之前,驱动级别 | 抓包之后,显示阶段 |
| 发现原理 | 只有符合条件的数据包才会被记录下来 | 包已经完整存在,只是视图里隐藏不符合条件的 |
| 适合场景 | 抓包文件特别大时预先压缩范围 | 已经抓到的文件里来回筛选分析 |
| 语法风格 | BPF 表达式(基于传统抓包语法) | 字段式表达式(tcp.port、http.request等) |
捕获过滤器是先筛后存,能节省磁盘和 CPU。比如明确知道只要 80 端口的流量,那就只抓 80 端口。显示过滤器是后筛后看,灵活度更高,因为所有包都还在文件里,你可以随时换条件查看,不需要重新抓包。一个典型的例子:你抓完文件才发现想看看某个 IP 的流量,有显示过滤器加个条件就行;但如果当初用了捕获过滤器把它过滤掉了,那就只能重新抓。
3.2 BPF 捕获过滤器写法
捕获过滤器字段一般出现在“抓包选项”里,写法属于油口 BPF 风格,常用案例如下:
host 192.0.2.10 tcp port 443 port 80 or port 53 not port 3389 net 192.0.2.0/24第一行只看某 IP 相关;第二行只看某 TCP 端口;第三行同时看多个端口;第四行排除某个端口;第五行限定网段。写完之后点“编译”,出现“过滤表达式有效”的提示才算通过。BPF 语法里没有“==”这种写法,别把显示过滤器的习惯带进来。
3.3 显示过滤器:一天用一百次的日常主力
显示过滤器才是日常分析的重头,直接在主界面的过滤输入框里写,回车生效。几个高频例子:
ip.src == 192.0.2.10 tcp.port == 443 http.request.method == "GET" dns.qry.name contains "example" tcp.flags.syn == 1 && tcp.flags.ack == 0第一行看某源 IP 发的包;第二行看某端口流量;第三行只看 HTTP GET 请求;第四行找域名里带关键字的人;第五行精确拿捏 TCP 三次握手里的 SYN 包(注意这里 ack 为 0 是区分纯 SYN)。
显示过滤器还支持组合运算:ip.addr == 192.0.2.10 and tcp.port == 80、http or dns、tcp.port != 443。括号记得加上控制优先级,比如(http.request or tcp.port == 443) and ip.addr == 192.0.2.10。
一个大幅提升效率的技巧是“右键派生过滤器”。在包列表区选中任意一条数据,右键 -> “作为过滤器应用” -> 选中/排除。比如你想只看某个 IP 发给你的包,右键这个包那一行,选应用选中,过滤器会自动生成,不用手敲。类似地,“准备过滤器”可以把规则写成新条件再手动组合。对不熟悉字段命名的初学者来说,这是最友善的入口。
3.4 把常用过滤器做成书签
Wireshark 的过滤输入框旁边有个小星标图标,可以把当前过滤器“收藏”,下次直接下拉选择。建议做的几个固定书签:显示所有 HTTP 请求、显示所有 DNS 查询、显示所有 TCP 重传、显示某个常用 IP 的全部流量。时间久了你会发现,80% 的日常操作就靠这么几条规则反复套用。
命令行工具 tshark 也能做类似事,tshark -r 文件.pcapng -Y "http.request"可以直接从文件里过滤输出,适合脚本化批量分析。Wireshark 图形界面做不到的高并发筛选,tshark 可以。
4. 分析实战:拆解一次网页请求的完整生命过程
4.1 从 DNS 开始
现在找一个刚抓好的包文件,按 Ctrl+F 搜dns,把这部分流量过滤出来。访问一个网站时第一个动作往往是查询域名对应的 IP,这包在信息列显示为“Standard query...”或“Standard query response”。
在过滤框输入dns.qry.name contains "某个域名"可以精准找到那个域名的查询。看 DNS 时主要关心三个东西:查询域名、响应 IP、响应时间。如果 DNS 响应超过几百毫秒,就会明显感觉到页面白屏等待;如果响应里出现多个 IP,浏览器会按顺序尝试连接。DNS 解析慢是网页性能问题里被忽略最多的一环,很多后端优化做得很好、但用户打开还是慢,最后发现卡在 DNS 上。
4.2 观察 TCP 三次握手
接着过滤tcp.flags.syn == 1,你会看到一对一对的 SYN、SYN-ACK、ACK。三次握手本质上就是双方确认“你听得到我,我也听得到你”,顺便把初始序号商量好。
首次握手:客户端发一个 SYN 包,不携带应用数据,序号是一个随机初始序号(ISN)。第二次握手:服务端回 SYN-ACK,把自己的 ISN 和确认号一起发出。第三次握手:客户端发 ACK,确认服务端的序号。三次缺一不可,少了任何一步都说明中间有设备拦截或服务端没正常监听。
看握手的时候注意时间列。三次握手总共耗时就是客户端到服务器的往返时间(RTT)。如果你在带宽充足、本地网络正常的情况下看到握手花了 500 毫秒,那多半是链路问题或中间设备丢包引起的重传,这比理会应用代码还要有效的链路体检方法。
4.3 HTTP 请求与响应的完整画面
过滤http,然后找一个 GET 请求。选中这个包,右键 -> “追踪流” -> “TCP 流”(新版叫 Follow TCP Stream),会弹出一个窗口,把这段连接里的请求和响应拼成一份完整文本,极方便。
这里面能看到完整请求行:请求方法、URI、HTTP 版本;请求头:Host、User-Agent、Accept 等;然后是状态行:HTTP/1.1 200 OK;响应头;响应体。检查实际问题时先看几个关键点:
- 状态码是否符合预期,是 200、302 还是 500
- Content-Length 或 Transfer-Encoding 是否是分块(chunked)
- 响应有没有开启压缩(Content-Encoding: gzip、br 等)
- 响应时间是否比预期高很多
如果响应数据用了 gzip 压缩,Follow 出来的文本是一阵乱码,这不算 bug,只是工具没帮你自动解压。解压思路有两个:一种是先“文件 -> 导出对象 -> HTTP”,把资源保存成文件再本地解压,日常看图片、JS、CSS 文件最实用;另一种是临时跳过,直接看响应头里的时间和长度字段来推断结果。
4.4 HTTPS 流量看到“Application Data”怎么办
现在互联网上绝大多数流量都是 TLS 加密的,抓包能看到 TLS 握手,后面的数据统一显示成“Application Data”“Encrypted Application Data”,信息是一个也读不出来。很多人卡在这就放弃了,其实是漏了配置密钥。
TLS 加密的原理是客户端和服务端先协商出一个会话密钥,再用这个密钥加密应用数据。如果你使用的环境是你的本机,那么浏览器其实知道这把密钥,只是没有主动给你。Wireshark 提供了一个合法的调试入口——设置环境变量SSLKEYLOGFILE指向某个文件,浏览器会把每次会话的密钥写进这个文件;Wireshark 读到这些密钥后,就能把对应的流量解密还原成明文。
实操步骤:
- 在系统环境变量里新建
SSLKEYLOGFILE,路径写到一个固定文件,比如D:/temp/sslkey.log - 重启浏览器,再访问你想分析的页面
- 打开 Wireshark,进“首选项 -> 协议 -> TLS”,在“(Pre)-Master-Secret log filename”填入同一个文件路径
- 重新抓包,刷新页面,你会发现原来显示“Application Data”的地方,现在能看到 HTTP/2、HTTP/3 的明文头和内容
这招只用于自己电脑、自己浏览器的调试场景。拿到密钥文件去解密别人会话,性质就完全变了,千万别乱用。另外注意,如果你抓包时浏览器已经打开过,先关掉再重启一次,否则密钥文件里没有对应会话,解密无效。
5. 性能与异常定位:统计面板和专家信息怎么用
5.1 先看协议分层和端点统计,快速定位嫌疑对象
抓了一堆包直接肉眼逐条看是效率最低的办法。正确姿势是先打开“统计 -> 协议分级”(Protocol Hierarchy),这个视图会列出所有捕获到的协议分别占多少字节和比例。如果结果显示某个你根本不认识的协议占了绝大多数流量,排查重点基本就明确了——比如局域网里有设备在疯狂广播,或者有人在跑大流量下载。
“统计 -> 端点”则是按地址聚合流量,能看到某个 IP、某个 MAC 一共产生多少包、多少字节。我曾遇到一次某台设备“假离线”的问题:业务反馈某个设备连不上网,常规看线路都正常,最后在这个面板里发现该设备的 MAC 地址流量异常巨大,全是重传和广播,顺着查下去是这台设备的网卡老化导致大量丢包重传。如果不是端点统计,光靠肉眼看几百行数据包根本发现不了规律。
5.2 用 IO Graph 观察吞吐变化
抓包文件较大时,看持续几十秒或几分钟的流量,建议用“统计 -> IO Graph”。它会按秒或更小粒度画出流量曲线,能直观看出一段时间内吞吐的高峰低谷。
一般把统计图里的 Y 轴单位改成“Bytes/Tick”,X 轴按你的观测时长调整。曲线出现大量尖峰且每个尖峰间隔规律,多半是有定时任务或心跳请求;曲线在某个时间点后持续走平,说明流量异常中断。再配合过滤条件,比如只统计某个 IP,就能知道是哪台设备在什么时间做了什么。
对更细的 TCP 层诊断,可以用“统计 -> TCP 流图 -> 时间序号(Time-Sequence)”。这张图能看出连接的网络吞吐能力,如果曲线明显无法达到带宽上限,说明存在拥塞控制或重传问题。延迟方面,“统计 -> TCP 流图 -> 往返时间(RTT)”能帮你发现某个时刻 RTT 突然变大的拐点,结合当时应用日志,往往能直接对上故障时间点。
5.3 专家信息:让 Wireshark 帮你挑异常
抓包文件里几千个包,里面其实藏着很多“异常事件”,但你用肉眼看很难全找出来。Wireshark 的“分析 -> 专家信息”就是干这个的:它会基于协议解析结果,把错误、警告、注意、聊天四个级别的事件列出来。建议直接按“错误”和“警告”筛,再按出现次数排序。
下面列几个最常见的异常事件:
| 事件 | 含义 | 常见原因 | 排查方向 |
|---|---|---|---|
| TCP Retransmission | 数据包重传 | 网络丢包、链路拥挤、网卡问题 | 统计重传率,检查链路 |
| TCP Dup ACK | 重复确认 | 前序包丢失或乱序 | 看是否有高速率重传伴生 |
| TCP Zero Window | 零窗口 | 接收端缓冲区已满,应用没及时读取 | 查接收方进程性能、内存 |
| HTTP 5xx 响应 | 服务端错误 | 后端异常 | 结合应用日志定位 |
TCP 重传的判断标准:同样的序号,同一个方向出现多个数据包,后面的包时间明显晚于前面(超过 RTT 级别),且信息列明确标出“TCP Retransmission”。正常的 TCP 网络偶尔有个把重传是正常的,但如果重传占总包数的比例异常高(比如超过 0.5% 到 1%),就要查了。丢包的重传会直接表现为吞吐波动和延迟上涨。
TCP Zero Window 是个比较隐蔽的信号,意思是接收方告诉发送方“我没内存了,你别发了”。出现这种情况,问题不在网络链路,而在接收方应用没有及时消费数据、接收窗口被占满。遇到这个事件,别去查交换机,先看对端业务的进程状态。
5.4 一个容易被误解的细节
看到 TCP 重传不要立马断定“网络差”。某次同事反馈一个链路“频繁重传”,我打开统计发现重传其实集中在某个文件的下载连接上,而当时的拥塞窗口已经拉到足够大,网络工具自动做丢包恢复,业务整体没有明显卡顿。重传这类指标要和实际业务体感对应起来看,不能单凭几个红色包下结论。判断网络毛病的正确习惯是:先看整体协议分布、端点对齐、重传时间点,再定位具体连接,最后才进到单包级别读二进制。
6. 常见问题排查与实操技巧实录
6.1 抓不到包时,按顺序查这几项
接口列表为空或抓到 0 个包,别急着卸载重装。按照这个顺序排查:
- 看接口是否选错。多个网卡时,选中正在上网的那个,最简单的方式是观察接口列表里的实时速率曲线。
- 看权限。Windows 上用管理员身份启动 Wireshark;Linux 确认当前用户已加入抓包组或使用可执行文件。
- 看混杂模式。如果是抓本机流量,影响不大;要抓其他设备流量,必须在抓包选项里开启混杂模式。
- 看网卡驱动。个别网卡驱动对抓包支持不好,常见于部分无线网卡。无线网卡抓包有个特殊性:即便开了混杂模式,也未必能收到同频段其他设备的帧。
- 看过滤条件。捕获过滤器写错了会把所有流量都挡掉,先把捕获过滤器清空再试。
6.2 抓本地回环流量抓不到
访问本机服务(比如浏览器访问127.0.0.1:8080)时,流量并不经过物理网卡,而是直接在系统内部走回环接口。Windows 上安装 Npcap 时勾选了“回环流量”选项,才会出现一个名为 Loopback 的抓包接口。Linux 上通常有一个any接口,或者直接选lo回环接口。
如果你在浏览器里访问的是 localhost 但抓不到包,多半就是选错了物理网卡口。切到回环接口即可。多数本地开发场景连外网都不用,只在环回口上抓包就够了。
6.3 版本与解析规则要及时更新
Wireshark 对协议的解析依赖内置的解析器。新协议扩展、新 TLS 版本出来后,旧版本要么解析错误,要么直接显示成未知数据。我个人建议每年跟随稳定版更新两次以上,尤其你在做 HTTPS、HTTP/3、TLS 相关分析时。旧版抓出来的文件新版能打开,新版抓的文件老版本不一定兼容,所以分享包文件时也注明版本。
抓包文件如果是给同事看的,建议只截取关键片段:选中异常时间段的若干包,“文件 -> 导出特定分组”,再另存成一个精简文件,里面可以只保留显示过滤器结果。这样对方打开不用处理几千个无关包。
6.4 一套能直接套用的抓包工作流
最后总结我实际使用频率最高的流程。这个流程不复杂,但它解决了我八成以上的问题:
- 先定义问题边界:是访问慢、连不上、还是时好时坏?
- 确认抓包位置:在客户端抓,还是在服务端抓?能同时在两端抓最好。
- 设置好文件输出和环形缓冲,防止大文件撑爆内存。
- 开始抓包,同时记录操作时间点。比如“10 点 05 分刷新页面”“10 点 08 分复现报错”。没有时间打点的抓包,后面分析经常对不上业务行为。
- 停止后先不要急着乱点,依次看协议分级、端点、专家信息。
- 锁定可疑连接,用显示过滤器收窄到具体 IP、端口、协议。
- 最后对关键连接做 TCP 流追踪,完整看一遍请求响应内容。
- 保存精简包文件、截图关键证据、记录结论。
这套流程印象里已经帮我在各种网络故障排查里节省了大量时间。抓包这个技能说白了就是多抓、多疑、多验证。刚开始你可能会对着几百个包发怵,但只要坚持从“过滤、追踪流、看统计”这三个动作切入,很快就能进入状态。周末拿自己的电脑做个实验,抓一次浏览器访问全过程的包,按上面的思路拆一遍,比收藏一百篇教程都有用。