1. 从“满屏十六进制”到“看懂网络”:Wireshark 到底改变了什么
第一次打开 Wireshark 的时候,我盯着满屏的十六进制字节和花花绿绿的协议列表,脑子里只有一个问题:这玩意儿到底能帮我干什么?后来真正上手做了几个抓包分析项目,才明白 Wireshark 的价值不在于“能抓包”——能抓包的工具多了去了,它的核心价值在于把看不见的计算机网络协议行为,变成了一段段可以逐字节查看、可以回放、可以对比的证据链。
说白了,Wireshark 就是网络世界的“行车记录仪”加“数据透视表”。你在浏览器里打开一个网页,按下 F12 能看到资源加载顺序,但看不到数据在网线上怎么分包、怎么重传、怎么确认;你在服务器上 ping 不通对方,traceroute 只能告诉你“卡在第三跳”,但看不到具体是丢包还是延迟抖动。这些底层细节,只有 Wireshark 能给你一个完整答案。
这篇文章适合三类人:刚学计算机网络课程、想把三次握手和 HTTP 报文“眼见为实”的学生;日常工作需要定位网络慢、连接失败、协议异常问题的运维和测试工程师;以及想通过流量分析来做安全排查、恶意行为分析的从业者。我会把从安装到实战分析的全过程写清楚,包括我自己踩过的坑和一些常规文档里不会写的细节。
1.1 它的核心原理:抓包与解码是两件事
很多人以为 Wireshark“抓到”的是一个完整的数据包,其实不是。Wireshark 真正抓到的,是网卡上经过的一段 0 和 1 组成的比特流,然后由它内部的协议解析器(dissector)按照协议规范逐层“翻译”成人能看懂的字段。所以理解 Wireshark 要抓住一个关键思路:抓包只是第一步,真正难的是解码和分析。
抓包层面,Wireshark 在 Windows 上依赖 Npcap,在 Linux 上依赖 libpcap,在 macOS 上依赖 BPF。这些底层库负责从网卡驱动那里把原始帧拷贝到用户态,再交给 Wireshark 的界面去展示。很多人问“为什么 Wireshark 抓不全数据”,十有八九是底层抓包库没装好、权限不够,或者抓包长度被限制了。这些细节后面会展开讲。
解码层面,Wireshark 内置了几千种协议解析器。它拿到一个以太网帧后,会先看 EtherType(例如 0x0800 是 IPv4、0x86DD 是 IPv6、0x8100 是 VLAN Tag),然后逐层向上解析:IP 头里的协议号(6 是 TCP、17 是 UDP),接着是 TCP 或 UDP 端口号,再进一步识别出 HTTP、DNS、TLS 等应用层协议。这一整套逻辑是自动完成的,但你要理解它的存在,才能在抓包出现“奇怪现象”时快速定位问题。
1.2 三种典型使用场景:学习、排障、安全
以我个人的经验,Wireshark 在不同场景下的用法差别很大,但都离不开“协议分析”这四个字。
学习场景最经典。我当时学 TCP 三次握手,课本上讲 SYN、SYN-ACK、ACK,看多少遍都记不牢。后来自己抓了一次包,亲眼看到本机发出的 SYN 包带着 Sequence Number,服务器的 SYN-ACK 包带着对方的序号和自己的序号,第三次 ACK 再带上确认号,整个过程一目了然。协议不是抽象概念,而是一个一个真实存在、有具体数值的字段。
排障场景更讲究效率。线上服务间歇性超时,应用日志看不出问题,我一般会抓包看 TCP 重传率、乱序情况、窗口大小变化,很快就能判断是网络问题还是应用问题。比如客户端发了一个 POST 请求,服务端迟迟不回 ACK,那十有八九是中间链路丢包;如果 ACK 都正常,但 HTTP 响应就是不出来,那就要看应用层了。
安全场景则侧重“异常”。流量里突然出现大量对外连接、DNS 解析了可疑域名、某个端口上有非预期协议,这些都可以通过过滤和统计功能快速发现。我曾经在一个内网环境里抓包,发现一台机器每隔半小时就向一个陌生 IP 发起 TLS 连接,顺着这个线索排查,最后确认是某软件的自动升级模块在悄悄工作。协议分析的价值,就是把“感觉不对劲”变成“有据可查”。
1.3 心里先有个协议分层概念:从帧、IP 包到 TCP 段
用 Wireshark 分析协议,不用把 OSI 七层背得滚瓜烂熟,但脑子里至少要有一个分层模型:最底层是物理链路,以太网帧里有源 MAC、目的 MAC 和类型字段;往上是 IP 层,负责寻址和路由;再往上是 TCP/UDP 层,负责端口和会话管理;最上面才是 HTTP、DNS、TLS 这些应用协议。
Wireshark 的“包详情”面板正好就按这个层级来展示:第一行是 Frame(整帧信息),第二行是 Ethernet II(以太网头),第三行是 Internet Protocol Version 4(IP 头),第四行是 Transmission Control Protocol(TCP 头),再往下才是应用层数据。看包时养成从下往上点开、逐层检查的习惯,遇到问题就不会慌。
2. 安装与基础配置:把分析环境一次性搭好
2.1 Windows、Linux、macOS 分别怎么装
Wireshark 官方提供 Windows 和 macOS 的安装包,Linux 则通过包管理器安装。但不同平台的注意事项差别很大,我分开说。
Windows 上安装有一点很容易忽略:安装过程中会提示安装 Npcap,一定要勾选。Npcap 是 Wireshark 在 Windows 上抓包的核心驱动,不装它,Wireshark 打开后看不到任何网卡接口。安装时建议勾选“Support raw 802.11 traffic”和“Install Npcap in WinPcap API-compatible Mode”,前者方便无线网卡抓取更多链路层信息,后者能兼容一些依赖 WinPcap 的老工具。另外,Npcap 安装完成后建议重启一次系统,确保驱动正常加载。
Linux 上用 apt 的话,执行sudo apt install wireshark就能装好。安装过程中会询问是否允许非 root 用户抓包,这里我建议选“是”,然后把自己加入 wireshark 用户组:
sudo usermod -aG wireshark $USER重新登录后就能在普通用户下抓包,不用每次 sudo,也避免因为权限问题导致抓包不完整。如果发行版没有图形界面,也可以装命令行版tshark,效果完全一样,只是没有窗口。
macOS 上最简单的方式是brew install --cask wireshark,它会同时安装 Wireshark 和 ChmodBPF。ChmodBPF 的作用是给当前用户授权访问 BPF 设备节点,没有它你打开 Wireshark 会看到接口列表但抓不到数据包。装完如果还是没权限,可以手动执行:
sudo chmod 644 /dev/bpf*总的来说,安装本身不难,难的是装完之后确认环境可用。我的经验是装完先打开 Wireshark,看左侧接口列表是否能看到一个或多个网卡接口,能看到了再去点击开始抓包,这叫“先验证环境,再进入战斗”。
2.2 选择网卡与混杂模式
正常抓包只需要选择自己机器上连接网络的网卡。但有时候你会发现,明明选中了“WLAN”或“以太网”,却只看到一些零零碎碎的广播包,看不到自己访问网页的流量。这通常是因为选错了网卡,或者没有开启混杂模式。
混杂模式(Promiscuous Mode)的意思是,让网卡不只接收发给自己的包,还接收网络中经过该接口的所有数据包。在 Wireshark 的接口列表里,每个接口上有个复选框,勾上 Promiscuous 就算开启混杂模式。不过要提醒一句:在普通交换网络里,即使开启混杂模式,你也只能收到广播包、组播包和自己相关会话的流量,其他主机之间的单播流量不会被交换机转发过来。想抓全网流量,得靠交换机端口镜像或 TAP 设备,这是硬件层面的问题,软件解决不了。
选择网卡时还有一个技巧:如果你不确定哪个接口有流量,可以先看看接口旁边的实时波形图,有波形跳动的那个接口就是当前有数据流动的接口。也可以点击接口右下角的“懂”图标,打开“Interface Options”,勾选“Hide”掉无用的虚拟网卡(比如 VMware、VirtualBox 的虚拟网卡),只保留物理网卡,减少干扰。
2.3 抓包前的三个“防坑设置”
我每次做正式抓包之前,都会先花 30 秒做三个设置,避免抓到一半发现数据不对。
第一个是关闭名称解析。Wireshark 默认会对 MAC 地址做厂商解析、对 IP 地址做反向域名解析,这些解析会拖慢抓包响应速度,而且在离线分析时还会因为发 DNS 请求产生额外流量。路径是:Capture > Options,把“Enable MAC name resolution”“Enable network name resolution”“Enable transport name resolution”三个勾全部去掉。
第二个是设置正确的抓包长度,也就是 snaplen。很多人会遇到“当时抓的数据包某部分内容缺失”,最常见原因就是这里被限制到了 520 字节。默认 Wireshark 抓包长度是 65535 字节,基本够用;一旦手动改小,比如设成 512、1024,那么超过这个长度的帧就只保留前半部分,后面的字节直接丢弃,应用层载荷就看不到了。后面我会专门用一节讲这个坑。
第三个是使用“双文件循环”或“环形缓冲”来长时间抓包,而不是傻傻地让它一直写一个文件。抓包文件到达一定大小后,再继续写入会导致 Wireshark 越来越卡,甚至直接崩溃。正确做法是在 Capture Options 里设置“Use multiple files”,比如每个文件 100MB、每 10 分钟切换一次,再用合适的 file count 控制总备份数量。这个功能对于“持久性诊断”和追查偶发问题特别重要。
3. 核心操作:从“抓得到包”到“看得懂包”
3.1 捕获过滤器与显示过滤器,本质区别要搞清楚
Wireshark 里有两套过滤器,很多人从入门到放弃都分不清。捕获过滤器(Capture Filter)是在数据进入 Wireshark 之前就过滤掉,使用的是 BPF 语法,过滤后不匹配的包根本不会进入内存。显示过滤器(Display Filter)则是在抓到包后,从已经存在的包列表里筛出你关心的,语法更丰富更直观。
举个例子:只想抓 80 端口 HTTP 流量,捕获过滤器写:
tcp port 80显示过滤器则写:
tcp.port == 80两者都能达到目的,但应用场景不同。抓包压力大时用捕获过滤器,可以避免磁盘写满和界面卡顿。日常分析时用显示过滤器,因为它可以随时调整且支持几乎无线索的组合。
我还是建议把显示过滤器作为主力,因为它的字段类型非常细,比如http.request.method == "POST"、tcp.flags.syn == 1 && tcp.flags.ack == 0、dns.qry.name contains "example"这些可以精确命中目标。捕获过滤器虽然效率高,但功能太粗,适合在大流量环境下做“预筛选”。
这里把常用过滤器整理成一个速查表:
| 需求 | 显示过滤器 | 捕获过滤器(BPF) | 说明 |
|---|---|---|---|
| 找所有 HTTP 流量 | http | tcp port 80 | HTTP 默认端口 |
| 找某台主机的流量 | ip.addr == 192.168.1.10 | host 192.168.1.10 | IP 过滤 |
| 找 TCP 的 SYN 包 | tcp.flags.syn == 1 && tcp.flags.ack == 0 | tcp[13] & 2 != 0 | 三次握手第一个包 |
| 找 DNS 请求 | dns.flags.response == 0 | udp port 53 | DNS 查询包 |
| 找特定 VLAN | vlan.id == 100 | vlan 100 | 仅适用于带 VLAN 标签的帧 |
| 看 UDP 前后间隔 | frame.time_delta > 0.1 | 无 | 显示两包间隔超过 100ms |
3.2 颜色规则和流追踪
Wireshark 默认给不同的协议分配了不同颜色:浅蓝色是 UDP,绿色是 HTTP,紫色是 TCP 等等。这个颜色不只是为了好看,当你打开一个几万行的抓包文件时,颜色能让你在 0.5 秒内定位出异常——比如大片红色代表 TCP 重传,黑色的往往是背景流量。如果你觉得默认配色不够明显,可以在“View > Coloring Rules”里自定义,比如把tcp.analysis.retransmission设成高亮的红色,把tcp.analysis.fast_retransmission设成橙色,这样重传一眼就能看到。
流追踪是我用得最多的功能之一。在任意一个 TCP 包上右键,选择“Follow > TCP Stream”,Wireshark 会把整个 TCP 连接中双向传输的载荷重新拼接起来,以原始字节流形式显示。这对分析 HTTP 请求响应特别有效:可以看到客户端完整的请求头、请求正文,服务端完整的响应头和响应正文,甚至能直接展示二进制文件内容。
但要注意,Follow TCP Stream 显示的是“应用层字节流”,不代表网络上的原始数据包形态。TCP 本身是流式协议,数据会按 MSS(Maximum Segment Size)被切成一段段才发出去,所以你看到的 HTTP 响应如果总长度是 2090 字节,实际包列表里可能有 3 到 4 个包才装得下。这个细节会直接解释“为什么一个包看起来那么短,数据却那么多”的问题。
3.3 解码为:让 Wireshark 识别“非标准端口协议”
Wireshark 的协议识别依赖端口号,但现实中有很多服务使用非标准端口,或者故意把 HTTP 协议跑在 8080、8443 这类端口上。如果你抓到了 8080 端口的流量,Wireshark 默认只会显示 TCP 层信息,看不到 HTTP 解析。解决办法是:选中任意一个包,右键 > Decode As,在弹出的对话框里把该 TCP 端口的规则改成 HTTP。改完之后,整个会话上的包都会重新按照 HTTP 协议解析。
这个功能非常实用。比如你抓到了一个看起来像 TLS 但在自定义端口上的流量,用 Decode As 选择 TLS 协议,立刻就能解密看内容。还有电口抓 RTP 音视频、抓 MMST 流媒体这类场景,也需要先手动指定“解码为”,否则 Wireshark 不知道这些载荷是什么协议,自然无法显示对应的协议字段。
4. 实战:HTTP 请求、UDP 时间间隔与数据包大小之谜
4.1 用一次 HTTP 访问把三次握手和响应说清楚
纸上谈兵不如抓一个真实的 HTTP 请求。我建议你找一个测试网站(用自己本地服务更好,避免隐私问题),在 Wireshark 里开始抓包,然后访问首页,停止抓包。在过滤器里输入http,你会看到典型的请求响应序列:
首先是三次握手,过滤器用tcp.flags.syn == 1 || tcp.flags.fin == 1可以单独筛选出来。第一个包是 SYN,源端口是浏览器随机分配的临时端口(比如 50123),目的端口 80,Seq 号是一个较大的随机值。第二个包是服务器返回的 SYN-ACK,Seq 号是服务器自己的随机值,Ack 号是“客户端 Seq + 1”。第三个包是客户端的 ACK,不带数据。三次握手完成后,TCP 连接进入 ESTABLISHED 状态,客户端紧接着发出 HTTP GET 请求。
HTTP 请求本身在 Wireshark 里很容易识别:你可以看到GET / HTTP/1.1,后面跟着 Host、User-Agent、Accept 等请求头。服务器响应则是一串以HTTP/1.1 200 OK开头的包,里面带 Content-Length、Content-Type 等响应头,再往后才是 HTML 正文。如果页面引用了多张图片、多个 CSS 文件,你会看到浏览器自动为每个资源建立新的 TCP 连接,或者复用已有连接(HTTP Keep-Alive),在抓包文件里表现为同一源端口、目的端口的多条请求响应交错在一起。
4.2 为什么单个包看起来只有 520 字节,实际内容却有 2090 字节
这个疑问很多人遇到过:Wireshark 包列表里明明显示一个 TCP 包的长度只有 520 字节,可服务器返回的响应内容却是 2090 字节,那些字节去哪了?
其实 Wireshark 里“Length”那一列显示的是当前这一个帧的大小,并不等于应用层消息的大小。以太网 MTU 通常是 1500 字节,扣除 IP 头(20 字节左右)和 TCP 头(20 字节左右),一个 TCP 分段最多能承载约 1460 字节的应用数据。如果 HTTP 响应体是 2090 字节,TCP 会把它分成两个或更多的分段:1460 + 630 = 2090,对应到包列表就是两个包。如果你看到的包长是 520 字节,那很可能是这个包属于某条被更小 MSS 限制的连接(比如 PPPoE 上网会少 8 字节),或者抓包时设置了 snaplen 限制,只截取了每个帧前 520 字节。被截断的包在 Wireshark 里会显示为[TCP segment of a reassembled PDU],用 Follow TCP Stream 能看到完整拼接内容。
如果你想在一堆包里找到完整的 2090 字节数据,正确姿势不是去看某个包的长度,而是右键 > Follow > TCP Stream,在会话视图里查看全部载荷;或者用 “File > Export Objects > HTTP” 直接导出被 Wireshark 重组好的文件对象。这才是看到“完整数据”的路径。
4.3 怎么筛出 UDP 前后两包的时间间隔
“如何筛选出 UDP 前后两包的时间间隔”这个需求,经常出现在音视频延迟分析和网络监控场景里。比如你要判断两个 UDP 包之间的间隔是否稳定,或者找出间隔突然变大的位置,Wireshark 有一个内置字段可以直接用:frame.time_delta,它表示当前帧与前一帧的时间差,单位是秒。
想要把间隔超过 100ms 的 UDP 包都筛出来,显示过滤器写:
udp && frame.time_delta > 0.1当然,这个筛选是针对所有 UDP 包的前后关系计算的,不是针对同一个五元组会话。如果你想看“同一个 UDP 会话前后两包的间隔”,建议先过滤出会话,再在时间列上使用“View > Time Display Format > Seconds Since Previous Captured Packet”,这样每一行都会直接显示该包相对于上一包的毫秒数,一眼就能看出抖动位置。
如果还想更细地输出到文件里分析,可以用 tshark 命令:
tshark -r capture.pcap -Y "udp" -T fields -e frame.number -e ip.src -e frame.time_delta结果会打印出每一帧的编号、源 IP 和时间间隔,方便继续用脚本处理。
5. 进阶玩法:TLS 解密、VLAN 分析、RTP 流转视频
5.1 用 SSLKEYLOGFILE 解密 HTTPS 流量
默认情况下,Wireshark 看到 HTTPS 流量只能显示 TLS 层信息:ClientHello 里的 SNI 域名、证书序列号、加密套件这些。要看到 HTTP 明文,就必须拿到会话密钥。对于自己可以控制客户端的场景,最方便的方式是设置环境变量SSLKEYLOGFILE。
以 Windows 为例,先把环境变量设到一个你能找到的位置,比如D:\keys\sslkey.log,然后用同一个终端启动 Chrome(或者 Firefox、Edge),在这个浏览器里访问目标网站。接着在 Wireshark 中打开 Preferences > Protocols > TLS,在“(Pre)-Master-Secret log filename”里填入同一个文件路径。重新抓包后,你会发现原来加密的 HTTP 访问内容全部变成明文了。
这里有几个细节值得注意:
- 只需要在浏览器启动前设置好环境变量,浏览器会把每次 TLS 会话的随机数和主密钥写入这个日志文件。密钥是绑定浏览器进程的,换一个终端或换一个浏览器启动方式就失效。
- TLS 1.3 里能解密的字段比 TLS 1.2 少,因为很多握手信息本身就是加密的,但应用层 HTTP 内容依然可以解出来。
- 这个密钥文件非常敏感,任何人拿到它都能解密对应的历史流量,分析完毕及时删除。
- 如果只是想抓 HTTPS 的域名,不关心明文,其实不需要解密。直接在显示过滤器里看
tls.handshake.extensions_server_name,就能提取 ClientHello 中携带的 SNI 域名。
5.2 以太网里的 VLAN 标签怎么看、怎么筛
VLAN(虚拟局域网)在 Wireshark 里不是一个独立的协议,而是嵌在以太网帧头部的一个 4 字节 802.1Q 标签。普通以太网帧的 EtherType 在以太网头之后,比如 0x0800 表示 IPv4。但带 VLAN 标签的帧,以太网头之后会先出现 0x8100,随后是 2 字节的 TCI(其中前 3 bit 是优先级,1 bit 是 DEI,剩下 12 bit 是 VLAN ID),再往后才是真实的 EtherType 和 IP 数据。
Wireshark 抓到这种帧后,会新增一行802.1Q Virtual LAN,里面显示 Priority、DEI、ID 和 Type 字段。如果你想筛选某个 VLAN 的流量,显示过滤器写:
vlan.id == 100如果你想抓包过程中就只看某个 VLAN 的流量,捕获过滤器写:
vlan 100但现实中有个坑:很多 Windows 网卡驱动默认会把 VLAN 标签剥离掉,你再抓也看不到 VLAN 信息。遇到这种情况,可以先检查网卡的“高级属性”里有没有类似“VLAN ID”“Priority & VLAN”的选项,把它设置成 0 或者启用“不剥离 Tag”;如果驱动不支持,可以在交换机上把端口配成 trunk 并保留 Tag,再通过端口镜像把流量引出来抓。Wireshark 显示不出 VLAN,多数情况不是你抓包姿势错了,而是网卡把标签“吃”掉了。
5.3 RTP 流转视频:把实时语音视频流还原出来
抓 RTP 包是音视频类问题排查里比较硬核的需求。RTP(Real-time Transport Protocol)通常跑在 UDP 上,负载是音频或视频编码数据。Wireshark 里把它变成可视化内容的核心路径是:
先把过滤器设为rtp,看到流量后,打开“Telephony > RTP > RTP Streams”。这里会列出所有检测到的 RTP 流,包括源 IP、端口、SSRC、包数、丢包率、抖动等统计信息。选中你关心的流,点击“Analyze”,可以查看 RTP 序列号是否有跳跃、时间戳是否连续、是否存在乱序和丢包。
如果要导出成视频或音频文件,我一般用两条路线。一是保留原始抓包文件,选中流后点击“Streams > Save”,保存成.raw或.au音频文件,再导入 VLC 播放或者用 ffmpeg 转码。二是直接点击“Play”按钮进行实时回放(需要 Wireshark 内置的 RTP Player 功能),用扬声器听声音是否卡顿。对于视频 RTP 流,Wireshark 自身不直接导出文件,需要你把 RTP 载荷按 H.264/H.265 格式抽取后交给 ffmpeg 处理。命令大致是:
ffmpeg -f h264 -i extracted.h264 -c copy output.mp4这里最关键的前提是,抓包时要保证 RTP 包没有被截断,否则解码出来的视频会出现花屏和音画不同步。所以建议抓包前把 snaplen 调到 65535,并关闭名称解析。
5.4 时间显示设为毫秒级
有时候看抓包文件,默认时间列只精确到秒,分析延迟完全不够用。把时间显示改成带毫秒甚至微秒的方法是:打开“View > Time Display Format > Seconds With Milliseconds”,或者直接在时间列标题上右键,选择“Column Preferences”配置时间格式。这个设置对前面提到的 UDP 时间间隔分析也很有帮助,因为毫秒精度才能看清微小的抖动。
如果你在找的是“MMS 设置”,那可能是两回事:MMS 协议(多媒体消息服务)的解析在 Wireshark 的 Protocol 配置里可以通过“Preferences > Protocols > MMS”打开或关闭。若你抓包时发现 MMS 相关字段不显示,可以先确认协议首选项里有没有禁用对应解析器,再看载荷格式是否符合标准。不过对绝大多数人来说,需要的是毫秒时间显示,这步设置更实用。
6. 常见问题与排查技巧实录
6.1 Wireshark 一直卡住、转圈,怎么破
Wireshark 卡住大概是最毁体验的问题。我排查过多个案例,原因通常集中在四类。
第一类是抓包文件太大。用一个几十 GB 的 pcap 文件在图形界面里滚动,肯定会卡,因为 Wireshark 要为每个包做字段索引和解码。解决方式:先用显示过滤器缩小范围,或者用tshark命令行做预处理,再打开精简后的文件。
第二类是实时抓包时网络流量太大,比如在核心交换机镜像口上直接抓包。此时应尽量用捕获过滤器预筛,或者用 dumpcap 单独抓包,不让 Wireshark GUI 实时处理。也可以降低刷新频率:在 Preferences > Appearance 里调低 GUI 更新速度。
第三类是协议解析器“炸了”。某些畸形报文会让个别解析器进入死循环或疯狂分配内存,表现就是界面一直转圈。这种情况下可以在 Preferences > Protocols 里暂时禁用可疑协议,或者用-d参数重新定义解码。
第四类是磁盘满了,导致抓包文件写不进去。Wireshark 本身不会提示,但会表现为抓包后文件不增长、界面卡死。所以长时间抓包前,一定要检查磁盘剩余空间,并设置好文件轮换。
6.2 长时间抓包的正确姿势:dumpcap 和环形缓冲
长时间抓包不只是打开 Wireshark 然后挂着这么简单。图形界面挂着不仅耗内存,而且一旦网络量稍大,UI 线程就会成为瓶颈。我的推荐做法是:用 Wireshark 自带的 dumpcap 命令行工具在后台抓包,等抓完再用 Wireshark 打开分析。
比如你要在 eth0 上持续抓 2 小时,每 100MB 换一个新文件,最多保留 20 个文件:
dumpcap -i eth0 -b filesize:102400 -b files:20 -w /data/capture.pcapng这个命令的好处是 dumpcap 只负责抓包写文件,开销极小,几乎不丢包。抓完还能把多个 pcapng 合并成一个大文件,用 mergecap 操作:
mergecap -w all.pcapng /data/capture_*.pcapng另外,长时间抓包还要注意文件命名的轮转逻辑。Wireshark 在 GUI 的 Capture Options 里也提供了“Use multiple files”选项,设置方式和 dumpcap 类似,都不用额外装工具。我个人强烈建议能命令行就命令行,把 GUI 留给分析阶段,抓包阶段越轻量越好。
6.3 查看以太网发送源数据包的字节内容
有时候你只想确认“某个源 MAC 发出的数据包里到底含有什么字节”,不需要看协议树。Wireshark 底部的 Packet Bytes 面板就是干这个的:选中任意一个包,底部会按十六进制和 ASCII 两种方式展示原始字节内容。如果你要看某个源 MAC 发出的所有流量,先筛选:
eth.src == 00:1a:2b:3c:4d:5e再选中感兴趣的包,在 Packet Bytes 面板里逐字节查看。对于大量数据处理,可以用 tshark 直接输出十六进制内容:
tshark -r capture.pcap -Y "eth.src == 00:1a:2b:3c:4d:5e" -x-x参数会输出类似 hex dump 的格式,方便复制到其他工具里继续分析。这个技巧在排查 MAC 地址欺骗、定位特定设备发送异常报文时非常有用。
6.4 可视化统计:Wireshark 帮你画出流量全貌
Wireshark 不是只能看包列表,它还内置了一套统计可视化工具,我最常用的是“Statistics > Flow Graph”和“Statistics > IO Graph”。
Flow Graph 能把整个会话的 TCP/UDP 交互过程画成一条时间线,每一步是哪个方向、携带了什么标志位,都清晰标出。排障时用来观察一次请求从哪里开始、哪里停顿、哪里重传,非常直观。IO Graph 则更适合看整体流量趋势,比如在某段时间内某个过滤器的包速率曲线,你可以叠加上多条曲线来对比“整体流量”和“TCP 重传流量”,快速找到异常时间段。
如果上面这些常规统计还不够用,可以打开“Statistics > Conver Stations”按主机维度统计每个 IP 的进出流量和包数。排查内网“谁在狂发包”的时候,这个表比一个个看包高效得多。
7. 一些掏心窝的使用体会
最后说点实际操作里的感受。Wireshark 这个工具,上手很容易,真正用好确实要经过大量练习。我的一点建议是:不要只在出问题的时候才打开抓包工具,平时可以给自己布置一些“实验性任务”,比如抓一次完整的 HTTPS 访问并尝试解密、抓一次视频网站的 RTP 流并导出音频、或者把一次 DNS 解析的全过程拆解到字段级别。这样真遇到线上问题时,你的反应速度和对异常包的敏感度都会完全不同。
还有一个细节:抓包文件是非常有价值的“证据”,平时尽量把抓包时的客户 IP、服务器 IP、时间范围、过滤条件等环境信息记在一张纸上,或者用注释字段写进 pcapng 文件里(Statistics > Capture File Properties 里的 Comments)。等过几天再回看文件时,你才能想起来当时的上下文,不然一堆十六进制字节摆在那里,谁看都会头大。