尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Wireshark抓包分析实战:从过滤器到TCP/IP分层排查

Wireshark抓包分析实战:从过滤器到TCP/IP分层排查 简介这份PDF教程面向网络协议分析初学者与运维、开发人员系统讲解Wireshark抓包工具的使用方法帮助读者理解TCP/IP中各协议的实际工作过程。内容涵盖启动界面与主窗口组成、File/Edit/View/GO/Analyze/Statistics/Help七大菜单功能、工具栏与过滤工具栏操作以及Packet List、Packet detail、Packet bytes三个面板的配合使用重点展开捕捉过滤器与显示过滤器两种机制的区别、语法规则与设置步骤并结合实例说明如何从大量封包中快速定位所需信息。资源包内共1个PDF文件约2.26MB内容按界面、菜单、面板、过滤器等模块组织便于按需查阅。目前已有556人学习适合希望快速上手抓包分析、排查网络问题或深入理解协议交互的读者参考。1. 从一份「wireshark的使用教程[整理].pdf」说起抓包这件事到底难在哪很多人第一次接触网络排查都是从一份叫「wireshark的使用教程[整理].pdf」的文档开始的。下载、安装、打开、选网卡、看到满屏滚动的彩色数据包然后——懵了。这大概是绝大多数网络工程师、后端开发、运维、甚至做嵌入式协议对接的人共同的起点。Wireshark 本身不难装难的是「抓到了之后怎么看」以及「怎么只抓我关心的那部分」。它解决的核心问题只有一个把网线上、网卡上真实流动的字节还原成你能读懂的分层结构让你判断到底是 TCP/IP 哪一层出了问题。适合谁排查接口超时的后端、定位丢包的运维、调试 MQTT/Modbus 这类协议对接的工程师以及需要理解 TCP/IP 模型各层功能到底怎么落地的人。这份教程类文档的价值不在于教你点哪个按钮而在于帮你建立一套「从抓包到定位」的固定动作。下面我按自己实际排查的顺序把这件事拆开讲清楚。2. 抓包前先想清楚Wireshark 装在哪、抓哪块网卡2.1 安装与网卡选择为什么你抓不到包Wireshark 安装本身没什么玄学官网下载对应平台安装包一路下一步即可。真正让新手翻车的是「抓不到包」。原因通常有三个选错了网卡、没有抓包权限、流量根本没经过你这台机器。Windows 上装的时候会附带 Npcap 驱动这一步必须勾选否则网卡列表里只有一堆看不懂的接口名抓不到任何东西。Linux 下普通用户默认没有抓包权限需要把用户加进 wireshark 组或者用 dumpcap 授权否则打开就是空的。选网卡这一步我一般会先看流量。打开 Wireshark 首页每个网卡后面有个实时跳动的小波形图哪个在动就说明有流量经过。如果你要抓的是本机访问外部服务的包选物理网卡如果你抓的是本机两个进程之间的通信那得选 Loopback回环接口很多人在这里踩坑——本机调本机物理网卡上什么都看不到。提示虚拟机、容器、Docker 场景下流量往往走的是虚拟网桥物理网卡抓不到要选对应的虚拟接口。2.2 混杂模式与抓包位置数据在 TCP/IP 模型里怎么走理解抓包位置得先回到 TCP/IP 模型各层功能。数据从应用层往下经过传输层TCP/UDP、网络层IP、链路层以太网/WiFi最后变成电信号或无线电波发出去。Wireshark 工作在链路层之上它拿到的是网卡驱动递上来的帧。默认情况下网卡只接收发给自己的帧开启混杂模式Promiscuous Mode后网卡会把经过它的所有帧都交给上层这就是交换机镜像口抓包能生效的原理。但要注意混杂模式只在「共享介质」或「镜像/集线器」场景下有用。现代交换网络里你接在自己端口上别人的流量根本不会送到你这块网卡开不开混杂模式都一样。所以真实排查中要么在目标机器本机抓要么在交换机上做端口镜像要么在网关/代理处抓。这一点想不明白后面所有分析都是空中楼阁。2.3 最小可复现的抓包动作先跑通一次最简单的抓包建立手感。下面这段是 Linux 下用命令行工具 tsharkWireshark 的命令行版本抓 10 个包的最小示例图形界面操作逻辑完全一致。# 列出所有可用网卡确认接口名 tshark -D # 在 eth0 上抓 10 个包-i 指定接口-c 指定数量 tshark -i eth0 -c 10 # 抓包并直接写入文件方便后续反复分析 tshark -i eth0 -w capture.pcapng-D列出接口对应图形界面首页的网卡列表-i指定抓哪个接口选错就是抓空-c限制抓包数量避免刷屏-w把原始包存成 pcapng 文件这是排查时最重要的习惯——现场只抓一次分析可以反复做。图形界面里对应的就是选网卡、点开始、点停止、CtrlS 保存。抓包文件是「后悔药」没存下来问题复现不了就只能干瞪眼。3. 过滤器才是 Wireshark 的灵魂抓包过滤和显示过滤别搞混3.1 两种过滤器的本质区别Wireshark 有两套过滤器这是新手最容易混的地方。抓包过滤器Capture Filter在抓之前生效用的是 BPF 语法决定「哪些包被记录下来」抓不到的包永久丢失。显示过滤器Display Filter在抓之后生效用的是 Wireshark 自己的语法决定「哪些已抓到的包显示出来」随时可以改不影响原始数据。我的习惯是抓包过滤器尽量少用甚至不用先把流量全抓下来存成文件再用显示过滤器慢慢筛。因为抓包过滤器一旦写错该抓的包没抓到现场又没了只能重来。显示过滤器写错了改一下立刻见效。只有在流量极大、磁盘扛不住的时候才用抓包过滤器做粗筛。3.2 显示过滤器语法表达式详解显示过滤器是日常用得最多的语法结构是「字段 操作符 值」多个条件用and、or、!组合。下面这张表是我最常用的几类表达式建议直接抄下来。目的显示过滤器表达式说明只看某 IPip.addr 192.168.1.10源或目的任一匹配只看某端口tcp.port 8080TCP 源或目的端口只看某方向ip.src 10.0.0.1 ip.dst 10.0.0.2精确到方向只看 HTTPhttp协议名直接作为过滤器只看 TCP 握手tcp.flags.syn 1SYN 包只看重传tcp.analysis.retransmission定位丢包关键排除某 IP!(ip.addr 192.168.1.1)感叹号取反按长度筛frame.len 1000找大包# 组合示例只看 10.0.0.5 和 10.0.0.9 之间、端口 3306 的 MySQL 流量 ip.addr 10.0.0.5 ip.addr 10.0.0.9 tcp.port 3306 # 只看 TCP 重置包排查连接被强制断开 tcp.flags.reset 1写显示过滤器时字段名必须准确ip.addr和ip.addr 差一个等号就报红。输入框变绿说明语法正确变红说明写错了这个即时反馈要利用起来。字段名记不住没关系在包详情里点中某个字段右键「作为过滤器应用」Wireshark 会自动帮你生成表达式这是最快的学习方式。3.3 抓包过滤器 BPF 语法什么时候才值得用抓包过滤器用的是标准 BPF 语法和 tcpdump 完全一致。只有流量特别大的场景才值得用比如在核心交换机镜像口上抓每秒几十万包不筛根本存不下。# 只抓 80 端口的 TCP 流量 tshark -i eth0 -f tcp port 80 -w http.pcapng # 只抓某主机的流量 tshark -i eth0 -f host 192.168.1.100 -w host.pcapng # 组合某主机且非某端口 tshark -i eth0 -f host 192.168.1.100 and not port 22 -w filtered.pcapng-f后面跟的就是抓包过滤器。注意 BPF 语法里没有端口写port 80主机写host x.x.x.x和显示过滤器语法完全不同别混用。我一般只在长时间抓包、磁盘空间有限时才用-f日常排查还是全抓后筛更稳妥。4. 从抓到看懂TCP/IP 分层定位与协议分析实战4.1 用三层结构快速定位问题在哪一层抓到包之后别急着一个个点开看。先按 TCP/IP 模型分层判断链路层看 MAC 和 ARP网络层看 IP 和 ICMP传输层看 TCP/UDP 端口和标志位应用层看具体协议内容。我的固定动作是先在显示过滤器里筛出目标流量然后看 TCP 三次握手是否完成。如果 SYN 发了没有 SYN-ACK问题在网络层或对端没监听如果握手完成但很快 RST问题在应用层拒绝如果握手正常但数据传输慢看有没有重传和乱序。# 定位连接是否建立筛出某会话的握手过程 tcp.port 8080 tcp.flags.syn 1 # 定位是否有重传重传多说明链路质量差或拥塞 tcp.analysis.retransmission # 定位是否有零窗口说明接收方处理不过来 tcp.analysis.zero_windowtcp.analysis.retransmission是排查性能问题的核心过滤器。少量重传正常大量重传基本就是链路丢包或对端处理慢。tcp.analysis.zero_window出现说明接收方缓冲区满了发送方被迫停发这通常是应用层读取太慢导致的不是网络问题。把这两个和握手状态结合起来看八成的问题都能定位到层。4.2 跟着一个流看完整交互Follow TCP StreamWireshark 最实用的功能之一是「追踪 TCP 流」。右键任意一个包选 Follow → TCP Stream它会把这条连接上双向的所有应用层数据拼在一起显示客户端和服务器用不同颜色区分。排查 HTTP 接口、MQTT 协议对接、数据库查询时这个功能能让你直接看到「发了什么、回了什么」不用一个个包点开。# 显示过滤器里直接筛某条流 tcp.stream 5 # 筛出所有 HTTP 请求 http.request # 筛出所有 HTTP 响应状态码非 200 的 http.response.code ! 200tcp.stream N里的 N 是 Wireshark 给每条 TCP 连接分配的编号在 Follow Stream 窗口底部能看到。用这个编号可以把一条连接的所有包单独拎出来排除其他流量干扰。排查接口超时的时候我一般先 Follow Stream 看请求发出去了没有、响应回来了没有再回到单个包看时间戳算一下每一段的耗时。4.3 时间戳与时区为什么你的时间和日志对不上Wireshark 默认显示的是抓包机器的本地时间但格式和精度可以调。排查跨系统问题时最头疼的就是 Wireshark 的时间和服务器日志对不上。常见原因是时区设置不一致或者时间精度不够。在视图 → 时间显示格式里可以切换成「UTC 时间」或「相对于第一个包的时间」后者在算耗时的时候特别有用。# 显示过滤器里按时间范围筛需要先设置时间参考 frame.time_relative 1.5 frame.time_relative 2.0 # 查看两个包之间的时间差选中第一个包右键 Set/Unset Time Referenceframe.time_relative是相对于第一个包的时间用它算请求到响应的耗时最直观。如果发现 Wireshark 时间和日志差好几个小时先去检查抓包机器的时区别急着怀疑代码。这个坑我踩过不止一次最后发现是测试机时区设成了 UTC日志却是本地时间。5. 避坑与排查那些让抓包分析前功尽弃的细节5.1 抓到的包全是乱码或看不到应用层现象抓到 TCP 包但应用层数据是乱码或者根本看不到 HTTP 内容。原因通常是端口不是标准端口Wireshark 没自动识别协议。比如你把 HTTP 服务跑在 8080 上Wireshark 默认只把 80 端口当 HTTP 解析。解决办法是手动指定右键包选 Decode As把 8080 端口指定为 HTTP。或者用显示过滤器tcp.port 8080先筛出来再 Decode As。加密流量HTTPS看不到明文是正常的那需要密钥才能解密不在基础排查范围内。5.2 抓包文件巨大打开就卡死现象抓了几分钟文件好几个 GWireshark 打开直接卡住。原因是没做任何过滤全量抓取。解决办法有两个一是抓的时候用抓包过滤器-f粗筛二是已经抓下来的大文件用 tshark 命令行先切分或筛选别用图形界面硬开。# 从大文件里筛出某 IP 的流量另存为小文件 tshark -r big.pcapng -Y ip.addr 192.168.1.100 -w small.pcapng # 只保留某时间段 tshark -r big.pcapng -Y frame.time_relative 60 -w first_minute.pcapng-r读文件-Y是显示过滤器注意命令行里显示过滤器用-Y抓包过滤器用-f-w写新文件。这个组合是处理大包文件的救命手段图形界面打不开的命令行基本都能救回来。5.3 本机抓不到回环流量现象本机两个进程通信物理网卡上抓不到任何包。原因是回环流量不走物理网卡。Windows 上需要装 Npcap 时勾选回环支持然后选「Adapter for loopback traffic」Linux 上直接选lo接口。这个坑在调试本机服务时特别常见很多人以为是程序没发包其实是抓错了地方。5.4 时间戳对不上导致误判超时现象日志显示接口耗时 200msWireshark 算出来 2 秒结论完全相反。原因是时间基准不同或者抓包点不在同一台机器。解决办法是统一用相对时间并且确认抓包位置和日志打印位置是同一台机器。如果抓包在客户端、日志在服务端中间还有网络传输两边时间本来就不该直接比。5.5 过滤器写对了但结果为空现象表达式语法正确输入框是绿的但一个包都不显示。原因通常是字段方向和实际流量不匹配。比如你写ip.src 10.0.0.1但实际这个 IP 是目的地址。解决办法是先用ip.addr 10.0.0.1确认流量存在再逐步加方向条件缩小。别一上来就写最复杂的表达式从宽到窄才是正确顺序。6. 进阶技巧把 Wireshark 变成可复用的排查工具真正把 Wireshark 用熟之后你会发现它不只是一个「看包」的软件而是一套可以沉淀下来的排查方法。我现在的习惯是每个反复出现的问题都固化成一个显示过滤器表达式存成书签或者写进团队排查手册。比如「数据库连接超时」对应tcp.port 3306 tcp.analysis.retransmission「接口 502」对应http.response.code 502。下次再遇到直接套用不用从头想。再进阶一点是用 tshark 做自动化。图形界面适合交互式排查但批量分析、定时抓包、生成报告这些事命令行更合适。下面这个脚本是我常用的套路定时抓包、按条件筛选、输出统计。#!/bin/bash # 抓 60 秒包筛出重传统计数量 tshark -i eth0 -a duration:60 -w /tmp/cap.pcapng RETRANS$(tshark -r /tmp/cap.pcapng -Y tcp.analysis.retransmission | wc -l) echo 60秒内重传包数量: $RETRANS-a duration:60表示抓 60 秒后自动停止适合做定时巡检。-Y筛选后wc -l统计行数就能得到一个粗略的重传指标。把它挂到 cron 里每天跑一次链路质量的变化趋势就出来了。这比出了问题再临时抓包主动得多。还有一个容易被忽略的技巧把常用的显示过滤器导出成按钮。Wireshark 工具栏上可以加自定义过滤器按钮点一下直接应用。我把「只看重传」「只看握手」「只看某 IP」做成了三个按钮排查时手速快很多。工具用顺手了排查效率的差距就体现在这些细节上。最后说个我自己的教训。早年排查一个偶发的接口超时抓了好几次包都没复现后来才发现问题出在抓包时机——我总是在用户报障之后才开始抓而问题早就过去了。后来改成在网关处长期开一个环形缓冲抓包用 dumpcap 的-b参数限制文件大小和数量循环覆盖问题一复现最近的包还在直接回捞分析。抓包这件事时机比技巧更重要提前布好比事后补救强太多。希望帮到你。本文还有配套的精品资源点击获取
返回列表