
Wireshark这个工具说实话每个做网络的人电脑里都装着一个但真正能用好的没几个。很多人打开Wireshark看到满屏滚动的数据包直接懵掉不知道从哪看起也不知道这些花花绿绿的条目到底在说什么。我自己从大学第一次装Wireshark被刷屏吓到关软件到后来靠它定位过线上故障、排查过同事写的垃圾代码、甚至帮人分析过诡异的智能家居设备在半夜疯狂发包的问题中间踩过的坑实在太多了。这篇东西不是官方文档的复读就是我自己实际用下来的总结把流量分析、协议拆解和异常流量识别这三块最核心的实践讲透。如果你是要排查网络故障、做安全分析、学习TCP/IP协议或者想搞懂APP到底在背后偷偷传了什么数据这篇都适合你。从怎么选网卡开始到怎么从成千上万个包里快速找到有问题的那个再到怎么解密HTTPS看明文内容一条线走下来保证你能从“抓包看看”进化到“五分钟定位问题”。1. 抓包前的准备装好只是开始选对网卡和过滤条件才是关键1.1 安装环节最容易忽略的细节Wireshark的安装本身不算复杂但有几个点我见过太多人在这一步翻车。Windows上安装时会让你选装Npcap这个一定要装而且建议勾选“Support raw 802.11 traffic”选项虽然平时用不上但真到需要抓无线层帧的时候没有这个选项就只能重装。Mac用户要注意权限问题第一次抓包系统会弹窗让你授权别直接点拒绝。Linux用户最省事apt install wireshark或者yum install wireshark装完基本就能用但如果是非root用户需要把用户加进wireshark组才能抓到包。装完之后第一件事不是急着抓包而是用wireshark --version确认一下版本。现在的Wireshark已经出到4.x了界面和低版本有区别比如4.0之后默认就是三栏式布局而且对HTTP/3的支持、TLS解密入口的位置都有变化。如果你网上的教程都是三五年前的界面对不上先看看版本再动手。1.2 网卡选择为什么你什么都抓不到打开Wireshark之后第一步是选接口。这里有个所有人都经历过的问题明明有网但一抓全是广播包或者干脆一个包都抓不到。原因基本就两个。第一是选错了网卡很多笔记本上会有两个甚至三个接口一个有线一个无线还有一个叫“Loopback”的假接口。虚拟机上更是麻烦什么VMnet1、VMnet8选错了就是一场空。判断该选哪个网卡的简单办法是看接口的IP地址跟你当前电脑实际的IP在一个网段那个就是对的。第二个原因是混杂模式没开。正常情况下网卡只会把发给自己MAC地址的包交给系统处理混杂模式打开后才会把经过这个网卡的所有包都抓下来。Wireshark默认是开了混杂模式的但架不住有些网卡驱动不给力尤其是某些USB无线网卡驱动层面就不支持混杂模式那就怎么抓都只能看到自己主机的流量。遇到这种情况换个有线网卡或者换个好点的USB无线网卡是唯一的解。实操小技巧抓包前先把Wireshark底部的状态栏点开看一下“抓到的包数”。如果过了一段时间还是0先别怀疑自己操作失误把接口切到Loopback试一下能不能抓到本机回环流量能抓到就说明软件本身没问题是网卡或者过滤器的问题。1.3 抓包过滤器与显示过滤器两个完全不同的东西新手最容易混淆的概念就是抓包过滤器Capture Filter和显示过滤器Display Filter。前者是真的只抓符合规则的数据包不匹配的直接丢弃不占内存后者是所有包都抓下来了只是显示的时候帮你挑出来。这个区别在流量大的时候特别致命。比如你只想分析HTTP流量如果用了显示过滤器httpWireshark底层其实把所有流量都收进了内存如果这是在一个流量很大的交换机镜像口抓包内存分分钟被打爆。正确做法是用抓包过滤器port 80从源头就只保留80端口的流量。抓包过滤器用的是BPF语法格式是字段 操作符 值比如host 192.168.1.1表示只抓这个IP的流量tcp port 443表示只抓443端口。显示过滤器则是Wireshark自己的表达式语法比如http.request、tcp.flags.syn 1、ip.src 192.168.1.0/24。日常操作我建议只用显示过滤器除非你明确知道要减少抓包体积。因为显示过滤器随时可以改抓包过滤器设错了还得重新抓一遍太耽误事了。2. 流量分析的正确打开方式先看全局趋势再钻进去抠细节2.1 三个核心视图数据包列表、详情树和字节流Wireshark的主界面就是三栏结构上面是数据包列表中间是协议详情下面是十六进制字节流。很多人一上来就盯着第一栏的几十列数据看其实没必要。数据包列表的列是可以自定义的我建议你右键点击列标题把“源端口”“目的端口”“协议”“长度”这些加上把“信息”栏调宽一点因为很多问题光看信息栏就能有眉目比如最常见的“TCP Retransmission”“TCP Dup ACK”“RST”这些关键词。中间的协议详情栏才是关键。点开一个包从上到下是按协议栈层层展开的物理层帧信息、以太网层源MAC、目的MAC、IP层TTL、协议号、校验和、TCP/UDP层端口、序列号、确认号、标志位、应用层HTTP、DNS的具体内容。我平时看包的习惯是先看信息栏大概知道是什么再双击展开TCP层看标志位和序列号应用层内容写在最后。2.2 统计面板一个被低估的宝藏入口菜单栏里的“统计”下拉菜单真的是流量分析的隐藏神器。很多人抓了一堆包之后不知道从哪下手其实从统计面板进去问题基本能猜个八九不离十。首先是“协议分级”这个入口它会把所有抓到的包按协议占比做一个排序。比如你看到TCP占比90%以上而HTTP只有一点点那说明这里面的流量可能大部分不是你在乎的HTTP而是纯TCP数据或者是连接管理类的包。如果看到大量ARP或MDNS说明局域网环境里可能有设备异常探测或者组播泛滥的问题这些信息对定位网络症结很有用。其次是“会话”和“端点”两个入口。端点里能看到每个IP发了多少字节、收了多少字节统计完了以后谁在大量发包一目了然会话里能看到IP和IP之间的成对通信情况哪些会话持续时间最长、传输数据量最大都对排查“这个网怎么这么卡”这类问题很有帮助。再就是IO图表这个入口它是个时间线折线图默认显示每秒的包数量。当你感觉网络时好时坏的时候用IO图表搭配显示过滤器比如输入http.response.code 500看看报错分布时间、输入tcp.analysis.retransmission看看重传分布时间比一帧一帧翻包高效太多了。2.3 追踪流把一堆杂乱数据包还原成一段完整对话当你确定某个会话有问题的时候别一帧一帧去对包右键任意一个相关的包选择“追踪流”再选“TCP流”Wireshark会自动把所有属于这个TCP连接的双向数据重组出来并且弹出一个窗口左边是客户端发的数据右边是服务端回的数据HTTP请求响应、明文协议内容一目了然。有一次我帮人查一个接口偶发超时的问题正常路径是请求发出去之后服务端很快返回。但抓包追踪流之后发现每次超时的那次请求服务端响应里都带着一个奇怪的响应头再往下挖发现是服务端某个过滤器在特定情况下自作主张加了延迟。这种问题如果不追踪流、只看单个包真的很难定位。另外“追踪流”的结果窗口是可以直接把数据Export成原始文件的如果抓的是文件下载流量甚至可以直接从这个窗口把文件导出这在CTF流量分析题里是个常用技巧。3. 协议拆解实战从HTTP到TCP到TLS一层层剥开看3.1 HTTP协议拆解一次请求请求背后的完整生命周期HTTP本身是个文本协议所以抓包之后看起来是最直观的。但TCP是字节流协议应用程序传的数据会被拆成多个TCP段发送所以一个HTTP请求往往不是正好对应一个数据包。好在Wireshark有TCP重组机制在显示过滤器中输入http.request.method就能把所有HTTP请求单独挑出来看。点开第一个请求包中间的协议详情里能看到Frame层记录的是这个包在物理链路上占了多少字节包括帧头、帧尾的校验字段。Ethernet II记录源MAC和目的MAC能用来判断这个包是从哪个网卡发出来的。Internet Protocol Version 4记录源IP、目的IP、TTL、协议字段。Transmission Control Protocol记录源端口、目的端口、序列号、确认号还有关键标志位SYN、ACK、PSH、FIN。Hypertext Transfer Protocol才是真正的请求内容方法、URI、Host、User-Agent、Cookie、Body等。我建议新手把前四层都仔细看几遍因为HTTP层谁都会看真正拉开差距的是能不能从TCP层读懂连接状态。3.2 三次握手与四次挥手抓包视角下最直观的TCP原理TCP三次握手在Wireshark里就是三个包客户端发一个SYN包服务端回一个SYNACK包客户端再回一个ACK包。在数据包列表里配上tcp.flags.syn 1的过滤器可以快速把所有的SYN包过滤出来。很多人看完教科书也知道这个流程但抓包里还有一些细节是教科书不讲的。比如握手时客户端初始序列号ISN是随机生成的而且不同系统的随机性策略不一样。还有Windows和Linux的TCP初始窗口大小不一样Linux默认是64KB甚至更高Windows相对保守这些参数在排查“为什么大文件传输在Windows上比Linux上慢”的问题时特别有用。四次挥手的正确状态是FIN、ACK、FIN、ACK但实际抓包中会看到很多变体比如被动关闭方可能直接把ACK和FIN合在同一个包里发或者主动关闭方发FIN之后迟迟等不到对端的FIN和ACK最后只能靠超时强制关闭。后者就是排查应用卡顿的重要线索这说明对端程序没有正常close socket要么是阻塞了要么是异常退出了。3.3 TLS解密让加密流量在你面前变成明文现在HTTPS已经普及抓到HTTP包全是加密状态。很多人觉得没法分析了其实Wireshark有官方支持的TLS解密机制关键就是拿到会话密钥。最常用、最简单的做法是设置SSLKEYLOGFILE环境变量。具体操作分三步在系统环境变量中新建一个变量变量名是SSLKEYLOGFILE变量值是一个文件路径比如C:\sslkey.log。这个文件不需要预先创建浏览器会自动生成的。重启浏览器和Wireshark让环境变量生效。在Wireshark里打开“编辑”-“首选项”-“Protocols”-“TLS”把“(Pre)-Master-Secret log filename”设置成刚才的环境变量文件路径。设置好之后再抓包Wireshark就能把HTTPS解成明文HTTP了内容、header、响应体全都能看到。这个手段在调试自己开发的HTTPS接口、分析第三方API调用流程时非常有用。Firefox的SSLKEYLOGFILE支持比Chrome还早Linux下Firefox直接就能用Chrome反而要先启动一个带参数的环境变量实例才能生效。需要提醒的是用SSLKEYLOGFILE只能解密配置了该环境变量之后新建立的TLS会话已经存在的会话解不开。而且这个方法只能解密浏览器类应用如果是APP里自己用openssl发包那还得在代码里加写日志的钩子这就属于进阶玩法了。4. 异常流量识别那些一眼就能看出来的“坏包”4.1 常见异常模式与它们的特征网络上正常流量的样子是很有规律的所以异常流量往往一眼就能认出来。这里列几种我工作里最常见的异常特征TCP重传风暴数据包列表里大量出现“TCP Retransmission”或者“TCP Fast Retransmission”颜色标成浅黄色或者红色。出现重传代表网络丢包或者对端没有及时确认一两个重传还好如果超过一定比例基本可以断定链路质量有问题或者服务端处理不过来。零窗口出现“TCP ZeroWindow”表示接收方的接收缓冲区满了它不得不告诉发送方“先别发了我处理不过来”。如果这个包持续出现说明应用层消费数据的速度跟不上网络到达的速度本质是应用瓶颈不是网络瓶颈。TCP RST出现RST标志位的包代表连接被异常中止。正常的四次挥手是FIN包RST往往是程序代码没处理完就直接关闭socket或者防火墙主动发送了RST。DNS异常一个域名在同一秒内重复请求多次大概率是配置或者代码问题。如果DNS响应里的TTL很短比如只有5秒即使域名解析正常也会给DNS服务器带来很大的压力。识别这些异常的关键是“知道正常长什么样”。我建议你用自己的电脑抓一次正常上网的包作为基线多看几次后面看到异常包就有直感了。4.2 排查案例从“页面打开很慢”到“找到元凶”之前有一个线上故障排查特别典型网站访问经常卡顿时好时坏。一开始大家都怀疑是服务器带宽不够我抓包之后先看统计面板里的“协议分级”发现TCP重传比例高达8%。这个比例在局域网里面算是非常夸张的。再看“会话”面板发现重传大量集中在一台内网机器和一个外部IP之间的连接。用显示过滤器tcp.analysis.retransmission ip.addr 那个外网IP之后发现重传的包都集中在一个时间段而且是连续命中。再到交换机上看那个外网IP对应的端口状态果然有大量CRC错误直接把网线换了问题就解决了。这种问题如果只看应用层日志很可能以为是自己代码出问题了但抓包五分钟就能把锅精准甩给网络组。抓包的另外一个价值就是分清责任到底是应用问题还是网络问题让数据说话。还有一个案例我帮一个写小程序的人排查微信小程序的请求问题。在PC上抓包一切正常但小程序的请求是走系统代理的Charles和Fiddler这类代理工具能抓到Wireshark这类旁路抓包工具反而要配置一下才能看到本机回环流量。那一次最后是靠Wireshark的Loopback接口和Npcap的“抓取回环流量”选项解决的。4.3 速查定位专家信息与快速过滤组合拳Wireshark底部有一个“专家信息”按钮它会自动把所有异常类型的包汇总分类比如错误、警告、注意、闲聊等级别。这里面“错误”和“警告”级别的信息值得关注双击任意一条它能自动跳转到对应的数据包非常方便。我的习惯是用专家信息做一个初步筛选然后再用显示过滤器精确定位。整理几个我觉得很值得收藏的过滤器表达式tcp.analysis.flags显示所有TCP分析器认为有问题的包相当于把重传、乱序、零窗口、dup ack一次性都抓出来tcp.flags.reset 1只看RST包dns.flags.response 0只看DNS查询http.response.code 400只看HTTP错误响应tcp.stream eq 0显示第一个TCP流的所有数据包5. 常见问题与排查技巧实录5.1 高频问题速查现象可能原因解决方案打开Wireshark后抓不到包网卡选择错误、Npcap未安装、权限不足检查网卡IP是否匹配确认Npcap已安装Linux用sudo运行只能看到广播包/组播包网卡混杂模式没生效检查网卡驱动是否支持混杂模式更换USB网卡尝试抓不到本机回环流量没有选择Loopback接口Windows下确认安装了Npcap选择Loopback接口抓包抓到的HTTPS全是密文没有配置TLS密钥设置SSLKEYLOGFILE环境变量并重启浏览器和Wireshark抓包文件太大电脑卡死没有设置抓包过滤器重启Wireshark用抓包过滤器限制只抓关键端口的流量只显示520字节数据包这是Wireshark单包显示长度上限实际网络包可能更大在首选项中修改“数据字节”显示长度不影响抓包本身关于510字节显示上限的问题实际上Wireshark在数据包列表默认只显示每个包的前面一部分字节你可以点“视图”-“数据包字节”调整显示长度但跟抓包的关系不大。如果是因为MSDU/AMPDU拆分导致的属于Wi-Fi抓包的特性要显示完整数据需要关掉802.11聚合那又是另一套玩法了。5.2 效率提升的几个习惯第一学会保存显示过滤器。把常用的过滤条件起个名字存下来比如“http_errors”“tcp_problems”下次直接从下拉列表选就行。右键点击显示过滤器输入框有一个“管理已保存的过滤器”的入口把表达式存好以后不用每次手敲。第二用好着色规则。Wireshark默认的包颜色其实已经挺好用但你可以自定义把RST包标成红色、重传包标成橙色、零窗口标成紫色视觉上更快定位。在“视图”-“着色规则”里可以自己调整。第三抓包过程中如果发现文件已经很大了可以点一下红色停止按钮旁边的那个暂停图标或者按快捷键CtrlE停止抓包先把现有数据保存成pcapng文件再继续抓下一段。我见过太多人抓了半小时不保存结果软件闪退一切白费的惨剧。第四自己搭一个本地环境练手。在电脑上装一个nginx或者直接用Python起一个http.server然后用Wireshark抓loopback的流量自己浏览器访问一下看握手、请求、响应、关闭的全过程。看完几遍TLS解密配置配一遍再抓一次普通HTTP对比一下比看什么教程都管用。6. 写在最后的几点个人体会做网络分析这几年我最大的感受是Wireshark其实不只是一个抓包工具它更像是一台时间机器把你网络上曾经发生过的每一段对话都记录下来供你反复回放、对照分析。很多业务上的疑难杂症从应用层查下去一头雾水但只要把数据包打开真相基本都摆在明面上。从学习路径上来说我建议新手先别急着研究那些花里胡哨的插件就老老实实抓几次包把自己电脑上的正常通信看明白然后再去碰异常分析。工具只是放大你的认知你对TCP/IP的掌握程度决定了你用Wireshark的上限。最后再分享一个我自己用的习惯不管是在公司排查问题还是在家分析智能设备流量我永远会先把抓到的问题包单独导出一份然后在旁边写几行备注记录当时的环境、时间、现象。有时候过了一个月再看同一份抓包文件能发现很多当时忽略的细节。流量分析这件事耐得住性子静得下心比记住多少命令都有用。