Wireshark 网络故障排除完整指南:从入门到精通
网络出问题时,最难的不是解决,而是定位。Ping 不通、网页打不开、传文件慢,这些现象背后可能是链路丢包、DNS 故障、TLS 握手失败,也可能是应用层自己超时。靠猜来排查,一轮下来几小时就过去了。
Wireshark 网络故障排除的价值就在于把"看不见"的通信过程变成可逐帧回看的数据。本文不讲界面操作(那部分可以看Wireshark 零基础入门教程),只讲一件事:拿到一个故障现象后,怎么用 Wireshark 在最短时间内定位到根因。
一、排查前的准备:抓包位置决定你能看到什么
很多人一上来就打开 Wireshark 点开始,抓了半天什么异常都没发现——问题往往出在抓包点选错了。
1. 该在哪台机器上抓包
最有效的做法是在通信两端同时抓。只在一端抓,你无法区分"包没发出去"和"发出去但没回来":
| 抓包位置 | 能看到 | 看不到的 |
|---|---|---|
| 客户端本机 | 请求是否发出、DNS 是否解析、重传是否发生 | 服务端是否真的收到 |
| 服务端本机 | 请求是否到达、程序是否响应 | 响应是否回到客户端 |
| 中间网关 / 防火墙 | 包是否被策略丢弃、NAT 转换是否正确 | 两端应用层状态 |
| 交换机镜像端口 | 链路真实流量(含被中间设备丢弃前的包) | 需要额外镜像配置 |
两端同时抓时,用时间同步很关键。两边系统时间差超过几秒,对照起来会非常痛苦——先确认 NTP 已同步。
2. 捕获过滤器先设好,别等抓完再筛
生产环境全量抓包几分钟就能产生几个 GB 的文件,打开时 Wireshark 会卡到无法操作。开始之前先用 BPF 捕获过滤器缩小范围:
# 只抓与 10.0.0.25 的往来流量
host 10.0.0.25
# 只抓 80 和 443 端口
tcp port 80 or tcp port 443
# 排除 SSH 自己的流量,避免干扰
host 10.0.0.25 and not port 22
# 只抓 SYN 包(用于看连接建立情况)
tcp[tcpflags] & tcp-syn != 0
捕获过滤器用的是 BPF 语法,和显示过滤器不是一套东西,这点在Wireshark 过滤器完全手册里有完整对照。
二、五步定位法:从现象到根因
拿到抓包文件后,建议按固定顺序走一遍,避免在大海里捞针。
| 步骤 | 动作 | 使用的功能 | 想回答的问题 |
|---|---|---|---|
| 1 | 看整体画像 | 统计 → 协议分级、会话 | 流量构成正常吗?谁在占带宽? |
| 2 | 扫异常 | 分析 → 专家信息(Expert Info) | 有没有重传、乱序、重置? |
| 3 | 缩范围 | 显示过滤器 | 能不能只看故障相关的那几十个包? |
| 4 | 跟踪流 | 右键 → 追踪流 → TCP 流 | 完整会话里,哪一步开始不对劲? |
| 5 | 定根因 | 时间序列图、往返时间 | 是网络问题,还是应用自己慢? |
第 1 步:先看协议分级,建立基线
打开统计 → 协议分级(Protocol Hierarchy),先确认流量构成是否符合预期。如果你在排查一个 Web 服务,结果 TCP 占了 99% 却几乎没有 HTTP/TLS,那要么抓错了接口,要么服务根本没在通信。这一步只要几秒钟,却能避免后面几十分钟的误判。
第 2 步:专家信息是最高性价比的入口
分析 → 专家信息(Expert Information)是 Wireshark 内置的问题汇总,会把重传、乱序、重复 ACK、零窗口、重置等异常按严重程度归类。大多数故障在这一步就能直接看到方向。
看专家信息有个经验:不要被"Note"级别淹没,优先看 Warning 和 Error;同时看数量级——3 次重传可能是正常抖动,300 次就是明确的链路问题。
第 3 步:用过滤器锁定范围
专家信息里点任意一条,Wireshark 会自动跳到对应数据帧。接着右键该包,用对话过滤器(Conversation Filter)把范围缩到这一个会话,剩下的包通常只有几十个,可以逐个看。
第 4 步:追踪 TCP 流看完整对话
追踪流(Follow TCP Stream)把双向数据拼成一段连续文本,是判断"请求有没有发出去、响应有没有回来、谁先断开"的最快方式。看的时候注意三点:请求是否完整、响应状态码是什么、连接是被谁以什么方式关闭的。
第 5 步:区分网络慢还是应用慢
这是最容易被误判的一步。判断依据很简单:看时间戳落在哪里。
- 客户端发出请求后,服务端立刻响应但响应很慢才完整 → 服务端应用处理慢
- 客户端发出请求,隔了几百毫秒才到服务端 → 网络传输慢(看 RTT)
- 响应很快回来,但客户端过很久才发下一个请求 → 客户端或浏览器问题
用统计 → TCP 流图形 → 时间序列(Stevens)能直观看到数据随时间的位置,一眼区分是网络延迟还是应用延迟。
三、六类高频故障的诊断过滤器
下面这些过滤器建议直接保存成过滤按钮,遇到对应现象时一键调用。
| 故障现象 | 显示过滤器 | 判读要点 |
|---|---|---|
| 连接超时、无响应 | tcp.analysis.retransmission | 大量重传且无 ACK,多为链路丢包或目标不可达 |
| 频繁断开 | tcp.flags.reset == 1 | 谁发的 RST 谁是主动断开方;防火墙常伪装 RST |
| 网速慢、吞吐低 | tcp.analysis.zero_window | 接收方处理不过来,问题在接收端不在网络 |
| 网页打不开 | dns.flags.rcode != 0 | 非 0 返回码即解析失败,看是 NXDOMAIN 还是超时 |
| HTTPS 证书告警 | tls.alert_message | 展开看具体告警类型,如 unknown_ca、handshake_failure |
| 丢包、乱序 | tcp.analysis.out_of_order | 多出现于多路径路由或无线链路 |
1. 连接超时与无响应
典型特征是客户端反复发 SYN,收不到 SYN-ACK。用 tcp.flags.syn == 1 && tcp.flags.ack == 0 过滤,如果看到同一个 SYN 间隔 1 秒、2 秒、4 秒地重发(指数退避),说明对端完全没有回应——可能是服务未监听、防火墙静默丢包,或路由不通。
2. TCP 重传
重传本身是 TCP 的正常纠错机制,关键看规模。用统计 → 会话(Conversations),在 TCP 标签页勾选"限制显示过滤器",可以直观看到哪些会话的重传占比最高。持续超过 1% 的重传率,就需要查链路质量了。
3. 连接被重置(RST)
RST 表示连接被立即终止。定位时要注意:发 RST 的一方不一定是故障源。中间防火墙、负载均衡器也会发 RST。结合 IP 的 TTL 值可以辅助判断——如果 RST 包的 TTL 与其他包的规律明显不同,很可能来自中间设备而非真正的通信端。
4. DNS 问题
DNS 故障常被误判为"网络慢"。用 dns 过滤后看两件事:查询有没有响应,以及响应时间。Wireshark 会把超过阈值的 DNS 查询标记为响应过慢。如果看到大量相同域名的重复查询且无响应,多半是 DNS 服务器配置错误或不可达。
5. TLS 握手失败
HTTPS 问题优先看 Client Hello 之后发生了什么。常见情况:服务端直接回 RST(端口未开或 SNI 被拦截)、返回 Alert(证书或协议版本不匹配)、握手完成后立刻被关闭(应用层策略)。用 tls.handshake.type == 1 找到 Client Hello,再追踪流看完整过程。
6. 吞吐量上不去
这类问题看窗口。tcp.analysis.zero_window 说明接收方缓冲区满,是接收端性能问题;tcp.analysis.window_full 说明发送方被窗口限制,同样指向接收端。如果是长肥管道(高带宽 × 高延迟),还要检查是否启用了窗口缩放(Window Scaling)——三次握手里的 WS 选项。
四、三个真实排障案例
案例一:内网 OA 系统间歇性打不开
现象是每天上午 9 点左右,部分同事访问 OA 会卡住十几秒。在客户端抓包后发现:TCP 三次握手正常,HTTP 请求发出后约 15 秒才收到响应。追踪流看到服务端返回的是完整页面,说明服务端处理慢,不是网络问题。进一步定位到 OA 在那个时间段有定时任务占满数据库 CPU。结论:网络无责,问题在服务端负载。
案例二:上传大文件到对象存储速度上不去
带宽 100 Mbps,实际上传只有 5 Mbps。抓包后统计发现重传率接近 8%,且大量 tcp.analysis.duplicate_ack。追踪时间序列图,看到数据包呈阶梯状、中间有明显空档——典型的链路丢包特征。最后查出是出口链路某个光模块衰耗超标,更换后恢复到 90 Mbps 以上。
案例三:HTTPS 站点部分区域用户打不开
现象是只有某运营商的用户反馈打不开。抓包看到 TLS 握手停在 Client Hello,随后收到 RST。对比正常用户的包,发现被拒绝的 Client Hello 里 SNI 字段被中间设备篡改。最终确认是该运营商的 DNS 劫持导致解析到了错误的 IP。这类问题只有在客户端侧抓包才能看到,服务端抓包一切正常。
五、提高效率的配置习惯
建议修改的首选项
- 启用网络名称解析关掉:解析会拖慢打开速度,且在内网会产生大量反向 DNS 查询干扰抓包
- TCP 序列号用相对值(默认开启):比原始序列号好读得多
- 开启"计算校验和"校验:能发现网卡 offload 造成的伪校验和错误告警
- 时间显示格式改为"自上一捕获包起的秒数":排查延迟问题时比绝对时间直观
值得添加的自定义列
在编辑 → 首选项 → 列里加几列,能省掉大量点开数据包的操作:
tcp.time_delta:与上一个包的时间差,一眼看出卡顿位置tcp.analysis.retransmission:直接标记重传包http.response.code:HTTP 状态码,排查 Web 问题时非常省事tls.handshake.extensions_server_name:显示 SNI,排查 HTTPS 时定位域名
长时间抓包用 tshark
需要抓几个小时甚至几天时,图形界面不合适,用命令行版本 tshark 配合环形缓冲:
tshark -i eth0 -f "host 10.0.0.25" \
-b filesize:100000 -b files:20 \
-w /var/capture/oa.pcapng
上面命令每 100 MB 切一个文件、最多保留 20 个,超出自动覆盖最旧的。抓完再用 Wireshark 逐个分析。
常见问题
写在最后
故障排查能力的差距,不在于记住多少过滤器,而在于有没有稳定的排查路径。把上面五步固化成习惯——先看画像、再扫异常、缩范围、追流、定位置——大部分网络问题都能在十分钟内给出方向,而不是反复重启设备碰运气。
如果需要系统梳理过滤器语法,可以看Wireshark 过滤器完全手册;刚接触这个工具的读者建议先从零基础入门教程开始。更多中文教程资源请访问Wireshark 中文站。

