
网络排查这件事最怕的不是问题复杂而是手里没有趁手的工具。我做了十多年一线开发和运维遇到过无数次接口通了但数据不对服务明明启动了却连不上设备日志一切正常但就是没反应这类玄学问题。每次到最后能一锤定音的往往就是抓包。而抓包工具里Wireshark 是绕不开的那一个——它免费、跨平台、协议解析能力极强从 TCP 三次握手到 Modbus 工业协议从 HTTP 明文到加密流量概览基本都能给你一个交代。这篇内容我打算把 Wireshark 从安装到抓包、从过滤器到实战分析完整地讲一遍。不是那种点下一步下一步的流水账而是把我这些年踩过的坑、总结的技巧、真正能落地的操作路径都揉进去。不管你是刚接触网络排查的新手还是已经用过但总觉得抓了一堆包看不懂的老手应该都能从里面找到点有用的东西。全文会围绕安装、界面、抓包、过滤器、TCP 分析、常见故障排查这几个核心环节展开每个环节我都会解释为什么这么做而不只是怎么做。1. 安装之前先想清楚你为什么要用 Wireshark1.1 抓包工具那么多为什么偏偏选它市面上的抓包工具其实不少Fiddler、Charles、tcpdump、Burp Suite各有各的定位。很多人一上来就问哪个最好这个问题本身就问错了——工具没有绝对的好坏只有场景匹配不匹配。Fiddler 和 Charles 本质上是 HTTP/HTTPS 代理工具它们工作在应用层擅长解析 HTTP 请求响应、做接口调试、改包重放。但它们的局限也很明显只能看到走代理的流量非 HTTP 协议比如 TCP 裸连接、UDP、工业协议基本无能为力。而 Wireshark 是链路层到应用层的全栈抓包分析工具它直接调用网卡的混杂模式把流经网卡的所有数据帧都捕获下来然后逐层解析。这意味着你看到的不是经过代理的 HTTP 请求而是网线上真实流动的每一个字节。这个区别在排查底层问题时是决定性的。举个例子我之前遇到一个设备通过 TCP 长连接上报数据应用层日志显示发送成功但服务端就是收不到。用 Fiddler 完全看不到东西因为这不是 HTTP。换成 Wireshark 一抓发现 TCP 三次握手之后客户端发完数据就发了 RST 包——问题出在客户端 socket 被提前关闭了。这种问题只有链路层工具才能定位。所以选型逻辑很简单调接口、看 HTTP用 Fiddler/Charles查协议、看底层、排网络故障用 Wireshark。两者不是替代关系是互补关系。1.2 安装包从哪来版本怎么选Wireshark 的官方下载地址是 wireshark.org这是唯一推荐的来源。网上有很多绿色版汉化版精简版我的建议是统统不要用。原因有两个一是抓包工具本身涉及网卡驱动Npcap第三方打包版本经常驱动版本不匹配导致抓不到包或者蓝屏二是安全风险抓包工具能看到的流量太敏感了来路不明的安装包你根本不知道它有没有夹带私货。版本选择上Windows 用户直接下最新的 Stable 版本就行。截至我写这篇的时候4.x 系列已经非常成熟了。有一个细节要注意安装过程中会提示安装 Npcap这是 Windows 上的抓包驱动必须装。Npcap 安装时有一个选项叫Install Npcap in WinPcap API-compatible Mode如果你以后要用一些老工具比如某些基于 WinPcap 的脚本建议勾上兼容性更好。macOS 用户可以用 Homebrew 装命令是brew install --cask wireshark它会自动处理权限和驱动。Linux 用户直接用包管理器Debian/Ubuntu 系是sudo apt install wireshark安装过程中会问你是否允许非 root 用户抓包选是这样以后不用每次都 sudo。提示Linux 下如果安装时没选允许非 root 抓包后面可以用sudo dpkg-reconfigure wireshark-common重新配置然后把用户加入 wireshark 组sudo usermod -aG wireshark $USER重新登录生效。1.3 安装完先别急着抓这几个设置必须先调很多人装完 Wireshark 就直接点开始抓包然后面对满屏花花绿绿的包一脸懵。其实有几个设置提前调好能省掉后面大量麻烦。第一个是时间显示格式。Wireshark 默认显示的是相对时间或者 UTC 时间排查问题时经常需要和本地日志对时间。调整路径是View → Time Display Format → Time of Day然后确保时区设置正确。Windows 下如果发现时间差 8 小时检查一下系统时区Wireshark 是跟随系统的。第二个是列的自定义。默认列有 No.、Time、Source、Destination、Protocol、Length、Info。我习惯加一列 TCP Stream Index方便快速定位某条流。操作是右键任意列头 → Column Preferences → 点加号字段填tcp.stream类型选 Number。第三个是捕获选项里的Update list of packets in real-time和Automatic scrolling in live capture。这两个默认是开的实时刷新。但在高流量场景下实时刷新会拖慢 Wireshark 本身导致丢包。如果你抓的是千兆以上流量建议关掉实时刷新抓完再看。2. 抓包这件事抓对网卡比什么都重要2.1 网卡选择抓错网卡等于白抓Wireshark 启动后第一件事是选网卡。界面上会列出所有网络接口包括物理网卡、虚拟网卡、回环接口。这里最容易踩的坑就是抓了半天发现一个包都没有因为选错了网卡。怎么判断该抓哪个最直接的方法是看流量曲线。Wireshark 的网卡列表里每个接口后面有一个实时的小波形图哪个在动就说明哪个有流量。如果你访问的是本机服务比如 localhost 上的应用那流量走的是回环接口Windows 上叫 Adapter for loopback traffic captureLinux 上是lomacOS 上是lo0。很多人抓本机服务抓不到就是因为没选回环网卡。还有一个常见场景是虚拟机。如果你在 VMware 或 VirtualBox 里跑服务宿主机抓包要选虚拟网卡VMnet1、VMnet8 之类而不是物理网卡。而且虚拟机的网络模式NAT、桥接、仅主机会影响你看到什么流量。桥接模式下虚拟机和宿主机在同一网段抓包最直观NAT 模式下流量经过地址转换看到的源地址会是虚拟网卡的地址。2.2 混杂模式到底开不开网卡有一个工作模式叫混杂模式Promiscuous Mode开启后网卡会接收所有经过它的数据帧而不仅仅是发给自己的。Wireshark 默认会尝试开启混杂模式。那什么时候需要开什么时候不需要如果你抓的是本机和其他主机之间的通信混杂模式其实不是必须的因为发给你的包本来就会经过你的网卡。但如果你想抓同一局域网内其他主机之间的通信比如排查交换机端口镜像场景那就必须开混杂模式而且还需要交换机配合做端口镜像否则你只能看到广播包。在交换式网络里混杂模式的作用被大大削弱了因为交换机只会把包转发到目标端口。所以别指望开个混杂模式就能看到整个局域网的流量那是集线器时代的事情。2.3 捕获过滤器在抓之前就筛掉噪音这里要区分两个概念捕获过滤器Capture Filter和显示过滤器Display Filter。这是新手最容易混淆的地方也是 Wireshark 使用中最重要的一个分水岭。捕获过滤器是在抓包之前生效的它决定了哪些包会被写入内存。语法用的是 BPFBerkeley Packet Filter语法。比如你只想抓 80 端口的流量捕获过滤器写port 80。它的优点是能大幅减少抓包量降低内存占用和丢包概率缺点是抓之前就筛掉了如果后来发现想看的包没抓到只能重抓。显示过滤器是在抓包之后生效的它只是把不关心的包隐藏起来原始数据还在。语法是 Wireshark 自己的比如http、tcp.port 80。优点是灵活随时可以改条件缺点是如果抓的时候没抓全显示过滤器也变不出来。我的经验是流量大、目标明确时用捕获过滤器流量小、需要探索时先全抓再用显示过滤器。比如排查某个特定服务的连接问题我一般会先用捕获过滤器host 192.168.1.100 and port 8080把范围缩小抓完再用显示过滤器细看。常用的捕获过滤器语法我整理了一个表需求捕获过滤器写法指定主机host 192.168.1.100指定端口port 443指定主机和端口host 192.168.1.100 and port 8080排除某主机not host 192.168.1.1指定网段net 192.168.1.0/24只抓 TCPtcp只抓 UDPudp抓特定源端口src port 53抓特定目的端口dst port 3306注意捕获过滤器里不能用要用eq不能用!要用ne。比如tcp.port 80是显示过滤器语法捕获过滤器要写tcp port 80。这个语法差异坑过很多人。3. 显示过滤器Wireshark 真正的生产力工具3.1 从看懂一个包到筛出一类包抓包只是第一步真正的功夫在过滤和分析。Wireshark 的显示过滤器功能极其强大但语法也比较多很多人卡在知道要筛什么但写不出表达式。显示过滤器的核心逻辑是协议.字段 操作符 值。比如ip.addr 192.168.1.1表示筛选 IP 地址为 192.168.1.1 的包源或目的都算。tcp.port 443表示 TCP 端口为 443 的包。操作符支持、!、、、、、contains、matches等。我列几个高频使用的显示过滤器基本覆盖日常 80% 的场景ip.addr 10.0.0.5筛选和某 IP 相关的所有包ip.src 10.0.0.5 ip.dst 10.0.0.6精确到方向tcp.port 8080筛选某端口的 TCP 流量http.request.method POST只看 POST 请求http.response.code 500只看 500 响应tcp.flags.syn 1 tcp.flags.ack 0只看 SYN 包三次握手第一步tcp.analysis.flags只看有异常标记的 TCP 包重传、乱序等dns只看 DNS 查询tls.handshake.type 1只看 TLS Client Hello3.2 逻辑组合与括号别让优先级坑了你显示过滤器支持与、||或、!非三种逻辑运算。看起来简单但优先级问题经常让人写出错误的表达式。比如你想筛选源 IP 是 A 或者目的 IP 是 B且端口是 80的包如果写成ip.src A || ip.dst B tcp.port 80由于优先级高于||实际含义变成了源 IP 是 A或者目的 IP 是 B 且端口 80这跟你的意图可能不一致。正确写法是加括号(ip.src A || ip.dst B) tcp.port 80。我的习惯是只要用了||就顺手加括号哪怕逻辑上不需要也能让表达式更清晰避免以后回看时产生歧义。3.3 跟着 TCP 流走追踪流功能显示过滤器能筛出单个包但排查问题时我们往往需要看一整条会话。Wireshark 的追踪流Follow Stream功能就是干这个的。操作方式选中任意一个包右键 → Follow → TCP Stream或 UDP Stream、HTTP Stream。Wireshark 会自动把这条 TCP 连接的所有包筛出来并用不同颜色区分两个方向的数据弹出一个窗口显示完整的应用层数据。这个功能在排查 HTTP 接口问题时特别好用。你能直接看到请求头和响应体的完整内容不用一个个包去点。如果是二进制协议它会显示十六进制和 ASCII 对照方便你分析协议格式。有一个细节Follow TCP Stream 之后显示过滤器会自动变成tcp.stream eq N其中 N 是流的编号。你可以把这个编号记下来后面用tcp.stream eq N快速回到这条流。这也是我前面建议加 TCP Stream Index 列的原因。3.4 过滤器表达式收藏与复用Wireshark 允许你把常用的显示过滤器保存起来。在过滤器输入框右边有一个书签图标点开可以管理Filter Expressions。我一般会把几类常用表达式存进去只看异常 TCP、只看某服务端口、只看 DNS、只看 TLS 握手。这样排查不同问题时一键切换不用每次手敲。另外过滤器输入框有自动补全功能输入tcp.之后按 Tab 或者等它弹出提示能看到所有可用的字段。这个功能对记不住字段名的人非常友好多用几次自然就记住了。4. TCP 三次握手与四次挥手抓包视角下的连接生命周期4.1 三次握手在 Wireshark 里长什么样TCP 三次握手是网络排查的基础中的基础但很多人只是背过概念没真正在抓包工具里看过。我用一个实际例子带你走一遍。假设客户端 192.168.1.10 要连接服务端 192.168.1.20 的 8080 端口。在 Wireshark 里你会看到三个包第一个包客户端 → 服务端标志位 SYN1ACK0Seq0相对序列号。这表示我想跟你建立连接我的初始序列号是 X。第二个包服务端 → 客户端标志位 SYN1ACK1Seq0Ack1。这表示我同意我的初始序列号是 Y我期望你下一个包从 X1 开始。第三个包客户端 → 服务端标志位 ACK1Seq1Ack1。这表示收到我开始发了。在 Wireshark 的 Info 列这三个包会显示为[SYN]、[SYN, ACK]、[ACK]。如果你只看到第一个 SYN 包后面没有 SYN-ACK那说明服务端没响应可能是服务没启动、防火墙拦截、或者端口不对。如果看到了 SYN 和 SYN-ACK但客户端没发最后的 ACK那可能是客户端侧有问题。4.2 用抓包定位连不上的三种典型情况连不上是最高频的排查场景抓包能直接告诉你卡在哪一步。情况一只有 SYN没有 SYN-ACK。这说明请求发出去了但服务端没回。可能原因服务端进程没监听该端口、防火墙 DROP 了包、或者路由不通。这时候可以在服务端本机抓包如果服务端本机也没收到 SYN那就是网络路径问题如果收到了但没回那就是服务端应用或防火墙问题。情况二SYN 发出后收到 RST。RST 表示连接被重置。常见于服务端端口没开操作系统直接回 RST或者中间有设备主动阻断。RST 的响应速度通常很快和超时的表现完全不同。情况三SYN 重传多次后超时。如果看到同一个 SYN 包重复出现间隔大概是 1s、2s、4s 这样递增说明客户端在重传但一直没收到响应。这通常是网络不通或者对端静默丢包。这三种情况的区分是抓包排查的基本功。你只要在 Wireshark 里过滤tcp.flags.syn 1就能快速看到所有连接尝试然后根据响应情况判断问题方向。4.3 四次挥手与连接异常关闭连接关闭比建立复杂因为 TCP 是全双工的两个方向要分别关闭所以是四次挥手。在 Wireshark 里表现为 FIN、ACK、FIN、ACK 四个包有时会合并成三个。排查时更值得关注的是异常关闭。比如你看到 RST 包说明连接被强制重置了而不是正常关闭。RST 常见于应用崩溃、socket 被强制关闭、或者收到了不符合预期的数据。还有一种情况是连接半开——一方已经关闭另一方还在发数据。这时候会看到一方发 FIN另一方回 ACK 但继续发数据然后收到 RST。这种问题在长连接场景下很常见比如心跳机制没做好服务端以为连接还在实际客户端已经断了。我排查过一个案例客户端每隔 30 秒发一次心跳服务端日志显示心跳正常但客户端偶尔报连接已关闭。抓包发现服务端在某个时刻发了 FIN但客户端没收到可能网络抖动继续发心跳服务端回 RST。根因是服务端的空闲超时设置比客户端心跳间隔短。这种问题不看抓包根本定位不到。5. 从抓包到定位几个真实场景的排查链路5.1 接口返回慢到底是网络慢还是服务慢接口慢是开发和运维都头疼的问题因为涉及环节多。抓包能帮你把问题范围缩小到网络段还是服务段。排查思路是这样的在客户端抓包找到对应的 HTTP 请求。看三个时间点请求发出的时间、服务端响应第一个字节的时间、响应结束的时间。Wireshark 里可以看包的 Time 列也可以右键 → Set/Unset Time Reference 来标记基准时间。如果请求发出到服务端响应第一个字节之间间隔很长说明是服务端处理慢或者网络传输慢。如果响应第一个字节到响应结束间隔很长说明是响应体传输慢可能是数据量大或者带宽不足。如果请求发出后很久才看到服务端的 ACK那可能是网络延迟高。Wireshark 还有一个TCP Stream Graphs功能Statistics → TCP Stream Graphs → Time Sequence能画出序列号随时间的变化图。斜率代表吞吐量平坦段代表等待。这个图对分析传输性能非常直观。5.2 数据对不上抓包看原始字节有时候应用层日志显示发送了数据 A但对方收到的却是数据 B或者干脆没收到。这种问题日志本身可能骗人必须看抓包。我遇到过一个案例客户端用 Java 的 OutputStream 写数据日志打印write success但服务端收到的数据少了几个字节。抓包一看客户端确实发了完整数据但 TCP 层被拆成了两个包而服务端的读取逻辑假设一次能读完导致只读了第一个包的内容。这是典型的TCP 是流式协议不保证消息边界的问题。抓包让你看到数据在网络上真实的切分方式从而定位到应用层的读取逻辑缺陷。5.3 工业协议排查Modbus TCP 抓包实例Wireshark 内置了大量协议解析器包括工业领域常用的 Modbus TCP、FINS、OPC UA 等。这对工控排查非常有用。以 Modbus TCP 为例它的报文结构是 MBAP 头7 字节 PDU。Wireshark 会自动解析出功能码、寄存器地址、数据值。你只要过滤modbus就能看到所有 Modbus 请求响应。如果某个寄存器读不到值抓包能直接看到是请求没发出去、还是服务端返回了异常码。我之前帮一个朋友排查 PLC 通信问题他那边用 C 写的 FINS TCP 客户端一直连不上。抓包发现 TCP 握手正常但客户端发的 FINS 命令头格式不对服务端直接没响应。对照 Wireshark 的解析结果改了几个字节问题就解决了。这种场景下Wireshark 的协议解析能力相当于一个免费的协议分析仪。6. 那些年踩过的坑与实用技巧6.1 抓不到包的常见原因排查抓不到包是新手最常遇到的问题原因通常有这几类网卡选错。最常见。特别是本机服务一定要选回环接口。Windows 上如果没看到回环接口说明 Npcap 安装时没勾选回环支持需要重装 Npcap 并勾选。过滤器写错。捕获过滤器语法错误会导致一个包都抓不到。检查方法是先清空捕获过滤器确认能抓到包再逐步加条件。权限不足。Linux 下非 root 用户没加入 wireshark 组会提示权限错误。macOS 下需要授权。流量走了其他路径。比如容器环境流量可能走的是 docker0 网桥而不是物理网卡。这时候要选对应的虚拟网卡。加密流量。如果流量是 TLS 加密的Wireshark 只能看到握手和加密后的数据看不到明文。要解密需要配置 SSLKEYLOGFILE 或者导入私钥。6.2 大流量抓包的丢包问题Wireshark 在高流量下容易丢包因为它是把包先复制到内存再解析CPU 和内存压力大。缓解方法有几个一是用捕获过滤器减少抓包量这是最有效的。二是增大捕获缓冲区Capture → Options → Buffer size默认是 2MB可以调到 64MB 甚至更大。三是关闭实时刷新减少 UI 开销。四是考虑用 tcpdump 先抓成 pcap 文件再用 Wireshark 离线分析tcpdump 的性能比 Wireshark 好很多。命令示例tcpdump -i eth0 -w capture.pcap -s 0 -B 65536其中-s 0表示抓完整包-B设置缓冲区大小。6.3 时间显示与日志对齐排查问题时经常需要把抓包时间和应用日志时间对齐。Wireshark 默认显示的是抓包主机的本地时间但如果服务端和客户端不在同一台机器时间可能有偏差。我的做法是在抓包前先确认各机器的时间同步NTP然后在 Wireshark 里用Set Time Reference功能把某个关键包设为基准时间 0其他包显示相对时间。这样分析时序关系更直观。另外Wireshark 支持自定义时间列格式。View → Time Display Format 里可以选Seconds Since Beginning of Capture或者Time of Day。我一般排查连接问题时用相对时间对日志时用绝对时间。6.4 保存与分享抓包文件抓包文件默认保存为 pcap 或 pcapng 格式。pcapng 是新一代格式支持更多元数据推荐用这个。保存时可以用Export Specified Packets只导出筛选后的包减小文件体积。分享抓包文件时要注意脱敏因为包里可能包含密码、token 等敏感信息。Wireshark 没有内置脱敏功能需要手动处理或者用脚本。我的建议是分享前先用显示过滤器筛掉敏感流量导出时只导必要的包。注意抓包文件可能包含明文密码、会话 token、个人数据等敏感内容。对外分享前务必确认已脱敏内部传阅也要注意权限控制。6.5 几个提升效率的快捷键与配置最后分享几个我常用的效率技巧CtrlE开始/停止抓包CtrlK打开捕获选项CtrlF查找包CtrlG跳转到指定包号CtrlAltShiftT打开 TCP Stream Graphs右键包 → Apply as Filter → Selected把当前包的某字段快速变成过滤条件配置方面我建议把Name Resolution里的Resolve network names关掉。开启后 Wireshark 会尝试把 IP 解析成主机名这个过程会发 DNS 查询既慢又可能干扰抓包。需要看主机名时手动开一下就行。另外Wireshark 的配置文件Preferences可以导出导入换机器时把配置带过去省得重新调。路径在 Help → About Wireshark → Folders 里能看到。我在实际使用中最大的体会是Wireshark 的上手门槛不在安装而在看得懂。而看懂的前提是你对 TCP/IP 协议栈有基本的理解。工具只是放大器它放大的是你的协议知识。所以如果你刚开始用别急着抓复杂的流量先从抓一个简单的 HTTP 请求开始把三次握手、请求响应、四次挥手完整看一遍比看十篇教程都管用。抓包这件事看一百遍不如自己抓一遍。