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 chromeWireshark → 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/Response | HTTP 请求统计 |
| Statistics → TCP StreamGraph → Time-Sequence | TCP 序列号时序图,排查丢包重传 |
| 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典型调试场景
排查接口超时
- 过滤器:
ip.addr == <server_ip> and tcp - 找到 SYN 包,看是否有 SYN+ACK 响应
- 若无响应 → 服务端未监听端口或防火墙拦截
- 若有 RST → 服务端主动拒绝连接
- 若有 SYN+ACK 但无后续 → 客户端网络问题
排查 HTTP 请求失败
- 过滤器:
http.response.code >= 400 - 右键 → Follow HTTP Stream 查看完整请求与响应
- 对比请求头(Authorization、Content-Type)是否正确
排查 WebSocket 断连
- 过滤器:
websocket - 查看 Close 帧的状态码(1006 表示异常断开,无 Close 帧)
- 结合
tcp.flags.rst看是否是 TCP 层强制断开
验证 TLS 证书协商
- 过滤器:
tls.handshake.type == 11(Certificate 帧) - 展开详情,找到 Certificate → tbsCertificate → subject
- 验证域名、有效期、颁发机构
快捷键
| 操作 | 快捷键 |
|---|---|
| 开始/停止捕获 | Ctrl + E |
| 应用显示过滤器 | Enter |
| 清空过滤器 | Ctrl + Shift + E |
| 跟踪 TCP 流 | Ctrl + Alt + Shift + T |
| 跳转到指定包 | Ctrl + G |
| 标记/取消标记包 | Ctrl + M |
| 搜索包内容 | Ctrl + F |
| 列着色规则 | View → Coloring Rules |
| 时间显示格式 | View → Time Display Format |