ARTICLE DETAIL

资讯详情

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

Wireshark流量分析入门:抓包、过滤与协议排障实战

Wireshark流量分析入门:抓包、过滤与协议排障实战 很多人对 Wireshark 的印象停留在点一下开始然后满屏花花绿绿的包完全看不懂。我最早也是这样抓了两千多个包盯着 TCP 三次握手发呆不知道下一步该点哪里。后来在机房熬了两个通宵排查一条时断时续的业务链路才慢慢摸到流量分析的门道抓包只是起点真正决定效率的是抓之前有没有想清楚要验证什么。Wireshark 流量分析这件事本质上是把网卡上流过的二进制字节还原成谁在什么时候跟谁说了什么、说了多久、有没有说丢。它是排障工具、性能分析工具也是学习网络协议最直观的教具。这篇东西写给三类人完全没碰过 Wireshark、想找一条能照着走一遍的入门路径的朋友已经会抓包但面对成千上万条报文不知从哪下手的朋友以及需要做协议排障、性能分析、协议学习的从业者。我会把安装、抓包、过滤、协议分析、问题排查这几块拆开讲重点放在我为什么这么选和踩过哪些坑而不只是菜单在哪里。文中涉及的具体参数和步骤一部分是我的实操记录一部分是按通行工程实践做的合理补充你可以按自己的环境微调。1. 流量分析到底在分析什么动手前先想清楚目标1.1 抓包是手段先确定要回答的问题新手最容易犯的错是把 Wireshark 当成打开就能看到答案的软件。实际上它只是一台高速相机拍下来的原始素材要你自己去解读。所以在点开始捕获之前我习惯先写下三个问题这次要确认的是连通性、性能还是内容。连通性问题关注通不通看的是 SYN 有没有回应、ICMP 有没有回显、DNS 有没有解析结果性能问题关注快不快、稳不稳看的是 RTT 抖动、重传率、窗口大小变化内容问题关注传了什么才需要追踪流去看应用层数据。这三类问题对应的抓包时长、过滤策略、甚至抓包位置都完全不同。连通性问题抓几秒就够抓多了反而干扰性能问题可能要持续几分钟甚至几小时需要配合环形缓冲内容问题则要尽量贴近应用所在的主机抓避免中间设备把包重组或改写。我见过不少人一上来就抓抓了半小时、文件几个 G最后发现真正有用的就那几百个包翻起来比重新抓还累。1.2 抓包位置决定了你能看到什么同一段通信在客户端抓、在服务端抓、在中间链路上抓看到的画面不一样。客户端抓包能看到应用的请求发出时刻和收到响应的时刻适合分析用户感知慢在哪服务端抓包能看到请求真正到达和响应的发出适合定位服务处理慢还是网络慢中间链路抓包则容易受镜像口带宽、丢包、时间戳精度影响。一个实用判断如果客户端和服务端都能抓优先两端同时抓用时间戳对比。同一条请求客户端发出时刻和服务端收到时刻的差值就是去程网络耗时服务端响应发出和客户端收到响应的差值就是回程耗时。这两个数字远比在单点抓包然后猜要可靠。时间同步这一块必须提前做否则两端时间差几百毫秒算出来的结论全是错的。我一般让两台机器都指向同一个时间源抓包前确认一次时间偏差。1.3 从链路层到应用层一次抓包能看到多少Wireshark 的解析是分层的从最底下的以太网帧头到 IP 头、TCP/UDP 头再到应用层协议。很多新手只看最上面那层其实底层的字段往往才是问题所在。比如应用层显示请求正常但 TCP 层有大量重传那瓶颈大概率在网络再比如 IP 层看到分片说明 MTU 配置或者路径 MTU 发现出了问题。理解分层的另一个好处是你能准确写出过滤器。想只看某台主机的流量就用ip.addr想只看某个 TCP 会话就用tcp.stream想只看应用层某类请求就用协议名加字段。过滤器的精度直接决定了你是大海捞针还是直接定位。这一点在后面讲过滤器时会展开但根子上还是那句老话先分层理解再动手过滤。2. 环境准备安装、驱动与权限里的坑2.1 版本选择与安装包取舍Wireshark 的版本迭代很快4.0 之后界面和协议解析都有不小变化新版本对现代协议支持更好但偶尔也会引入新的解析 bug。我的建议是个人学习和排障用当前稳定版遇到某个协议解析异常再考虑降级到上一个稳定版对比。安装包从官方渠道获取安装时注意勾选项——Windows 上会附带 Npcap 驱动的安装选项这个必须装否则网卡列表里什么都看不到。安装路径别放中文目录历史上就有因为路径带中文导致插件加载失败、配置写入异常的案例。同理抓包文件的保存路径也尽量避免中文和空格命令行工具对特殊字符的处理有时候会出问题。2.2 Npcap 驱动的安装要点Npcap 是 Windows 上实际负责抓包的驱动Wireshark 只是前端。安装时有两个选项要留意一个是限制仅管理员使用另一个是兼容旧版 WinPcap 的 API。前者关系到你以后是不是每次都要用管理员身份启动后者关系到一些老工具能不能正常工作。这里有个必须提醒的点驱动层的东西安装前最好先确认系统的电源管理和网络环境是否正常尤其是使用某些需要拨号建立的网络连接时驱动与系统网络栈的交互容易出问题。如果安装后出现系统不稳定、蓝屏之类的情况第一时间卸载驱动、重启再考虑换版本或者用免安装的便携版配合已装好的驱动。这类问题不是我一个人遇到社区里讨论很多稳妥做法是安装前建一个系统还原点出问题能快速回退。这不是危言耸听我自己就吃过一次亏重装系统花了半天。2.3 网卡识别、权限与混杂模式启动后如果接口列表是空的按顺序排查这几件事驱动装了没有、是不是用管理员权限启动的、要抓的网卡是不是处于已连接状态。虚拟网卡、隧道网卡、蓝牙网卡、回环网卡都会出现在列表里名字往往很长选错网卡是新手最常见的失误之一。想抓本机自己跟自己通信的流量要用回环接口想抓无线要选无线网卡并开启监听模式。混杂模式的作用是接收所有经过网卡的帧而不只是发给本机的。交换式网络里你打开混杂模式也看不到别人的单播流量这是交换机的工作机制决定的不是软件的问题。想看其他主机的流量得靠端口镜像或者集线器这类手段。这个误区非常普遍很多人在交换网络里开混杂模式抓了半天发现只有自己的包还以为是软件坏了。2.4 抓包前的资源准备长时间抓包对磁盘和内存都有要求。一个经验值千兆链路满载情况下每分钟产生的抓包文件可能上百 MB。所以抓包前先估算时长和数据量准备好足够的磁盘空间并且把文件保存路径设到空间充裕的分区。内存方面Wireshark 会把已捕获的包索引放在内存里包数到几十万级时界面会开始变卡这时候就该考虑用环形缓冲把老包写到磁盘、只保留最近一段。时间戳精度也值得提一句。默认的时间显示精度在某些分析场景下不够用比如分析高并发下的请求间隔。可以在视图菜单里把时间显示格式调成自捕获开始的秒数相对时间做差值比绝对时间方便得多。3. 抓包与过滤把有用的包留下来3.1 捕获过滤器和显示过滤器别再搞混这是新手翻车率最高的一处。捕获过滤器Capture Filter在抓包之前生效语法是 BPF符合的包才会被写进文件不符合的直接丢弃显示过滤器Display Filter在抓包之后生效不丢包只是把不匹配的藏起来。前者能省磁盘和内存后者能随时改条件反复看。一个原则当你明确知道只关心某一类流量、且数据量很大时用捕获过滤器当你不确定问题在哪、需要看全貌时先全量抓下来再用显示过滤器筛选。我吃过一次教训用捕获过滤器只抓了 80 端口结果问题其实出在 DNS 解析超时全量数据没有只能重新抓。所以除非非常确定否则宁可先全抓。捕获过滤器语法示例# 只抓某台主机的流量 host 192.168.1.10 # 只抓某网段 net 192.168.1.0/24 # 只抓某端口 port 53 # 组合条件某主机且非某端口 host 192.168.1.10 and not port 22注意 BPF 语法用的是and、or、not和显示过滤器的、||、!不是一套别混着写。3.2 常用显示过滤器速查显示过滤器是日常使用频率最高的东西我把常用的整理成表用的时候直接改 IP 和端口即可。目的过滤器写法某台主机的所有流量ip.addr 192.168.1.10只看源或目的ip.src 192.168.1.10/ip.dst 192.168.1.10某端口tcp.port 443、udp.port 53某个 TCP 会话tcp.stream eq 3只看握手包tcp.flags.syn 1 and tcp.flags.ack 0只看重传tcp.analysis.retransmission只看 HTTP 请求http.request排除某主机!(ip.addr 192.168.1.10)按内容匹配frame contains error表格里的tcp.analysis.retransmission是我最常用的一个配合统计里的专家信息能看到整段抓包里的异常汇总。frame contains是在帧里做字符串搜索速度比按字段匹配慢但胜在什么都能搜找关键字的时候特别好用。3.3 长时间抓包环形缓冲是关键需要连续抓几小时甚至几天的时候绝对不能让它生成一个巨大的单文件。正确做法是用环形缓冲在捕获选项里设置输出到多个文件指定每个文件的大小上限和保留的文件数量Wireshark 会自动滚动老文件被覆盖。这样磁盘占用是可控的出问题时去最近的几个文件里翻就行。文件大小我一般设成 50 到 100 MB滚动保留 20 到 50 个看磁盘空间和排查窗口期决定。命名里用时间戳占位符方便事后按时间定位。还有一点长时间抓包要关掉实时滚动显示因为界面刷新本身就很吃资源关掉之后抓包稳定性会好很多。3.4 抓包卡住的常见原因界面卡死、进度条不动原因通常有几种。一是抓包期间 Wireshark 在做协议解析遇到畸形包或者解析器 bug 会卡二是同时开着实时显示包速又高三是磁盘写入速度跟不上。排查思路是先关掉实时显示再看是不是某类协议解析卡住可以通过禁用该协议的解析器验证最后确认磁盘 IO 是不是瓶颈。如果抓包过程中 Wireshark 直接卡住不动了别急着强杀。先等十几秒有时候是大文件在做重算实在不行再结束进程已经写入磁盘的 pcap 文件不会丢重新打开分析即可。养成抓包时随时保存的习惯能省不少事。4. 协议分析实战从连接建立到应用数据4.1 TCP 三次握手、四次挥手与连接状态TCP 是绝大多数应用的基础看懂它的连接过程是基本功。三次握手就是 SYN、SYNACK、ACK 三个包。分析时重点看两处SYN 和 SYNACK 之间的时间差去程往返能反映网络延迟以及有没有只发 SYN 没收到回应对端没监听、被防火墙拦了或者路由不通。四次挥手是 FIN、ACK、FIN、ACK。这里常见两种状态要能分辨正常的四次挥手和一方直接发 RST 重置连接。RST 大量出现往往意味着连接被强制中断可能是应用主动关闭、也可能是中间设备干预。在过滤器里用tcp.flags.reset 1就能把 RST 包全挑出来。提示只看握手包容易误判一定要结合后续有没有数据来判断连接是不是真的建立成功。有些中间设备会代答 SYNACK看起来握手成功其实后端根本没通。跟踪连接状态还有一个方法就是用 Wireshark 的对话统计它会把每条 TCP 会话的包数、字节数、持续时间列出来能快速发现哪条会话异常大或者异常短。4.2 重传、乱序、重复 ACK 与 RTT 判读性能问题几乎都能在这几个指标里找到线索。重传说明包丢了要重发重传率高就意味着有效带宽被浪费乱序说明包到达顺序被打乱常见于多路径或者链路聚合重复 ACK通常伴随着丢包出现是发送端触发快速重传的信号。这三个都能用tcp.analysis系列过滤器挑出来。RTT 的观察要结合时序图。Wireshark 的统计 - TCP 流图形 - 时间序列能把一条会话的往返时间和吞吐画成曲线抖动大的地方一眼就能看出来。我的经验是先看重传率再看 RTT 抖动最后看吞吐曲线这个顺序能从有没有丢逐步深入到丢在哪、什么时候丢。如果重传集中在某几个时间点就去对应的包里看当时发生了什么往往是链路抖动或者设备切换。4.3 HTTP 与 HTTPS 的分析边界HTTP 是明文能直接看到请求行、头部和响应体。常用的过滤器是http.request.method GET、http.response.code 404这类。排查某接口慢的时候我会先筛出这个接口的请求然后看请求发出到响应返回的时间差再下钻到 TCP 层看有没有重传。HTTPS 是加密的默认看不到内容。但看不到内容不等于分析不了TLS 握手过程是明文的能看证书、看协商的加密套件、看握手耗时包的长度和时序也能透露不少信息比如一个大响应体的传输过程、连接复用的模式。如果确实需要看解密后的内容正规做法是在自己可控的测试环境里配置会话密钥日志导出让 Wireshark 读密钥来解密。注意这只适用于你自己有权限的通信别拿去做别的事。4.4 追踪流把散包拼回一次完整会话满屏的包是碎片追踪流Follow Stream是把碎片拼成完整对话的利器。在某个包上右键选追踪 TCP 流或追踪 HTTP 流Wireshark 会把这条会话的双向数据按顺序拼出来客户端和服务端用不同颜色区分。这个功能在排查应用层问题时几乎是必备的。比如某个表单提交后服务端返回异常追踪流之后能一眼看到请求参数和返回的错误信息不用一个个包去点。追踪 HTTP 流还会自动解压 gzip 响应省去手动处理的麻烦。需要注意的是追踪流只覆盖单条 TCP 会话如果一次业务跨越了多条连接得分别追踪再对照。4.5 实时流与多媒体数据RTP 流导出与质量观察音视频类业务跑在 UDP 上居多用 RTP 承载。分析这类流量Wireshark 的电话 - RTP - 显示所有流能列出所有 RTP 会话每个流的丢包率、抖动、序列号状态都列出来了。想看丢包对听感的影响可以把某条流导出成音频文件直接听一遍。导出音频的思路是在 RTP 流列表里选中一条点分析或者播放流Wireshark 会按负载格式把 RTP 负载拼成音频文件。这一步的前提是编码格式能被正确识别常见的几种音频编码直接就能导。如果导出的音频断断续续基本就对应着抓包里的丢包或乱序。这块技巧在做语音质量排查时非常直观——数字说不清的问题耳朵一听就明白了。注意导出和回放音频只应针对你自己有权处理的流量测试环境里做验证最稳妥。5. 常见问题排查实录5.1 Wireshark 打不开、网卡列表空白打不开分两种情况一是启动就崩二是启动后没有接口。启动崩溃常见于配置损坏解决办法是清理用户配置目录让软件重建接口空白则回到驱动和权限。按顺序查驱动是否安装成功、是否以管理员身份运行、系统服务里抓包相关服务是否在运行。有时候驱动装了一半、系统里有旧版本残留也会导致接口出不来。这种情况我一般卸载旧驱动、重启、再装新版本比在原地折腾快得多。5.2 明明有流量却抓不到包先确认三件事网卡选对了没有、过滤器是不是写错了、混杂模式需不需要开。最常见的其实是捕获过滤器写错比如写了个根本不匹配的条件那自然一个包都不来。把捕获过滤器清空再抓一次如果还是空的检查网卡。还有一个隐蔽的原因抓的是无线网卡但没开监听模式只能看到自己关联的那条链路。5.3 抓包界面卡死、占用暴增包量大的时候实时刷新和协议解析是两大消耗。应对办法是关实时显示、用环形缓冲、必要时禁用不关心的协议解析器。内存占用暴增通常是包数太多、索引撑爆内存这时候应该停止抓包、保存文件用过滤器重新打开分析而不是在几十万包的界面里硬点。5.4 协议解析异常、端口误判Wireshark 默认按端口来猜协议80 端口就当 HTTP、443 就当 TLS。但实际环境里经常有服务跑在非标准端口上或者同一端口跑多种协议解析就会出错。解决办法是手动指定解码方式在包上右键选解码为告诉它这段流是啥协议。有些应用把 HTTP 伪装在别的端口上也需要手动指定才能正确解析。5.5 问题速查表现象可能原因处理办法没有网卡接口驱动未装好 / 权限不足重装驱动、管理员运行抓不到任何包过滤器写错 / 网卡选错清空过滤器、重选网卡界面卡死实时刷新 包量大关实时显示、用环形缓冲协议解析错非标准端口右键手动解码为内存占用高包数过多停止抓包、分文件分析系统不稳定驱动与系统交互异常卸载驱动、回退版本、还原系统6. 效率进阶统计、可视化与命令行6.1 统计菜单里几件趁手的工具统计菜单是被低估的一栏。会话能看到所有通信对的流量排行快速找出谁在占带宽协议分级能看出整段抓包里各协议占比一眼判断流量构成专家信息会把重传、乱序、异常响应码等自动汇总是排查的第一步入口。我的习惯是抓到包先看专家信息从异常列表往回找比漫无目的地翻包快得多。端点统计也很有用它按 IP 或 MAC 聚合能看到每个端点的收发包数和字节数排查某台机器流量异常时特别方便。6.2 IO Graph 与吞吐可视化IO Graph 能把选定过滤器的流量画成随时间变化的曲线。用它观察吞吐很有价值一条曲线突然掉下去往往对应着某个时刻的链路问题或者应用卡顿曲线呈现周期性尖峰可能就是定时任务或者心跳流量。配合前面的 TCP 时序图一个看宏观吞吐、一个看单连接细节结合起来判断问题位置非常高效。6.3 tshark 命令行与批量处理图形界面适合交互式分析但要在服务器上抓包、或者批量处理一堆 pcap 文件命令行工具 tshark 更方便。几个我常用的命令# 列出所有网卡 tshark -D # 抓 100 个包到文件 tshark -i 1 -c 100 -w out.pcap # 读取文件并输出指定字段 tshark -r out.pcap -T fields -e ip.src -e ip.dst -e tcp.port # 按过滤器统计 tshark -r out.pcap -Y http.request -T fields -e http.host | sort | uniq -c最后那条在做流量画像的时候特别好用几行命令就能统计出访问了哪些域名、各多少次。批量处理一堆文件的时候写个循环把每个文件喂给 tshark汇总结果输出到表格比一个个用界面打开快太多。6.4 配置持久化与快捷键自己调试好的列显示、着色规则、过滤器按钮都可以保存成配置文件下次换环境直接导入。常用操作记几个快捷键CtrlE 开始/停止捕获CtrlK 打开捕获选项CtrlF 查找CtrlG 跳转到指定包号。这些看起来是小事但一天点几百次累积起来省下的时间很可观。我个人最后的体会是Wireshark 的熟练度不体现在记住了多少过滤器语法而体现在面对一个新问题时能不能在三分钟内确定抓哪里、抓多久、按什么条件筛。这三件事想清楚了剩下的都是查手册能解决的细节。真正需要练习的是把一个模糊的现象拆成一条条可验证的假设然后用抓包去证实或证伪——这个思路比任何快捷键都值钱。再补一个容易被忽略的小习惯每次分析完把关键结论和对应的包号记在一个文本文档里跟 pcap 文件放一起。过几天回头看你会感谢当时的自己。抓包文件本身不会说话说话的是你当时的分析路径。
返回列表