Wireshark

Wireshark 是开源的图形化网络抓包与协议分析工具,可捕获网卡上所有经过的数据包并解码展示。常用于调试 HTTP/HTTPS/WebSocket 通信、排查网络故障、分析 TCP 连接行为。


界面组成

┌─────────────────────────────────────────────────────┐
│  菜单栏 / 工具栏                                     │
├─────────────────────────────────────────────────────┤
│  捕获过滤器输入框(开始捕获前设置)                    │
├─────────────────────────────────────────────────────┤
│  数据包列表面板                                       │
│  No. │ Time │ Source │ Destination │ Protocol │ Info │
├─────────────────────────────────────────────────────┤
│  数据包详情面板(树状协议层级)                        │
│  ▶ Frame                                            │
│  ▶ Ethernet II                                      │
│  ▶ Internet Protocol (IP)                           │
│  ▶ Transmission Control Protocol (TCP)              │
│  ▶ Hypertext Transfer Protocol (HTTP)               │
├─────────────────────────────────────────────────────┤
│  数据包字节面板(十六进制 + ASCII 原始数据)           │
└─────────────────────────────────────────────────────┘

捕获过滤器(Capture Filter)

在开始捕获前设置,使用 BPF(Berkeley Packet Filter)语法,只保存匹配的包,减少文件体积:

# 按主机过滤
host 192.168.1.100
src host 192.168.1.100
dst host 192.168.1.100

# 按端口过滤
port 80
port 443
port 8080
not port 22              # 排除 SSH

# 按协议过滤
tcp
udp
icmp

# 组合条件
host 192.168.1.100 and port 8080
tcp and (port 80 or port 443)
not broadcast and not multicast

显示过滤器(Display Filter)

捕获后在列表面板上方输入,不影响已捕获的包,只控制显示:

# 协议
http
https
tcp
udp
dns
tls

# IP 地址
ip.addr == 192.168.1.100
ip.src == 10.0.0.1
ip.dst == 10.0.0.1

# 端口
tcp.port == 8080
tcp.srcport == 443
tcp.dstport == 80

# HTTP 方法与状态码
http.request.method == "POST"
http.response.code == 200
http.response.code >= 400

# HTTP 路径/Host
http.request.uri contains "/api/"
http.host == "example.com"

# TCP 标志位
tcp.flags.syn == 1              # SYN 包
tcp.flags.syn == 1 and tcp.flags.ack == 0  # 握手第一步
tcp.flags.fin == 1              # FIN 包
tcp.flags.rst == 1              # RST 重置

# 关键字匹配(内容搜索)
frame contains "Authorization"

# 组合
ip.addr == 192.168.1.1 and http
http.request.method == "POST" and http.request.uri contains "/login"

常用过滤器速查

场景显示过滤器
查看所有 HTTP 流量http
查看 TLS 握手tls.handshake
查看 DNS 解析dns
查看 TCP 三次握手tcp.flags.syn == 1
查看连接重置tcp.flags.rst == 1
查看重传包tcp.analysis.retransmission
查看 WebSocket 帧websocket
查看 ICMP(ping)icmp
排除 ARP 广播not arp
两个 IP 之间的通信ip.addr == A and ip.addr == B

跟踪 TCP/HTTP 流

右键数据包 → Follow → TCP Stream(或 HTTP Stream):

  • 以对话形式展示完整的请求-响应内容
  • 可切换显示格式:ASCII / 十六进制 / UTF-8 / 原始
  • 自动生成对应的显示过滤器,如 tcp.stream eq 3

分析 HTTP API 请求时,HTTP Stream 可直接看到请求头、请求体、响应体,比逐帧看更直观。


分析 TCP 三次握手

过滤器 tcp.flags.syn == 1 找到握手包,观察:

客户端  → SYN             seq=0
服务端  ← SYN + ACK       seq=0, ack=1
客户端  → ACK             seq=1, ack=1

详情面板中 TCP 层可看到:

  • Sequence number(序列号)
  • Acknowledgment number(确认号)
  • Window size(滑动窗口大小)
  • Calculated window size(RWIN,实际窗口)

分析 TLS 握手

过滤器 tls.handshake,关键帧类型:

Handshake Type含义
Client Hello (1)客户端支持的加密套件、随机数
Server Hello (2)服务端选定套件、随机数
Certificate (11)服务端证书链
Server Hello Done (14)TLS 1.2 握手完成标志
Client Key Exchange (16)预主密钥(RSA 加密)
Finished (20)握手验证完成

TLS 1.3 握手帧更少,加密更早开始,部分内容在 Wireshark 中显示为加密。


解密 HTTPS 流量

方法一:配置 SSLKEYLOGFILE(推荐)

Chrome / Firefox 支持将 TLS 会话密钥写入文件:

# Linux / macOS
export SSLKEYLOGFILE=~/ssl-keys.log
google-chrome &
 
# Windows(PowerShell)
$env:SSLKEYLOGFILE = "C:\ssl-keys.log"
Start-Process chrome

Wireshark → Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename → 选择该文件。

方法二:导入服务端私钥(仅适用于 RSA 密钥交换,TLS 1.3 不支持)

Edit → Preferences → Protocols → TLS → RSA keys list → 添加:IP、端口、协议、私钥文件。


统计功能

菜单功能
Statistics → Protocol Hierarchy各协议占比统计
Statistics → Conversations所有 TCP/UDP 会话列表(含流量大小)
Statistics → IO Graphs流量随时间的吞吐量图表
Statistics → HTTP → Request/ResponseHTTP 请求统计
Statistics → TCP StreamGraph → Time-SequenceTCP 序列号时序图,排查丢包重传
Analyze → Expert Information自动标注异常(重传、乱序、连接重置等)

命令行工具:tshark

Wireshark 的命令行版本,适合服务器环境、脚本自动化:

# 列出可用网卡
tshark -D
 
# 抓取指定网卡的 HTTP 流量,输出到文件
tshark -i eth0 -f "port 80" -w capture.pcap
 
# 读取 pcap 文件并过滤
tshark -r capture.pcap -Y "http.request.method == POST"
 
# 提取指定字段(适合日志分析)
tshark -r capture.pcap -Y http.request -T fields \
  -e http.request.method \
  -e http.request.uri \
  -e ip.dst
 
# 实时抓包并显示 HTTP 请求摘要
tshark -i eth0 -Y http.request -T fields \
  -e frame.time \
  -e ip.src \
  -e http.request.method \
  -e http.host \
  -e http.request.uri

典型调试场景

排查接口超时

  1. 过滤器:ip.addr == <server_ip> and tcp
  2. 找到 SYN 包,看是否有 SYN+ACK 响应
  3. 若无响应 → 服务端未监听端口或防火墙拦截
  4. 若有 RST → 服务端主动拒绝连接
  5. 若有 SYN+ACK 但无后续 → 客户端网络问题

排查 HTTP 请求失败

  1. 过滤器:http.response.code >= 400
  2. 右键 → Follow HTTP Stream 查看完整请求与响应
  3. 对比请求头(Authorization、Content-Type)是否正确

排查 WebSocket 断连

  1. 过滤器:websocket
  2. 查看 Close 帧的状态码(1006 表示异常断开,无 Close 帧)
  3. 结合 tcp.flags.rst 看是否是 TCP 层强制断开

验证 TLS 证书协商

  1. 过滤器:tls.handshake.type == 11(Certificate 帧)
  2. 展开详情,找到 Certificate → tbsCertificate → subject
  3. 验证域名、有效期、颁发机构

快捷键

操作快捷键
开始/停止捕获Ctrl + E
应用显示过滤器Enter
清空过滤器Ctrl + Shift + E
跟踪 TCP 流Ctrl + Alt + Shift + T
跳转到指定包Ctrl + G
标记/取消标记包Ctrl + M
搜索包内容Ctrl + F
列着色规则View → Coloring Rules
时间显示格式View → Time Display Format

相关

  • HTTP — 分析 HTTP 请求/响应的协议细节
  • TLS — TLS 握手流程与证书验证
  • HTTPS — HTTPS 流量解密说明
  • WebSocket — 抓包观察 WebSocket 升级与帧传输
  • TCP — 三次握手、重传、窗口
  • UDP — DNS、QUIC 报文
  • Apifox — 应用层接口调试,与 Wireshark 互补