Wireshark 网络抓包分析与排障完全指南
从抓包原理、过滤器语法、TCP/HTTP/DNS 协议分析,到丢包、重传、延迟、连接失败等常见网络问题的实战排障,本文覆盖 Wireshark 全流程使用与排障方法论。
Wireshark 网络抓包分析与排障完全指南
适用:网络工程师 / 运维 / 开发者 定位网络连通性、性能、协议异常等问题。 前提:只在你有权限监控的网络上抓包,未经授权捕获他人流量可能违法。
一、抓包能解决什么问题
网络问题大致分三类:连不上(连通性)、连得上但慢(性能)、数据不对(协议/内容异常)。抓包是这三类问题的终极定位手段——它不依赖任何应用日志,直接看到链路上跑的每一个字节。
flowchart TD
A["网络故障现象"] --> B{"属于哪类?"}
B -->|连不上| C["TCP 三次握手失败 / RST / 超时"]
B -->|慢| D["重传 / 窗口满 / 延迟大"]
B -->|数据异常| E["协议字段错误 / 内容被篡改"]
C --> F["Wireshark 定位"]
D --> F
E --> F
F --> G["根因结论"]二、Wireshark 安装与抓包入口
2.1 各平台安装
| 平台 | 安装方式 | 抓包权限 |
|---|---|---|
| Windows | 官网 下载安装包,勾选 Npcap | 默认需要管理员 |
| macOS | brew install --cask wireshark,需安装 ChmodBPF | 将用户加入 access_bpf 组 |
| Linux | apt install wireshark / yum install wireshark | 将用户加入 wireshark 组后重新登录 |
2.2 选择网卡
打开 Wireshark 首页,网卡列表会显示每个接口的实时流量波形。选对网卡是第一步:
- 本机对外通信 → 选物理网卡(Wi-Fi / 以太网)
- 抓容器 / 虚拟机流量 → 选对应的虚拟网卡(如
veth、br-xxx) - 抓本机回环 → 选
Loopback(127.0.0.1)
2.3 远程抓包(SSH 跳板)
服务器上没装 GUI,可以用 tcpdump 抓了再拉到本地分析:
# 服务器上抓包,存文件
sudo tcpdump -i eth0 -w /tmp/cap.pcap -s 0 host 10.0.0.5
# 本地直接通过 SSH 流式抓包(不用存服务器)
ssh root@server 'tcpdump -i eth0 -U -w - host 10.0.0.5' | wireshark -k -i --s 0 表示抓完整包(不截断),-w 写文件,-r 读文件。
三、界面三件套:过滤器、包列表、包详情
flowchart LR
A["显示过滤器栏<br/>Display Filter"] --> B["包列表<br/>Packet List"]
B --> C["选中一个包"]
C --> D["包详情<br/>Packet Details<br/>分层展开"]
D --> E["包字节<br/>Packet Bytes<br/>十六进制"]- 显示过滤器(Display Filter):只影响展示,不减少抓包量。语法见下节。
- 抓包过滤器(Capture Filter):在抓之前就过滤,减少磁盘占用。语法是 BPF,和显示过滤器不一样。
- 包详情:按 OSI 分层展开(Frame → Ethernet → IP → TCP/UDP → 应用层)。
四、过滤器语法(最常用)
4.1 抓包过滤器(BPF,Capture Filter)
在 Capture → Options 里设置,语法是 tcpdump 的 BPF:
# 只抓某个主机的流量
host 10.0.0.5
# 只抓 80 端口
port 80
# 只抓 TCP,排除 SSH
tcp and not port 22
# 抓某个网段
net 192.168.1.0/24
# 组合
host 10.0.0.5 and (port 80 or port 443)4.2 显示过滤器(Display Filter)
抓完之后在顶部过滤栏输入,语法更丰富:
| 目的 | 表达式 |
|---|---|
| 按 IP | ip.addr == 10.0.0.5 或 ip.src == 10.0.0.5 |
| 按端口 | tcp.port == 80 |
| 按协议 | http / dns / tls / tcp / icmp |
| HTTP 方法 | http.request.method == "POST" |
| TCP 标志位 | tcp.flags.syn == 1、tcp.flags.reset == 1 |
| 组合 | ip.addr == 10.0.0.5 and tcp.port == 443 |
| 排除 | !(arp or icmp) |
| 按内容 | http.response.code == 404、dns.qry.name contains "example" |
技巧:在包详情里右键任意字段 → Apply as Filter → Selected,Wireshark 自动生成过滤器表达式。
五、核心协议分析
5.1 TCP 三次握手与四次挥手
正常的三次握手:
sequenceDiagram
participant C as Client
participant S as Server
C->>S: SYN (seq=x)
S->>C: SYN+ACK (seq=y, ack=x+1)
C->>S: ACK (ack=y+1)
Note over C,S: 连接建立在 Wireshark 里看这三个包:SYN → SYN, ACK → ACK,Info 列会显示 [SYN]、[SYN, ACK]、[ACK]。
四次挥手:FIN → ACK → FIN → ACK。其中第二个 ACK 和第三个 FIN 之间可能有数据传输(半关闭)。
5.2 排障点:握手失败
| 现象 | 含义 | 常见原因 |
|---|---|---|
| 发了 SYN 没回应 | 服务端没收到 / 被防火墙丢 | 防火墙、安全组、路由不通 |
| SYN 后收到 RST | 端口没开 | 服务未启动、监听地址不对 |
| SYN+ACK 后客户端不回 ACK | 客户端问题 | 客户端防火墙、内核参数 |
5.3 TCP 重传与窗口
Wireshark 会自动标记异常包:
- [TCP Retransmission]:重传,说明发出去的包没收到 ACK,可能丢包或延迟大。
- [TCP Dup ACK]:重复 ACK,说明中间丢了包,接收方在催。
- [TCP Out-Of-Order]:乱序,网络路径不一致。
- [TCP Window Full]:发送方把接收窗口塞满了,对端处理不过来。
- [TCP Zero Window]:接收方窗口为 0,告诉对方别发了。
5.4 HTTP 分析
HTTP 是明文的(HTTPS 不行,除非解密),直接能看到请求行、头部、body。
http.request过滤所有请求http.response过滤所有响应http.response.code >= 400过滤错误响应- 右键 → Follow → TCP Stream 可以看完整的请求+响应对话
5.5 DNS 分析
DNS 问题的典型现象:能 ping 通 IP 但访问不了域名。
dns过滤所有 DNS 包dns.flags.response == 0只看查询dns.flags.rcode != 0只看有错误的响应(NXDOMAIN、SERVFAIL 等)dns.qry.name == "example.com"查特定域名
六、实战排障场景
6.1 场景一:网站打不开
步骤:
- 抓包,过滤
dns,看 DNS 查询是否成功(有没有响应,rcode 是否为 0)。 - 过滤
http or tls,看有没有 SYN 包发出去。 - 如果 SYN 没回应 → 网络层问题(防火墙/路由)。
- 如果 SYN 收到 RST → 端口没开 / 服务没起。
- 如果握手成功但 HTTP 没响应 → 应用层问题。
6.2 场景二:访问很慢
步骤:
- 看有没有
[TCP Retransmission]→ 丢包。 - 看
[TCP Window Full]/[TCP Zero Window]→ 对端处理慢。 - 看 SYN 到 SYN+ACK 的时间差 → 网络延迟。
- 看 HTTP 请求到响应的时间差 → 服务端处理慢。
- Statistics → TCP Stream Graphs → Round Trip Time 看延迟分布。
6.3 场景三:偶发断连
- 过滤
tcp.flags.reset == 1,看是谁发的 RST。 - 如果是中间设备发的 → 可能是防火墙 / 负载均衡超时断开。
- 如果是对端发的 → 对端主动关闭,看应用日志。
- 检查是否有
[TCP Keep-Alive]包,keepalive 间隔是否大于中间设备的超时。
6.4 场景四:HTTPS 内容看不到
HTTPS 默认加密,需要解密才能看明文:
- SSLKEYLOGFILE 方式(推荐):设置环境变量
SSLKEYLOGFILE=/tmp/sslkeys.log,浏览器/Chrome/Firefox 会把 TLS 密钥写入文件。Wireshark →Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename指向这个文件。 - 前提:你是客户端或服务端,能拿到密钥。中间人看不到。
七、统计与高级功能
| 功能 | 路径 | 用途 |
|---|---|---|
| 协议分层统计 | Statistics → Protocol Hierarchy | 快速看流量构成 |
| 会话统计 | Statistics → Conversations | 哪个 IP 流量最大 |
| 端点统计 | Statistics → Endpoints | 列出所有通信端点 |
| IO 图 | Statistics → IO Graphs | 流量随时间变化曲线 |
| TCP 流图 | Statistics → TCP Stream Graphs | RTT / 吞吐量 / 窗口 |
| 专家信息 | Analyze → Expert Info | 自动标注异常(警告/错误) |
Follow TCP Stream:右键任意包 → Follow → TCP Stream,能看到完整的应用层对话(HTTP 请求响应、邮件内容等),排障最常用功能之一。
八、性能优化:抓大包不卡
抓高流量场景时,Wireshark 容易卡:
- 用抓包过滤器先过滤,别抓全量。
- 用 tcpdump 抓,Wireshark 分析:服务器上
tcpdump -w存文件,再拉到本地。 - 关闭实时解析:
View → Name Resolution全关掉,避免 DNS 反查。 - 自动滚动关掉:抓包时不滚屏,减少渲染压力。
- 限制包大小:
-s 96只抓包头(够用的话),大幅减少存储。
九、常见过滤器速查
# 连通性
icmp # ping
arp # ARP
# TCP 状态
tcp.flags.syn == 1 # SYN
tcp.flags.fin == 1 # FIN
tcp.flags.reset == 1 # RST
tcp.analysis.retransmission # 重传
tcp.analysis.duplicate_ack # 重复 ACK
# HTTP
http.request.method == "GET"
http.response.code >= 500
http.host contains "api.example.com"
# DNS
dns.flags.rcode == 3 # NXDOMAIN
dns.qry.type == 1 # A 记录
# TLS
tls.handshake.type == 1 # ClientHello
tls.handshake.type == 2 # ServerHello
# 按大小
frame.len > 1400 # 大包十、安全与合规提醒
- 只抓你有权限的流量:公司网络需走审批,个人设备自己的流量没问题。
- 抓包文件可能含敏感数据:密码、Token、Cookie 可能明文出现,分享 pcap 前要脱敏或确认无敏感内容。
- HTTPS 解密有边界:只能解密你自己客户端/服务端的流量,不能用于窃听他人。
十一、排障流程速查
flowchart TD
A["现象:连不上/慢/异常"] --> B["确定涉及的 IP 和端口"]
B --> C["选对网卡开始抓包"]
C --> D{"DNS 正常吗?"}
D -->|否| E["查 DNS 响应 / 解析配置"]
D -->|是| F{"TCP 握手成功吗?"}
F -->|SYN 无回应| G["防火墙/路由/安全组"]
F -->|收到 RST| H["端口未开/服务未启动"]
F -->|握手成功| I{"应用层响应正常吗?"}
I -->|超时/错误| J["服务端应用日志 + 重传分析"]
I -->|正常但慢| K["RTT/窗口/丢包分析"]十二、延伸学习
- tcpdump:无图形环境抓包必备,BPF 语法和 Wireshark 抓包过滤器通用。
- tshark:Wireshark 的命令行版本,适合脚本化批量分析。
- Charles / Fiddler:专攻 HTTP/HTTPS 代理抓包,比 Wireshark 更适合看应用层。
- 协议 RFC:深入理解协议字段含义,遇到异常包能看懂。