Wireshark 实战:从抓第一个包到追踪完整数据流
一次”接口偶发 504”的翻车
去年我们有个接口偶发 504,Nginx 日志里看是 upstream timeout,应用日志里却又看不到慢查询,两边都说”不是我的锅”。最后我在网关上抓了 30 秒包,才发现是后端某台机器的 TCP 接收窗口被占满(Zero Window),请求卡在连接里没真正发出去——应用层当然什么日志都打不出来。
这种”日志看不出、但线上就是有问题”的场景,Wireshark(或 tshark 命令行版)几乎是最后的真相来源。这篇就把从”怎么抓第一个包”到”怎么把一个原始数据包还原成可读对话”的完整路子讲清楚。
Wireshark 只用于你有权限、有授权管理的网络与主机抓包,切勿对未授权网络做任何抓包行为。
Wireshark 到底能干什么
一句话:它把网卡驱动层收到的每一个原始数据帧抓下来,按协议一层层解析给你看——从最底层的以太网帧,到 IP、TCP/UDP,再到 HTTP、DNS、TLS 这些应用层协议,一直到线路上的真实字节。
它不是”网络监控大屏”,而是一个显微镜:平时用不上,一旦要回答”线上到底发生了什么”,它就是那把最利的解剖刀。
基础使用方法
1. 选对网卡,先抓起来
打开 Wireshark,第一件事是选正确的网卡。很多人抓不到包,八成是因为选了 Wi‑Fi 网卡却在有线网里测,或者反过来。选中网卡后点左上角鲨鱼鳍图标(或双击网卡名)就开始捕获;想停就点红色方块;抓完了记得 File → Save 存成 .pcapng,方便事后慢慢分析或发给同事。
抓到的包会在三个窗格里展示,这也是 Wireshark 最该先记住的界面:
- 包列表区(List):每个包一行,列是
No./Time/Source/Destination/Protocol/Length/Info。排错第一步就是在这里扫一眼整体,看有没有大量重传、RST、或某个 IP 异常。 - 包详情区(Details):选中一行后,用一棵树把协议从外层到内层展开——这是分析的核心区。
- 原始字节区(Bytes):最底下那块十六进制 + 右侧 ASCII,是报文在网线上的真实字节。要定位某个字段在报文里的偏移、或怀疑解析有误时,看这里。
2. 两种过滤器:抓包前 vs 抓包后
新手最容易混淆的俩概念,记这一句就够:捕获过滤器决定”抓哪些”,显示过滤器决定”看哪些”。
| 捕获过滤器 (Capture Filter) | 显示过滤器 (Display Filter) | |
|---|---|---|
| 生效时机 | 抓包之前设置,不关心的包直接不进文件 | 抓到之后随时输入,纯前端筛选 |
| 语法 | libpcap 语法(host 1.1.1.1、tcp port 80) | Wireshark 字段语法(ip.addr == 1.1.1.1、tcp.port == 80) |
| 性能 | 省 CPU、省磁盘,高流量必备 | 不影响抓包,但包太多时界面会卡 |
| 能否改 | 得停了重抓 | 随时改,可叠加 |
日常分析强烈建议先宽抓、后用显示过滤器筛——因为抓的时候你往往还不知道要盯着什么;等存好 .pcapng,再用显示过滤器反复试。站内的 Wireshark 过滤命令生成器 把两种语法都做成了可视化表单,选好 IP/端口/协议/标志位直接生成可复制表达式,还能在”常用过滤命令”里一键拷贝。
几个最常用的:只看某主机 ip.addr == 192.168.1.1;只看某端口 tcp.port == 443;只看 HTTP http;排除本机回环 ip.addr != 127.0.0.1;TCP 握手失败 tcp.flags.syn == 1 && tcp.flags.ack == 0。
3. 最常用的几个起步动作
- 跟着 TCP 流走:在包上右键 →
Follow→TCP Stream,这是后面要重点讲的”追踪数据流”。 - 着色规则:
View → Coloring Rules,重传、RST 等会自动标红,扫包列表时一眼能看见异常。 - 专家信息:
Analyze → Expert Information,Wireshark 会替你汇总”重传/乱序/零窗口/可疑”等事件,新手排错先看这里最省力。 - 统计工具:
Statistics → IO Graph(吞吐量曲线)、Conversations(会话排行)、Protocol Hierarchy(协议占比),快速定位”流量到底耗在哪”。
实战:拿到一个原始数据包,怎么分析
这是最常被问的问题。假设你打开抓到的文件,包列表里有一行:
No. Time Source Destination Protocol Length Info
12 0.045682 192.168.1.100 93.184.216.34 HTTP 542 GET /api/v1/users HTTP/1.1
这就是一个”原始数据包”在列表里的样子——一行摘要。点中它,下面详情区会展开成一棵树。分析一个包的标准动作,就是从最外层往里逐层剥:
每一层该看什么,我拆开讲一遍:
- Frame(帧):最外层信封。先看帧长度合不合理、捕获时间对不对得上你操作的那一刻。
- Ethernet II(二层):源/目的 MAC。注意跨网段时,目的 MAC 是下一跳网关的 MAC,不是最终服务器的 MAC——很多人误以为这里该是目标服务器。
- IPv4(三层):源 IP、目的 IP、TTL、协议号(
6=TCP,17=UDP)。确认包确实去了该去的地方,没被错误路由。 - TCP(四层):源/目的端口、标志位、
Seq/Ack、窗口大小。连接是建不上还是建上了又断,全看SYN/ACK/FIN/RST这几个标志位。 - HTTP(应用层):最里面才是真正内容——请求行、Header、Body。到这一层,一个”原始包”就被还原成了可读的请求。
拿上面那个包举例:源是内网 192.168.1.100:54321,目的是公网 93.184.216.34:80,TCP 标志是 [PSH,ACK](说明连接已建立、正在传数据),应用层是 GET /api/v1/users。三步你就知道:这是一次正常的、已建立的 HTTP GET 请求,方向、端口、状态都对。如果它慢,问题多半在响应侧或网络上,而不是请求本身。
追踪数据流:Follow Stream 把会话拼回来
单个包能看一层,但真实的通信是成百上千个包组成的一次会话。一个 HTTP 请求可能横跨几十个 TCP 包,光看单行 GET 根本看不到响应内容。这时就要用 Follow Stream——它把一个连接里的所有包按方向重新组装,让你像看聊天记录一样看完整对话。
具体操作(以 TCP 为例):
- 在包列表里随便选中这个会话的任一包(请求包或响应包都行)。
- 右键 →
Follow→TCP Stream(HTTP 流量也可选HTTP Stream;TLS 解密后选TLS Stream)。 - Wireshark 弹出一整个窗口,用两种颜色区分方向:一种颜色是客户端发给服务器的,另一种反过来。
- 想看某一句对应的原始包?在流窗口里点那一行,主界面会自动跳回并选中对应的原始包。
这招在企业里特别好用:
- 看完整的 HTTP 请求与响应:不用再一个个包拼,直接看到
GET和200 OK的全文,定位接口为什么慢、返回了什么。 - 揪出明文凭据:有些内部系统还在用 HTTP 传密码、Token,Follow 一下立刻原形毕露——这也是安全自查的常用手段。
- 重组文件传输:FTP、邮件附件这类大文件被拆成很多包,Follow 后能按流另存为原始文件。
企业里 Wireshark 到底用在哪
别把它想成”黑客工具”。在正规企业里,它是运维、网络、安全、甚至开发都在用的排障标配。下面这张决策流,对应了最常见的几类场景:
1. 网络故障排查
连接时通时断、文件传一半卡住、VPN 老掉线——这类问题日志往往无能为力。抓包后重点看 TCP 的”健康指标”:
- **重传(Retransmission)**和 重复 ACK(Dup ACK):说明链路在丢包,网络质量或中间设备有问题。
- RTT 突然变大:某一跳延迟飙升,结合
ping/mtr能锁定是哪段链路。 - Zero Window / Window Full:对端接收窗口被占满,发送方被迫停等——开头那次 504 就是它。常见于后端处理慢、或应用没及时读 socket。
2. 应用层 / 接口问题定位
“接口很慢”到底是慢在哪?抓包 + Follow Stream 能直接看到:请求什么时候发出、服务器多久才回 200 OK、响应体多大。TLS 流量若配置了密钥(或浏览器 SSLKEYLOGFILE),还能解密后看应用层。结合 安全常见端口 先确认服务跑在哪个端口,过滤起来更快。
3. 安全分析与入侵排查
- 异常外联:某台内网机器频繁连陌生公网 IP?抓包看它到底在和谁通信、传了什么。
- 明文凭据:内部系统用 HTTP 传密码、Token,Follow 一下原形毕露,是合规自查的高频动作。
- 可疑 DNS / 协议:恶意软件常借 DNS 隧道外泄数据,看 DNS 查询的域名与频次能发现苗头。
排查时配合 Iptables 命令生成器 在边界做丢包/限流策略、Nmap 做主机发现,能形成”发现→阻断→验证”的闭环。
4. 协议 / 自研协议调试
自研的私有 TCP 协议、硬件设备的私有报文,没有现成解析器时,就靠原始字节区对着协议文档一个个字段对偏移。Wireshark 还支持用 Lua 写 dissector,把私有协议也变成可展开的树。
5. 性能与容量分析
- IO Graph:看吞吐量随时间的变化曲线,一眼找到流量尖峰。
- TCP 流图(Flow Graph):把一次连接的状态跃迁画成时间线,SYN 慢、握手后空等,都看得见。
- 协议层级(Protocol Hierarchy):确认流量到底耗在哪个协议上,决定优化方向。
排错 FAQ
Q:抓不到任何包?
先确认网卡选对了(无线/有线别搞混);在云服务器上要抓对应的虚拟网卡(如 eth0),且往往需要在有流量的那一侧抓;Linux 上普通用户可能没权限,加 sudo 或给 dumpcap 设 capability。
Q:包太多卡死界面?
别一上来就全抓。要么抓之前设捕获过滤器(如 host 1.2.3.4)缩小范围,要么先宽抓一小段时间(几十秒)存盘,再用显示过滤器慢慢筛。
Q:TLS/HTTPS 流量全是密文看不了?
需要服务端私钥,或客户端导出 SSLKEYLOGFILE 给 Wireshark 配置(Preferences → Protocols → TLS → (Pre)-Master-Secret log)。没有密钥,应用层内容天然不可见——这正是 HTTPS 的设计目的。
Q:Follow Stream 出来的内容是乱码? 大概率那一路不是文本协议(比如是图片、压缩包、二进制 RPC),或者方向混在一起。可在流窗口切换”仅看一个方向”,或把流另存为原始文件用专门工具打开。
Q:命令行环境怎么用?
用 tshark(Wireshark 的终端版),例如 tshark -i eth0 -Y "http" -T fields -e http.request.uri 直接提取 HTTP 请求路径,适合写进脚本做自动化分析。
相关工具
- Wireshark 过滤命令生成器:可视化生成显示过滤器与捕获过滤器,并内置常用过滤命令速查。
- Iptables 命令生成器:在边界做丢包、限流、端口转发的命令生成与速查。
- Nmap 命令生成器:主机发现与端口扫描,和抓包配合做”发现→验证”。
- 安全常见端口:排错时快速确认服务跑在哪个端口、对应什么风险。
- Linux 常用命令:抓包主机上的系统/网络/权限等配套运维命令。