⚠️ 提示:本站 AI 助手使用博主个人 API Token,没事别特么瞎用。
网络 · · 约 14 分钟阅读

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默认需要管理员
macOSbrew install --cask wireshark,需安装 ChmodBPF将用户加入 access_bpf 组
Linuxapt 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)

抓完之后在顶部过滤栏输入,语法更丰富:

目的表达式
按 IPip.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 场景一:网站打不开

步骤:

  1. 抓包,过滤 dns,看 DNS 查询是否成功(有没有响应,rcode 是否为 0)。
  2. 过滤 http or tls,看有没有 SYN 包发出去。
  3. 如果 SYN 没回应 → 网络层问题(防火墙/路由)。
  4. 如果 SYN 收到 RST → 端口没开 / 服务没起。
  5. 如果握手成功但 HTTP 没响应 → 应用层问题。

6.2 场景二:访问很慢

步骤:

  1. 看有没有 [TCP Retransmission] → 丢包。
  2. 看 [TCP Window Full] / [TCP Zero Window] → 对端处理慢。
  3. 看 SYN 到 SYN+ACK 的时间差 → 网络延迟。
  4. 看 HTTP 请求到响应的时间差 → 服务端处理慢。
  5. Statistics → TCP Stream Graphs → Round Trip Time 看延迟分布。

6.3 场景三:偶发断连

  1. 过滤 tcp.flags.reset == 1,看是谁发的 RST。
  2. 如果是中间设备发的 → 可能是防火墙 / 负载均衡超时断开。
  3. 如果是对端发的 → 对端主动关闭,看应用日志。
  4. 检查是否有 [TCP Keep-Alive] 包,keepalive 间隔是否大于中间设备的超时。

6.4 场景四:HTTPS 内容看不到

HTTPS 默认加密,需要解密才能看明文:

  1. SSLKEYLOGFILE 方式(推荐):设置环境变量 SSLKEYLOGFILE=/tmp/sslkeys.log,浏览器/Chrome/Firefox 会把 TLS 密钥写入文件。Wireshark → Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename 指向这个文件。
  2. 前提:你是客户端或服务端,能拿到密钥。中间人看不到。

七、统计与高级功能

功能路径用途
协议分层统计Statistics → Protocol Hierarchy快速看流量构成
会话统计Statistics → Conversations哪个 IP 流量最大
端点统计Statistics → Endpoints列出所有通信端点
IO 图Statistics → IO Graphs流量随时间变化曲线
TCP 流图Statistics → TCP Stream GraphsRTT / 吞吐量 / 窗口
专家信息Analyze → Expert Info自动标注异常(警告/错误)

Follow TCP Stream:右键任意包 → Follow → TCP Stream,能看到完整的应用层对话(HTTP 请求响应、邮件内容等),排障最常用功能之一。

八、性能优化:抓大包不卡

抓高流量场景时,Wireshark 容易卡:

  1. 用抓包过滤器先过滤,别抓全量。
  2. 用 tcpdump 抓,Wireshark 分析:服务器上 tcpdump -w 存文件,再拉到本地。
  3. 关闭实时解析:View → Name Resolution 全关掉,避免 DNS 反查。
  4. 自动滚动关掉:抓包时不滚屏,减少渲染压力。
  5. 限制包大小:-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:深入理解协议字段含义,遇到异常包能看懂。
问问 AI