3. Wireshark 环境搭建:安装、配置与核心用法
工欲善其事,必先利其器。做网络分析,Wireshark 就是那把最锋利的刀。这一章咱们把环境搭好,把几个最常用的功能摸透。后面分析粘包拆包的时候,你才能指哪打哪。
3.1 Wireshark 安装与基础配置
安装本身没什么难度,但有几个细节我建议你注意一下。
3.1.1 安装时的组件选择
Windows 下安装时,安装向导会让你选择组件。默认勾选是够用的,但我个人习惯把 USBPcap 也勾上——虽然咱们分析 TCP 用不到 USB 抓包,但万一以后要调试 USB 设备,省得重装。
最关键的一步是 WinPcap 或 Npcap 的选择。新版 Wireshark 默认用 Npcap,安装时记得勾选 "Install Npcap in WinPcap API‑compatible Mode"。为什么?因为很多老工具只认 WinPcap 接口,兼容模式能避免冲突。我曾经在一台机器上装完 Wireshark 发现抓不到包,折腾半天,最后发现是 Npcap 没勾兼容模式。
brew install --cask wireshark,省去手动配置权限的麻烦。
3.1.2 捕获接口选择
打开 Wireshark,你会看到一堆网络接口。别慌,记住一个原则:抓哪个接口,看流量走哪条路。
- 分析本地回环测试(比如客户端连本机服务端),选 Loopback: lo0(Linux/macOS)或 Npcap Loopback Adapter(Windows)。
- 分析跨机器通信,选实际使用的物理网卡或虚拟网卡(比如 eth0、en0、Wi‑Fi 网卡)。
- 如果接口列表里全是 "Adapter for loopback traffic capture" 之类的名字,点开 管理接口,把隐藏的接口显示出来。
3.2 捕获过滤器与显示过滤器
这两个东西名字像,但用法完全不同。很多新手搞混,结果要么抓了一堆无用包,要么过滤了半天啥也没看到。
3.2.1 捕获过滤器(Capture Filter)
捕获过滤器是在 抓包之前 设置的。它决定哪些包进内存,哪些包直接丢弃。说白了,它是个"门卫"。
语法基于 BPF(Berkeley Packet Filter),简洁但功能强大。常用写法:
# 只抓特定主机的流量
host 192.168.1.100
# 只抓特定端口的 TCP 流量
tcp port 8080
# 抓某个网段的流量
net 10.0.0.0/24
# 排除某个 IP
not host 192.168.1.1
# 组合条件:抓 192.168.1.100 的 80 或 443 端口
host 192.168.1.100 and (tcp port 80 or tcp port 443)
3.2.2 显示过滤器(Display Filter)
显示过滤器是 抓包之后 用的。它不影响已经抓到的包,只是从内存里把符合条件的包"显示"出来。你可以随时改、随时试,非常灵活。
语法比捕获过滤器丰富得多,支持协议字段级过滤。我常用的几个:
| 过滤表达式 | 含义 | 典型场景 |
|---|---|---|
tcp.port == 8080 |
源或目的端口为 8080 | 分析 Web 服务 |
ip.addr == 192.168.1.100 |
源或目的 IP 为指定地址 | 定位特定主机 |
tcp.flags.syn == 1 |
只显示 SYN 包 | 观察 TCP 握手 |
tcp.analysis.ack_rtt |
显示有 RTT 统计的包 | 排查延迟问题 |
http.request |
只显示 HTTP 请求 | 分析应用层交互 |
tcp contains "GET" |
TCP 载荷包含 "GET" 字符串 | 快速定位 HTTP 请求 |
你想想看,如果我想看某个 TCP 连接里有没有粘包现象,我会先用 tcp.stream eq 0 把整个流过滤出来,然后观察每个 TCP 段的数据长度和序列号变化。这个 tcp.stream 就是下一节要讲的核心概念。
3.3 TCP 流追踪功能
Wireshark 最强大的功能之一,就是能把属于同一个 TCP 连接的包"串"起来。这个功能叫 Follow TCP Stream。
3.3.1 什么是 TCP 流?
一个 TCP 连接由四元组唯一标识:源 IP + 源端口 + 目的 IP + 目的端口。Wireshark 会给每个连接分配一个 流编号(tcp.stream),从 0 开始递增。
你可以在显示过滤器里直接输入 tcp.stream eq 0,就能看到第一个 TCP 连接的所有包。这个编号是自动分配的,重启 Wireshark 后会重新编号。
3.3.2 如何使用 Follow TCP Stream?
操作很简单:在任意一个 TCP 包上右键 → Follow → TCP Stream。或者直接用快捷键 Ctrl+Alt+Shift+T(Windows/Linux)或 Cmd+Option+Shift+T(macOS)。
弹出来的窗口会显示整个 TCP 流的数据内容。默认是 ASCII 显示,你可以切换为:
- Hex Dump:十六进制 + ASCII 对照,适合分析二进制协议。
- C Arrays:把数据转成 C 语言数组格式,方便嵌入代码。
- Raw:纯原始字节流,适合导出文件。
- YAML:结构化输出,适合自动化处理。
0x0A 0x0B 是消息分隔符,那在 Hex Dump 里一眼就能找到。
3.3.3 流追踪的局限性
Follow TCP Stream 虽然方便,但它有个坑:它只显示应用层数据,不显示 TCP 头部信息。换句话说,你看不到序列号、确认号、窗口大小这些关键字段。
所以我的习惯是:先用 Follow TCP Stream 快速了解应用层交互的"剧情",然后回到主窗口,用 tcp.stream eq N 过滤出整个流,再逐包分析 TCP 头部。这样既能把握全局,又能深入细节。
3.4 实战:用 Wireshark 观察一个简单的 TCP 流
咱们来走一遍完整流程。假设我要分析客户端(192.168.1.100:54321)访问服务端(192.168.1.200:8080)的 HTTP 请求。
- 设置捕获过滤器:在捕获选项里输入
host 192.168.1.200 and tcp port 8080,只抓目标服务器的 8080 端口流量。 - 开始抓包:点击开始按钮,然后在客户端发起 HTTP 请求。
- 停止抓包:请求完成后停止。
- 定位流:在任意一个 TCP 包上右键 → Follow → TCP Stream。
- 观察数据:你会看到类似这样的内容(假设是 HTTP 请求):
GET /api/data HTTP/1.1
Host: 192.168.1.200:8080
User-Agent: curl/7.68.0
Accept: */*
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45
{"status":"ok","data":"hello world"}
嗯,这里要注意:如果服务端返回的数据被拆成了多个 TCP 段,Follow TCP Stream 会自动把它们重组好。但如果是粘包——比如服务端一次性发了两个 HTTP 响应——你会看到两个响应连在一起,中间没有明显的分隔。这就是粘包的典型表现。
3.5 本章知识体系
下面这张图帮你理清 Wireshark 环境搭建的核心逻辑:
从安装配置开始,到捕获过滤器和显示过滤器的分工,再到 TCP 流追踪和 Follow TCP Stream 的实战用法,这条链路就是 Wireshark 分析的核心工作流。后面分析粘包拆包时,你会反复用到这些功能。