ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Wireshark抓包实战:从接口超时、TCP重传到TLS解密排障

Wireshark抓包实战:从接口超时、TCP重传到TLS解密排障 被问过无数次接口偶发超时日志干干净净怎么查最后基本都是靠一次 Wireshark 抓包把问题钉死的——要么是链路上有 TCP 重传要么是服务端处理慢到客户端先超时了要么根本就是 DNS 慢。Wireshark 就是个把网卡上流过的每一个比特摊开给你看的工具它能告诉你两台机器之间到底聊了什么、谁先沉默、谁在重发、每个人等了多久。这篇东西写给两类人一类是刚装好 Wireshark、打开界面看着满屏包不知道从哪下手的初学者另一类是已经会抓包、但总在筛不出来字节看不全一开就卡住这些细节上栽跟头的老手。下面写的内容都围绕实际操作展开装完就能用遇到坑能照着排查。1. 装好之后先别急着点开始搞清 Wireshark 到底能看到什么很多新手第一天就卡在一个错误的预期上——以为装上 Wireshark 就能看到整个办公室的网络。它看到的范围取决于你把网线插在什么位置、网卡处于什么模式这一点必须先想明白否则后面所有分析都是在错误的前提上打转。1.1 抓包的物理边界一块网卡能看到多少普通交换式以太网里你的网卡默认只收到两类帧发给自己的单播、广播和多播。所以在一台普通办公电脑上抓包你只能看到这台机器的收发流量看不到同事之间的对话。要看到更多只有几个办法把交换机某个口配成镜像口、在两条链路之间串一个支持汇聚的设备、或者用支持监听模式的无线网卡抓空口。我见过有同事抓了半天只有自己机器的包然后怀疑 Wireshark 坏了其实这是网络结构决定的正常现象。还有一种常见误解是抓包会不会影响网速。抓包本身是被动复制不会拦包、不会改包、不会发成代理正常情况下对业务透明。真正影响性能的是抓包文件的写入速度和界面渲染高流量场景下如果还开着实时刷新和着色UI 线程会跟不上内核收包的节奏最后表现成底部状态栏那行Dropped:的数字一直往上涨——这才是抓包把机器拖慢了的真正原因。提示只抓自己有权处理的链路和自有服务抓下来的 pcap 里可能包含凭据、令牌、内网地址别随手往外发。1.2 Windows 上装 WiresharkNpcap 那几个勾怎么选Windows 版 Wireshark 本身只是个分析器真正干活的是驱动Npcap早期是 WinPcap。安装过程中会弹出一堆选项这里逐个说清安装选项建议原因说明Install Npcap in WinPcap API-compatible Mode勾选一些老工具仍依赖 WinPcap 的接口勾上兼容性更好Restrict Npcap drivers access to Administrators only单人使用可勾多人共用机器建议不勾勾上后只有管理员组能抓包安全性更好但非管理员账号会看到空网卡列表Support raw 802.11 traffic (monitor mode)需要抓无线空口时勾只有特定芯片的无线网卡支持监听模式勾了也不代表一定能用Install USBPcap有 USB 设备排障需求时勾抓 USB 总线蓝牙 HCI 类流量常靠它Loopback adapter需要抓本机回环时勾Windows 默认没有回环网卡不勾就抓不到 127.0.0.1 的包装完之后有个高频故障网卡列表是空的或者只有一个以太网却抓不到任何东西。八成是 Npcap 的服务没起来或者被安全软件拦了驱动加载。可以在服务列表里找npcap相关的项确认状态。另一个坑是机器上装过老版 WinPcap两者共存会让接口枚举错乱老老实实卸干净再装。1.3 Linux 和 macOS 上别一直用 sudoLinux 下最省事的做法是让普通用户也能调用抓包能力而不是每次都sudo wireshark以 root 跑图形程序本身也不是好习惯。安装时会自动创建一个wireshark用户组把自己加进去重新登录即可sudo dpkg-reconfigure wireshark-common # 选择允许非 root 用户抓包 sudo usermod -aG wireshark $USER # 重新登录后验证 groups | grep wireshark如果因为权限策略不能改组退而求其次给dumpcap单独加能力sudo setcap cap_net_raw,cap_net_admineip /usr/bin/dumpcapmacOS 上权限由/dev/bpf*设备控制官方安装包里带了一个 ChmodBPF 的启动项装好重启就正常了。如果提示No interfaces found先看/dev/bpf0的属主和权限对不对。1.4 界面三个区域各管什么打开一个 pcap 后主窗口从上到下是三块包列表区一行一个帧No.是帧序号Time是时间戳Source/Destination是地址Protocol是最高层协议名Length是帧长度Info是协议摘要。这一区域的颜色不是装饰默认着色规则里黑色背景常表示 TCP 异常重传、乱序、RST红色背景常见于各类错误看到大面积黑色就该警觉了。包详情区按协议栈从下往上分层从 Frame、Ethernet II、IP、TCP 一直到应用层每一层都能展开看字段。这里有个技巧用CtrlF在详情里搜字节或字符串比在列表里翻快得多。字节视图区十六进制加 ASCII鼠标点在哪个字段对应字节就会高亮这是学习一个协议字段到底占几个字节的最直观方式。界面底部状态栏的信息别忽略Packets是当前显示/总数Profile是当前配置档Dropped是丢包数。抓包过程中如果Dropped有值说明抓到的数据已经不完整了任何时间间隔和统计结论都要打折看待。2. 抓包前花三分钟做准备网卡、过滤器、写盘策略新手最容易跳过准备阶段直接点那个蓝色的鲨鱼鳍图标然后抓出一堆无关流量分析阶段全靠硬翻。实际工作中我一般先花几分钟定三件事抓哪块网卡、用哪个 BPF 表达式、文件怎么落盘。2.1 选错网卡是第一大坑Capture 界面里每块网卡后面都有一个小折线图那是实时流量强度一直趴在地板上的网卡八成选错了。几个经验判断虚拟网卡要格外小心。装了虚拟机、容器或者 WSL 的机器上会多出好几块虚拟接口抓这些接口只能看到主机与虚拟网络之间的流量看不到真实物理链路。曾经有人排查生产环境接口超时结果一直抓的是 WSL 的虚拟网卡。抓本机两个进程之间的通信必须走回环接口Linux 是lomacOS 是lo0Windows 需要额外装 Npcap 的回环适配器否则抓不到。抓 VLAN 里的流量注意网卡驱动是否剥掉了 VLAN tag必要时在网卡属性里关掉 VLAN 卸载否则你看到的二层帧结构会缺少 802.1Q 字段。抓无线空口需要网卡支持监听模式并且要把网卡切到对应信道否则只能看到关联到自己所在 AP 的流量。2.2 抓包过滤器BPF和显示过滤器是两回事这是必须分清的概念混用会导致为什么我明明写了过滤器还是抓了一堆无关包。对比项抓包过滤器BPF显示过滤器生效时机数据进入内核之前不匹配的直接丢弃数据已经在内存里只影响展示语法类 tcpdump 语法如host 10.0.0.5 and port 443Wireshark 自有语法如ip.addr 10.0.0.5 tcp.port 443性能影响显著降低磁盘和内存压力高流量下必须用不影响抓包但表达式太复杂会拖慢界面能否事后修改不能没抓到的就永远没有随时改反复筛我的习惯是凡是明确知道只关心某个主机或端口BPF 一定先写上尤其是长时间抓包。常用表达式抄下来就够用host 10.0.0.5 # 与某主机相关的所有流量 net 192.168.10.0/24 # 某个网段 tcp port 443 # 443 端口的 TCP udp portrange 17000-18000 # UDP 端口范围 not arp and not port 53 # 排除 ARP 和 DNS 噪音 host 10.0.0.5 and (port 80 or port 443) ether host 00:1a:2b:3c:4d:5e # 按 MAC 地址括号在 BPF 里很重要host 10.0.0.5 and port 80 or port 443和host 10.0.0.5 and (port 80 or port 443)完全是两个意思前者会被解析成(host 10.0.0.5 and port 80) or port 443。2.3 长时间抓包怎么配才不崩抓一两个小时不是问题但抓一整天就要认真配参数了。Capture Options 里几个关键项Snaplen默认 262144 字节基本等于全量抓。改成 0 表示不限制。反过来如果你只关心包头比如统计连接关系把它设成 96 或 128 能省下大量磁盘这直接决定了你能不能抓满一整天。Buffer size内核缓冲区高流量链路上调到 128MB 到 256MB 很常见太小就会丢包。Output 页签的环形缓冲勾上Create a new file automatically并配合Ring buffer with N files就能实现滚动覆盖的长时间抓包。比如每 100MB 落一个文件、保留最近 20 个总共占 2GB 磁盘一天下来也不会撑爆硬盘出问题时回看最近那一段就够了。Options 页签把Update list of packets in real time和Automatic scrolling in live capture关掉在跑满千兆的链路上这两个选项就是灾难界面渲染不过来会直接导致内核丢包。抓完再一次性加载。名字解析务必确认关闭Resolve network names和Resolve transport names。开着它每抓到新 IP 就发一次 DNS 查询既慢又脏还会让抓包文件里混入你自己的查询流量这同时也是很多人抱怨Wireshark 抓包时特别卡的根源。高流量场景的正解其实是绕开图形界面直接上命令行抓# 后台抓包每 200MB 一个文件最多保留 30 个 dumpcap -i eth0 -b filesize:204800 -b files:30 -w /data/cap/run.pcapng把抓包和显示界面彻底分开机器压力小得多界面卡死的问题也不存在了。2.4 文件命名和保存习惯抓包文件命名我固定用场景_主机_端口_日期时间.pcapng这种格式比如timeout_api10_443_20240612_1430.pcapng。看起来啰嗦但一周后你面对十几个 pcap 时就知道这点啰嗦有多值。文件格式优先用.pcapng它支持多接口、注释和每包元数据比老的.pcap信息更全需要给别人时再导出成 pcap。3. 显示过滤器把几万个包砍到只剩你要看的那几十个抓完包最爽的一刻是过滤器一敲回车几万个包瞬间只剩二十行。这一节是纯实战把高频表达式和几个容易写错的细节讲透。3.1 高频显示过滤器速查表ip.addr 10.0.0.5 ip 源或目的等于该地址 ip.src 10.0.0.5 ip.dst 10.0.0.9 tcp.port 8443 TCP 源或目的端口 udp.port 17224 tcp.flags.syn 1 tcp.flags.ack 0 只看 SYN tcp.analysis.flags 只看所有 TCP 异常帧重传/乱序/重复ACK/零窗口 tcp.stream eq 3 只看编号为 3 的那条 TCP 流 http.request.method POST http.response.code 500 tls.handshake.type 1 只看 Client Hello dns.qry.name contains example frame.len 1000 只看大帧 frame.number 1200 frame.number 1400tcp.analysis.flags是我个人使用频率最高的一条它把重传、快速重传、乱序、重复 ACK、零窗口、窗口满这些异常一网打尽。排网络抖动的时候先来一句tcp.analysis.flags ip.addr 目标IP有没有问题基本三秒出结论。3.2 逻辑与比较运算符的写法细节Wireshark 的显示过滤器接受、!、、、、逻辑运算是与、||或、!非也兼容and、or、not。字符串比较用contains包含、matches正则、完全相等。几个容易踩的点ip.addr 10.0.0.5是源或目的任一匹配要限定方向必须写ip.src或ip.dst。比较字符串时大小写敏感http.host api.example.com和API.example.com不是一回事。显示过滤器不会校验逻辑是否合理写错了只是筛不出东西不会报错所以筛不出结果时先怀疑表达式而不是数据。组合复杂条件时用括号(tcp.port 80 || tcp.port 443) ip.dst 10.0.0.9这种写法比省括号安全得多。过滤器输入框变绿才算语法正确变红就直接告诉你哪一段有问题。筛到一半想调整条件有个比手敲更快的方式在包详情里右键某个字段选Apply as Filter→Selected它会自动生成表达式选Prepare as Filter则只填进输入框让你继续改这个功能用熟了效率翻倍。想反过来排除选... and not Selected就行。3.3 统计 UDP 前后两包的时间间隔这是个高频需求也是最容易走弯路的地方显示过滤器本身不能计算时间差它只能判断字段值。要拿间隔数据有两条路。第一条是在界面上做右键列标题选Column Preferences添加一个自定义列字段名填frame.time_delta_displayed类型选Delta time displayed。它会显示当前帧距离上一个被显示的帧的时间差。这意味着你先用过滤器把目标流量筛出来这一列就直接是相邻两包的间隔非常直观。如果填的是frame.time_delta那算的是相邻两帧不区分是否被过滤的差值两者用途不同别搞混字段名含义适用场景frame.time_delta与上一帧无论是否显示的时间差看整体节奏frame.time_delta_displayed与上一个被显示帧的时间差筛选后看目标流的间隔tcp.time_delta同一 TCP 流内与上一帧的差值看单条连接的交互延迟第二条路是命令行输出成表格方便二次加工也方便统计最大/最小/平均值tshark -r udp.pcapng -Y udp ip.addr10.0.0.5 \ -T fields -e frame.number -e ip.src -e udp.srcport -e udp.dstport \ -e frame.time_delta_displayed -E separator, delta.csv要在几十万包里找超过 200ms 的间隔再补一句过滤就行tshark -r udp.pcapng -Y udp frame.time_delta_displayed 0.2 \ -T fields -e frame.number -e frame.time_delta_displayed如果是周期性报文心跳、控制指令想看有没有丢包导致的间隔异常我一般会把 delta 列排序后对比正常情况下间隔应该稳定在某几个值附近一旦出现 2 倍、3 倍的间隔基本就是丢了包或者发送方卡住了。这个技巧在排查偶发丢指令这类问题上屡试不爽。3.4 把过滤器存成按钮和配置档常用的过滤器不必每次手敲。过滤器输入框右侧有个书签图标点开可以保存当前表达式并起名之后一键调用。更进一步可以建Profile配置档把过滤器按钮、列配置、着色规则、协议首选项打成一包按场景切换一个HTTP 排障档、一个TCP 传输质量档、一个RTP 语音档。切换配置档在右下角状态栏改动了记得保存否则换个 pcap 打开又回到默认。4. 一次真实排障从网页打开慢到定位到具体那一帧光讲过滤器容易变成语法手册还是拿一个真实场景串一遍完整链路更有说服力。场景是业务方反馈某个内部管理页面偶尔打开要 8 秒以上服务器监控指标一切正常。4.1 先建立基线别急着找异常抓包之前我会先明确一件事正常情况长什么样。同一条链路、同样的操作抓一次正常打开的包存好作为基线。没有基线你看到 8 秒的 TLS 握手也不知道是因为握手本身就慢还是重传拖的还是服务端算得慢。基线抓取注意两点一是在同一台客户端上抓客户端性能差异会污染结论二是把浏览器的缓存和连接复用因素考虑进去第一次打开和刷新页面走的路径完全不同一个是完整握手一个是复用连接对比时要用同一种操作。4.2 把 8 秒拆成几段握手、请求、响应抓到一次慢的之后用ip.addr 服务器IP tcp.port 443筛出这条流然后打开包详情里的Statistics→Conversations切到 TCP 页签能看到这条连接的起止时间、包数、字节数。接着按几个刻度去分段DNS 解析耗时筛dns看查询和响应的frame.time_delta。我之前遇到的页面慢里有三成问题在 DNS一次解析 2 秒多超时重试就更久。TCP 三次握手耗时从 SYN 到 SYN/ACK 的间隔就是一次 RTT。同一对地址多次握手这个值应该稳定。忽大忽小说明链路不稳。TLS 握手耗时从 Client Hello 到 Finished。可以看tls.handshake.type的各个阶段Server Hello到Certificate之间如果停很久可能是服务端证书链太大或临时算密钥慢。首字节时间TTFB从发出请求到收到第一个响应字节。这一段长但前面的握手都正常八成是服务端处理逻辑慢。这里有个我非常依赖的判据在包详情里找 TCP 层的tcp.analysis.initial_rtt字段它给出这条连接初始往返时延的估算值。如果 initial_rtt 只有几毫秒但 TTFB 有好几秒那问题在服务端网络是无辜的反过来如果 initial_rtt 本身就几十上百毫秒还波动那链路或对端确实有问题。这个字段能省掉大量无意义的争论。4.3 重传、重复 ACK、零窗口怎么认TCP 层的异常帧都会被打上tcp.analysis系列的标签在包详情里以[TCP Analysis Flags]的形式出现列表里也常常整行变黑。常见的几个标签含义通常意味着[TCP Retransmission]超时重传包丢了可能是链路拥塞或不稳定[TCP Fast Retransmission]快速重传收到 3 个重复 ACK 后立刻重发属于快速恢复[TCP Dup ACK]重复确认后面通常跟着重传是乱序或丢包的信号[TCP Out-Of-Order]乱序到达多路径或负载均衡常见未必是故障[TCP ZeroWindow]接收窗口为 0接收方处理不过来应用层是瓶颈[TCP Window Full]发送窗口已满发送方在等接收方消费[TCP Keep-Alive]保活探测长时间空闲连接的正常现象看到重传不要立刻下结论说网络有问题。少量重传比如千分之几在广域网上完全正常。真正要警惕的是短时间内密集重传、伴随重复 ACK 和窗口缩小那才说明这条链路在某个时刻确实拥塞了。另外有一种特别容易被误判的情况明明网络很好却出现大量[TCP Retransmission]原因是抓包点在本机本机网卡驱动做了大量卸载TSO/LRO/校验和卸载Wireshark 看到的是还没被硬件合并的中间状态。遇到这种抓包前把相关卸载选项关掉再看。4.4 Statistics 菜单里那几个窗口值得单独用很多人的分析流程是看列表、翻详情其实 Statistics 菜单里有几个窗口能一眼看全局Protocol Hierarchy按协议分层统计包数和字节数占比。抓完之后第一眼看它能迅速发现原来这一半流量都是某个广播或心跳避免在噪音里做无用功。Conversations按会话聚合可以分别看 Ethernet、IPv4、TCP、UDP 几个维度按字节数排序谁在占带宽一目了然。IO Graph把吞吐量画成曲线横轴时间纵轴包数/字节数。查周期性的卡顿时非常好用卡顿的时间点和曲线上的空档能直接对上。Expert Information把各种异常汇总成一个列表重传、校验和错误、畸形包等点进去能直接跳到对应帧是个快速体检入口。Flow Graph把一次会话画成时序图看清谁在什么时候说了什么讲给别人听的时候特别有说服力。我在那次 8 秒问题的最后结论是TCP 握手和 TLS 握手都在 100ms 内完成但发出 HTTP 请求后 7.6 秒才收到第一个响应字节同时伴随服务端侧一个[TCP ZeroWindow]说明服务端应用在处理这个请求时把读取缓冲占满了——问题在服务端某个查询缺索引跟网络没关系。整个过程从抓包到定位不超过二十分钟因为用的就是上面这套分段方法而不是在几万个包里乱翻。5. 那些让人抓狂的显示问题字节看不全、界面卡死、打不开Wireshark 有相当一部分问题不在协议本身而在配置和性能上。这类问题有个共同特点现象很吓人原因往往特别小。5.1 为什么只显示 520 字节怎么看到完整的 2090 字节抓到的包只能显示 520 字节数据是个经典问题通常有两个完全不同的原因搞清楚就能对症下药。原因一抓包时设了 Snaplen。打开包详情看 Frame 层下面那几个字段Frame 12: 2090 bytes on wire (16720 bits), 520 bytes captured (4160 bits) on interface eth0on wire是原始长度captured是实际抓下来的长度。后者小于前者说明抓包时 snaplen 被限制了包详情里还会出现[Packet size limited during capture]的提示。这种情况没法补救因为数据本来就没抓下来唯一办法是把 snaplen 改成 0 或改大后重新抓。虚拟化环境里还有一种变体某些虚拟网卡驱动会截断大帧需要在宿主机一侧抓。原因二被截断的是应用层消息本身被 TCP 分段了。2090 字节的响应体如果超过了 MSS以太网常见 1460必然被拆成两个 TCP 段传输。你在列表里看到的是两个包各 1460 和 630 字节看起来不完整其实数据一点没少。要看到完整内容有三种做法右键其中一个包选Follow→TCP Stream。它会把整条流的所有载荷按顺序拼起来显示这是最省事的方式。确认协议首选项里开启重组Edit→Preferences→Protocols→TCP把Allow subdissector to reassemble TCP streams勾上。这样上层协议解析器会把分段拼好再展示比如一个 HTTP 响应体或一张内嵌的图片但包列表里仍然是两个独立帧这一点不会变。需要把响应体导出成文件时用File→Export Objects→HTTP直接把传输过的对象存到本地。还有一种情况是字节面板只能看到前面一段。字节视图面板有水平滚动条双击某个字段会让视图自动滚到对应位置。面板太矮的时候拖动分隔线拉高即可这个纯属界面操作问题但确实困扰过不少人。另外如果包本身长度超过 1500 字节比如开启了巨型帧的链路上有 9000 字节的帧首先确认网卡和交换机都支持并启用了巨型帧其次确认 snaplen 足够大否则抓到的永远是截断版。5.2 抓包界面卡住不动怎么办Wireshark 为什么一直卡住这个问题的答案通常是四个之一开启了网络名称解析。前面提过每个新 IP 都触发一次 DNS 查询在离线或受限网络里会一直等超时。关掉View→Name Resolution下的两项立刻顺畅。实时刷新 高流量。抓高速链路时关闭实时刷新或者干脆用 dumpcap 抓完再分析。打开了一个超大文件。几百 MB 以上的 pcap 打开时会有明显停顿这是加载和建索引的过程耐心等一会儿。长期处理大文件的正确姿势是先用editcap切片editcap -c 200000 big.pcapng part.pcapng切成每 20 万包一个只加载要分析的那段。表达式太复杂或着色规则太多。过滤器里写正则匹配会明显变慢着色规则上百条也会拖慢渲染按需精简。还有一个容易被忽略的点Wireshark 会对每个包做完整的协议解析。看到某些畸形包时解析器可能进入长时间的循环处理表现得就像卡死。这种情况一般是特定版本的 bug升级到新版4.x 系列已经很稳定基本能解决。5.3 打不开、抓不到、网卡列表为空按现象对照排查比较快现象首要怀疑处理方向启动即崩溃或闪退配置文件损坏删除用户配置目录下的 profile 后重启或直接重置首选项网卡列表为空驱动/权限Windows 检查 Npcap 服务Linux 检查 wireshark 组和 cap 能力选了网卡抓不到任何包选错网卡对照实时流量折线图重新选注意虚拟网卡和回环网卡抓本机回环抓不到缺回环接口Windows 装 Npcap 时勾选回环适配器Linux 用 lo抓到的包全是自己的 DNS名字解析开着关闭名称解析重新抓底部 Dropped 持续增长缓冲太小或磁盘慢调大 buffer改用 dumpcap 直接写本地 SSD关于打不开还有一种情况是文件本身的问题别人给的 pcap 用了较新的格式而你本地版本太老。Wireshark 的向下兼容是单向的新版本能读老文件老版本读不了新文件。这类问题升级软件比找转换工具省事。5.4 时间戳和列配置让数据说人话默认的时间戳是相对第一个包的秒数看长时间抓包时很难对应到真实发生时间。View→Time Display Format里改成Time of Day或 UTC 时间再把Seconds精度调到毫秒或微秒。跨时区协作时统一用 UTC这一点在分布式系统排查里能省掉一堆换算。列也可以自己配。我固定会加四列这样分析时少点很多次鼠标tcp.stream 流编号同一连接一眼识别 tcp.len 该包承载的 TCP 载荷长度看有没有纯 ACK frame.time_delta_displayed 过滤后的时间间隔 tcp.analysis.ack_rtt 该 ACK 对应的往返时延配置好之后记得在 Profile 里保存别指望它跨会话自动记住。6. 再往前一步TLS 解密、RTP 流还原和非常规链路到这里基础操作已经够用了下面这些是从会用变成用得舒服的分水岭。6.1 HTTPS 抓包看到全是密文怎么解先明确一件事现代 TLSECDHE 密钥交换下光有服务器私钥解不开流量因为会话密钥是临时协商的和私钥无关。可行的路径只有一条——拿到客户端的会话密钥日志。前提是你对客户端有控制权比如调试自己开发的 App 或自己配置的浏览器环境。做法分两步第一步让客户端把密钥写出来。设置环境变量SSLKEYLOGFILE指向一个文件Chrome、Firefox、以及基于 OpenSSL 的程序都支持这个机制# Linux / macOS export SSLKEYLOGFILE$HOME/keys/sslkeys.log # Windows PowerShell $env:SSLKEYLOGFILEC:\keys\sslkeys.log第二步在 Wireshark 里告诉它去哪读Edit→Preferences→Protocols→TLS把(Pre)-Master-Secret log filename指向同一个文件。之后重新打开抓包文件原本显示为Application Data的帧会变成可读的 HTTP 或 HTTP/2。几个实战要点顺序很重要必须先设置环境变量再启动客户端已经在跑的进程不会生效重启客户端。同时 Wireshark 要重新加载 pcap 才应用新配置。如果解出来还是乱码看是不是 HTTP/2。Wireshark 4.x 默认支持 h2 解码但早一点的版本需要在 TLS 首选项里把协议端口显式加上或者确认 ALPN 协商结果确实是你以为的那个协议。解密后的显示过滤器要用http或http2而不是tls。tls过滤器在你解密之后往往什么都筛不出来因为那些帧已经被重新解析到上层协议去了。调试 HTTP/2 时http2.headers.path和http2.header.value是最好用的两个字段再配合Follow→HTTP/2 Stream就能看到单个请求的完整往返。会话密钥文件里包含你能解密的全部会话授权信息属于敏感材料用完删除别提交进代码仓库。如果抓的是 HTTP/1.1 且用了 RSA 密钥交换老服务才有理论上可以配置服务器私钥直接解。但现实里这套早就被弃用了遇到这种配置先怀疑是不是没有启用前向保密本身就该修。6.2 把 RTP 流还原成能播放的音视频语音和视频质量排查里媒体流走 RTP抓到之后最直观的验证方式就是把它导出来听一听、看一看。音频的步骤Telephony→RTP→Show All Streams在列表里选中要分析的流点Analyze看丢包、抖动、乱序统计再点Save Payload导成.au或.raw然后转码ffmpeg -f mulaw -ar 8000 -ac 1 -i stream.au -c:a pcm_s16le output.wav参数要按实际的编码类型改-f mulaw对应 G.711 μ 律G.711 A 律是alaw有些编码导出来是裸流.raw需要用-f指定格式。视频那边同理把 H.264 载荷存成.h264文件后ffmpeg -i stream.h264 -c copy output.mp4两个容易翻车的点一是RTP 包可能跨越多个抓包文件如果你是用环形缓冲抓的可能前半个流在上一个文件里得用mergecap先合并二是如果 SDP 里协商了动态载荷类型96-127Wireshark 未必能自动识别编码需要在Telephony→RTP→RTP Player里手动指定 payload type 对应的编码否则导出的文件是不完整的。丢包统计里Max Delta和Max Jitter这两个值尤其要看语音质量的问题十有八九体现在抖动上。6.3 蓝牙、串口和工业协议这类非以太网流量Wireshark 早就不只是以太网工具了但每类链路的抓法都有额外门槛。蓝牙这块Windows 上内置蓝牙栈不直接暴露 HCI 给 Wireshark。常用做法是用USBPcap抓主机与蓝牙适配器之间那条 USB 总线上的 HCI 流量安装时勾上 USBPcap抓包时选对应的 USB 接口过滤器用bthci或btle。想抓空口上的 BLE 广播和连接需要专用的嗅探器和配套固件普通网卡做不到。这里要注意加密连接的信道跳频普通嗅探器跟不上的时候只能看到广播包。工业协议方面很多是基于 UDP 多播的实时控制协议比如列车通信里常用的 TRDP。抓这类流量的关键有三点一是网卡必须加入对应多播组或者在支持多播的交换设备上抓有些交换机默认丢弃未加入组的多播二是用udp.port或ip.dst多播地址过滤别指望 BPF 里的host能匹配多播三是这类流量通常周期性极强用之前讲的时间间隔列做统计能很快发现丢帧。解析器对不同厂商的扩展字段支持不一遇到显示为Unknown的载荷可以先把对应的协议解析器在首选项里启用或者按原始字节分析。6.4 交给命令行tshark、dumpcap 和批量处理界面适合探索脚本适合重复劳动。几个常用命令组合值得收进工具箱# 从已有文件里提取会话五元组和字节数 tshark -r a.pcapng -q -z conv,tcp # 提取 DNS 查询名和应答 IP tshark -r a.pcapng -Y dns.flags.response 1 \ -T fields -e dns.qry.name -e dns.a # 只保留某主机相关的帧另存 tshark -r a.pcapng -Y ip.addr 10.0.0.5 -w filtered.pcapng # 切割、合并、去重 editcap -c 100000 big.pcapng sliced.pcapng mergecap -w merged.pcapng part1.pcapng part2.pcapng批量处理多个抓包文件时把 tshark 的输出重定向到 CSV再用表格工具做透视比在界面上一个个点快得多。这也是做容量分析、周期性统计时的标准做法。7. 长期抓包攒下来的几个习惯用得久了会形成一些固定动作这些不写在任何文档里但确实能显著提高效率。第一抓包之前先写下假设。我怀疑是客户端到网关这一段丢包和我怀疑服务端查询慢对应的抓包位置、过滤器和观察指标完全不同。没有假设就开始抓最后一定是抓了一堆数据然后不知道看什么。第二BPF 先收窄显示过滤器再细筛。尤其在共享链路或高流量环境抓下来再筛这个习惯会让你的抓包文件变成垃圾场。第三抓完立刻做三件事看一眼 Expert Information 有没有异常、看一眼 Protocol Hierarchy 的构成、把关键帧加注释或导出。我习惯在关键帧上按CtrlM加标记并写一句注释说明这里是第一次重传回头复盘时能省大量时间。第四别忽视关闭名字解析和调大缓冲这两个小动作它们在关键时刻决定了你的数据是否可信。第五pcap 文件要当敏感数据对待。里面可能有明文凭据、Cookie、内网拓扑外发之前用editcap裁掉载荷只保留头部或者干脆只截图说明问题。第六保持版本更新。4.x 之后的分析器和协议支持比老版本好太多很多抓不到解析不出来界面卡死的问题在新版里根本不存在。升级的成本远低于和老 bug 搏斗的成本。第七建几个按场景划分的配置档并保存好过滤器书签把个人经验固化成工具配置下次换个项目直接切换过来不用从零开始调试界面。
返回列表