D
开发工具箱

Wireshark 实战:从抓第一个包到追踪完整数据流

安全工具 2026年9月16日 约 1 分钟阅读

一次”接口偶发 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 最该先记住的界面:

① 选择网卡并开始捕获 ② 抓包引擎libpcap / NPcap 读原始帧 捕获过滤器抓包前就丢弃无关流量 ③ 包列表区 List每行一个包:源/目的/协议 显示过滤器抓包后再筛选,语法灵活 ④ 包详情区 Details协议树逐层展开 ⑤ 原始字节区 Bytes十六进制 + ASCII
图 1: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.1tcp port 80Wireshark 字段语法(ip.addr == 1.1.1.1tcp.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 流走:在包上右键 → FollowTCP 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

这就是一个”原始数据包”在列表里的样子——一行摘要。点中它,下面详情区会展开成一棵树。分析一个包的标准动作,就是从最外层往里逐层剥

原始数据包(包列表一行):192.168.1.100:54321 → 93.184.216.34:80 Frame 1捕获时间 0.045682s · 帧长 542 字节 · 协议 HTTP Ethernet II源 MAC 00:1a:2b:3c:4d:5e → 目的 MAC 00:0c:29:ab:cd:ef IPv4192.168.1.100 → 93.184.216.34 · TTL 64 · 协议号 6(TCP) TCP54321 → 80 · 标志 [PSH,ACK] · Seq 1 · Ack 1 · Win 64240 HTTPGET /api/v1/users HTTP/1.1 · Host: api.example.com 逐层展开 + 对照原始字节,一行包就被还原成完整请求
图 2:分析一个原始数据包的标准动作——从最外层往里逐层剥。Frame 看时间与长度,Ethernet 看 MAC,IPv4 看源/目的 IP 与协议号,TCP 看端口与标志位,最内层的 HTTP 才是真正的请求内容。点上面的「播放」可以看逐层下钻的过程。

每一层该看什么,我拆开讲一遍:

  1. Frame(帧):最外层信封。先看帧长度合不合理、捕获时间对不对得上你操作的那一刻。
  2. Ethernet II(二层):源/目的 MAC。注意跨网段时,目的 MAC 是下一跳网关的 MAC,不是最终服务器的 MAC——很多人误以为这里该是目标服务器。
  3. IPv4(三层):源 IP、目的 IP、TTL、协议号(6=TCP,17=UDP)。确认包确实去了该去的地方,没被错误路由。
  4. TCP(四层):源/目的端口、标志位、Seq/Ack、窗口大小。连接是建不上还是建上了又断,全看 SYN/ACK/FIN/RST 这几个标志位。
  5. 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 会话散落各包)包 #12 54321→80 [PSH,ACK]包 #13 80→54321 [ACK]包 #14 54321→80 [PSH,ACK]包 #15 80→54321 [PSH,ACK]包 #16 54321→80 [FIN,ACK] 右键任一包 → Follow → TCP Stream ↑ 客户端 → 服务器(上行)GET /index.html HTTP/1.1 ↵ Host: example.comUser-Agent: curl/8.0 ↓ 服务器 → 客户端(下行)HTTP/1.1 200 OK ↵ Content-Length: 612{"users":[...]} 两条流拼起来 = 一次完整、可读的对话 用途:看完整请求/响应、发现明文凭据、重组文件传输另有 HTTP Stream / TLS Stream(解密后)
图 3:Follow Stream 把一个 TCP 会话里散落的包,按方向重组成两段可读文本(蓝=客户端发服务器,紫=服务器回客户端)。两段拼起来就是一次完整对话,点其中任意一行还能跳回原始包。点上面的「播放」可以看重组过程。

具体操作(以 TCP 为例):

  1. 在包列表里随便选中这个会话的任一包(请求包或响应包都行)。
  2. 右键 → FollowTCP Stream(HTTP 流量也可选 HTTP Stream;TLS 解密后选 TLS Stream)。
  3. Wireshark 弹出一整个窗口,用两种颜色区分方向:一种颜色是客户端发给服务器的,另一种反过来。
  4. 想看某一句对应的原始包?在流窗口里点那一行,主界面会自动跳回并选中对应的原始包。

这招在企业里特别好用:

  • 看完整的 HTTP 请求与响应:不用再一个个包拼,直接看到 GET200 OK 的全文,定位接口为什么慢、返回了什么。
  • 揪出明文凭据:有些内部系统还在用 HTTP 传密码、Token,Follow 一下立刻原形毕露——这也是安全自查的常用手段。
  • 重组文件传输:FTP、邮件附件这类大文件被拆成很多包,Follow 后能按流另存为原始文件。

企业里 Wireshark 到底用在哪

别把它想成”黑客工具”。在正规企业里,它是运维、网络、安全、甚至开发都在用的排障标配。下面这张决策流,对应了最常见的几类场景:

线上现象:慢 / 不通 / 异常 在相关主机或网段抓包 用显示过滤器缩小范围 故障排查· TCP 重传 / Dup ACK· RTT 增大 / Zero Window 安全分析· 异常外联 IP· 明文口令 / 可疑 DNS 性能分析· IO Graph 吞吐· TCP 流图 / 应用时延 排障闭环:抓包 → 过滤 → 分析 → 验证修复;Wireshark 是看清「线上到底发生了什么」的最后一招
图 4:企业排障决策流。先明确现象,在贴近故障点的主机或网段抓包,用显示过滤器收敛范围,再按故障类(TCP 健康度)、安全类(异常/明文)、性能类(吞吐/时延)三个方向下钻定位根因。点上面的「播放」可以看决策路径。

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 请求路径,适合写进脚本做自动化分析。

相关工具