简介:这份PDF教程面向网络运维、安全分析及协议学习方向的初学者与中级开发者,系统讲解Wireshark抓包工具的使用方法,帮助读者理解TCP/IP中各协议的实际工作过程。内容涵盖启动界面、菜单栏、工具栏、过滤工具栏、封包列表、封包详细信息与十六进制数据查看面板等核心模块,并重点区分捕捉过滤器与显示过滤器的语法与适用场景,便于在真实网络环境中定位问题、分析协议或监控流量。资源包共1个PDF文件,压缩后约2.26MB,单文件结构便于随时查阅与打印。目前已有556人学习下载,适合需要快速上手抓包分析、对照界面理解各面板功能并掌握过滤表达式的读者参考。
1. 从一份《wireshark的使用教程[整理].pdf》说起:抓包到底在抓什么
很多人第一次打开 Wireshark,看到满屏滚动的彩色数据包,第一反应是关掉它。这份《wireshark的使用教程[整理].pdf》之所以被反复整理、转发,恰恰说明一件事:抓包工具的门槛不在安装,而在“看懂”。Wireshark 做的是把网卡上的原始比特流翻译成人类可读的协议树,从以太网帧头一路展开到 TCP/IP 四层模型里的应用层载荷。它能解决的核心问题是——当你的服务“偶尔超时”“上传 PDF 失败”“接口返回 200 但数据不对”时,日志给不出答案,只有链路上的真实报文不会撒谎。
这篇内容适合三类人:刚接触抓包、想按步骤跑通第一个过滤器的运维和测试;需要排查 TCP 重传、握手异常的后端工程师;以及做协议对接(比如 Modbus、MQTT、SECS/GEM 这类工业协议)时想确认帧结构的现场实施人员。下面按“装好能抓 → 抓得准 → 看得懂 → 排得动”的顺序推进,中间会给出可直接抄的命令和过滤器表达式。
2. 装好就能抓:Wireshark 安装与第一包捕获
2.1 安装时那两个必须勾选的组件
Windows 上从官网下载安装包后,安装向导走到组件选择页时,有两个东西不能省:Npcap和USBPcap。Npcap 是实际负责从网卡驱动层拷贝数据的抓包驱动,没有它 Wireshark 只能看到一张空网卡列表;USBPcap 用于 USB 抓包,做 USB 设备协议分析(比如某些加密狗、工业采集卡)时才用得上,不装不影响普通网络抓包,但装了以后不用重装。
安装过程中 Npcap 会单独弹出一个窗口,里面有个选项叫“Restrict Npcap driver's access to Administrators only”。如果你只是自己机器上排查问题,可以不勾,否则每次抓包都要以管理员身份启动 Wireshark。Linux 下则是另一套逻辑,Debian/Ubuntu 系直接装:
sudo apt update sudo apt install wireshark # 安装过程中会问是否允许非 root 用户抓包,选 Yes # 然后把当前用户加入 wireshark 组,避免每次 sudo sudo usermod -aG wireshark $USER # 重新登录后生效这里的关键参数是wireshark用户组。dumpcap 这个底层抓包程序带有 setuid 权限,组内成员可以调用它而不需要 root。很多人装完发现普通用户看不到网卡,就是这一步没做或者没重新登录。
2.2 选网卡与第一次捕获的正确姿势
打开 Wireshark 后主界面列出所有网卡,每张网卡后面有实时的迷你波形图。选错网卡是新手第一大坑:笔记本同时有 Wi-Fi 和有线,虚拟机还有一堆虚拟网卡(VMware、VirtualBox、Docker 的 veth)。判断方法很简单——看波形图,有流量跳动的那张就是当前在用的。
选中网卡后不要急着点开始,先点一下工具栏那个蓝色鲨鱼鳍旁边的“捕获选项”,确认两件事:混杂模式是否开启(默认开),捕获过滤器是否为空。第一次抓包建议什么都不填,直接开始,抓 10 秒左右停止,目的是建立“正常流量长什么样”的基线。
停止后你会看到三栏:包列表、协议树、十六进制。先别管协议树,在包列表里随便点一个 TCP 包,看协议树里Transmission Control Protocol下面的Flags。如果看到Syn、Ack这些标志位,说明你抓到的确实是完整的 TCP 握手报文,链路没问题。
提示:抓包时如果只想看某个网段,可以在捕获选项的“捕获过滤器”里填
host 192.168.1.100,这是 BPF 语法,和后面要讲的显示过滤器是两套完全不同的东西,别混用。
3. 过滤器是分水岭:捕获过滤器与显示过滤器的分工
3.1 两套语法的本质区别
Wireshark 的过滤器分两层,这是它最容易让人翻车的地方。捕获过滤器(Capture Filter)工作在抓包之前,用的是 BPF(Berkeley Packet Filter)语法,内核层面就把不匹配的包丢掉,所以它省内存、省磁盘,但一旦抓完就再也找不回被丢掉的包。显示过滤器(Display Filter)工作在抓包之后,对已经抓到的包做筛选,语法是 Wireshark 自己的,功能强得多,可以按协议字段、按字节偏移、按逻辑组合筛选。
一句话记住:捕获过滤器是“只抓我要的”,显示过滤器是“从抓到的里面挑我要的”。生产环境长时间抓包,必须用捕获过滤器控制体积;临时排查,直接全抓再用显示过滤器,灵活得多。
3.2 显示过滤器的高频表达式与字段名
显示过滤器输入框在包列表上方,输入时背景变绿表示语法正确,变红就是写错了。下面这些是我日常用得最多的:
# 按 IP 过滤,双向 ip.addr == 192.168.1.100 # 只看某个源 ip.src == 10.0.0.5 # 按 TCP 端口,双向 tcp.port == 8080 # 只看 SYN 包,排查连接建立问题 tcp.flags.syn == 1 && tcp.flags.ack == 0 # 只看重传,网络质量差时必看 tcp.analysis.retransmission # 按 HTTP 方法过滤 http.request.method == "POST" # 按 HTTP 响应码过滤 http.response.code >= 400 # 按包含关键字的载荷过滤(注意大小写敏感) frame contains "application/pdf"tcp.analysis.retransmission这个字段值得单独说。它不是协议里真实存在的字段,而是 Wireshark 的分析引擎根据序列号推断出来的“专家信息”。看到大量重传,基本可以判定链路丢包或对端处理不过来。frame contains是按原始字节匹配,比http contains更底层,抓非 HTTP 协议(比如自定义二进制协议里嵌了 PDF 文件头)时特别有用。
3.3 用捕获过滤器把体积压下来
长时间抓包如果不过滤,一个千兆口几分钟就能写出几个 GB。捕获过滤器写在捕获选项里,常用写法:
# 只抓某台主机 host 192.168.1.50 # 只抓某网段 net 192.168.1.0/24 # 只抓某端口 port 443 # 排除某台主机(比如排除自己) not host 192.168.1.50 # 组合:抓 80 和 443,且来自某网段 (net 192.168.1.0/24) and (port 80 or port 443)BPF 语法里and、or、not是关键字,&&、||、!也支持。注意捕获过滤器不支持按应用层内容过滤,比如你不能写http.request.method == "POST",因为 BPF 在抓包时还没解析到 HTTP 层。这是两套过滤器最实际的差异。
4. 看懂 TCP/IP 四层:从帧到载荷的逐层拆解
4.1 四层模型在 Wireshark 里的对应关系
TCP/IP 四层模型自上而下是应用层、传输层、网络层、网络接口层。Wireshark 的协议树几乎就是按这个顺序展开的,点开一个包,从上往下依次是:
| 协议树层级 | 对应 TCP/IP 层 | 典型协议 | Wireshark 里的字段前缀 |
|---|---|---|---|
| Frame | 物理/链路元信息 | 无 | frame |
| Ethernet II | 网络接口层 | 以太网 | eth |
| Internet Protocol | 网络层 | IP | ip |
| Transmission Control Protocol | 传输层 | TCP | tcp |
| Hypertext Transfer Protocol | 应用层 | HTTP | http |
这个对应关系不是巧合,Wireshark 的解析器就是按封装顺序逐层剥离的。理解这一点,你就能预判“我想看的字段大概在哪一层”,而不是在协议树里乱翻。
4.2 用 Follow TCP Stream 还原一次完整会话
排查应用层问题时,单个包看不出所以然,需要把一次 TCP 会话的所有载荷拼起来。右键任意一个 TCP 包,选Follow → TCP Stream,Wireshark 会把双向数据按顺序还原成一个文本窗口,客户端数据默认红色,服务端蓝色。
这个功能在排查“上传 PDF 文件时 XSS 攻击”这类安全问题时极其好用。比如后端做了全局过滤器处理上传,但你不确定过滤器有没有在正确的阶段生效,Follow TCP Stream 能让你看到原始请求体里到底有没有被转义的脚本标签。如果过滤器是在 SpringMVC 层做的,而攻击载荷在更底层的 multipart 解析阶段就已经落盘,那抓包看到的原始字节和最终存储的内容可能不一致——这正是很多“过滤器看起来生效了但漏洞还在”的根因。
4.3 用 IO Graph 看流量趋势定位异常时间点
菜单Statistics → IO Graph能把抓包文件里的流量按时间画成曲线。默认是每秒所有包的数量,你可以改成只统计某个过滤器的结果。比如排查“接口偶尔超时”,先设一个显示过滤器tcp.port == 8080,再看 IO Graph,超时的时间点往往对应曲线上的一个尖峰或断崖。
更实用的是把 Y 轴单位从“包数”改成“字节数”,这样能看出是不是某个大包(比如 PDF 上传)把带宽占满导致其他请求排队。配合tcp.analysis.retransmission过滤器,如果重传曲线和超时时间点重合,基本可以锁定是链路问题而不是应用代码问题。
5. 避坑与排查:抓包现场最常见的五个翻车点
5.1 抓不到包,网卡列表是空的
现象:打开 Wireshark 看不到任何网卡,或者只有一张“Adapter for loopback traffic capture”。原因:Npcap 没装成功,或者安装时没勾选“Install Npcap in WinPcap API-compatible Mode”;Linux 下则是当前用户不在 wireshark 组。解决:Windows 重新运行安装包修复 Npcap;Linux 执行sudo usermod -aG wireshark $USER后必须重新登录,不是重开终端就行。
5.2 抓到的包全是自己的,看不到目标流量
现象:过滤器写了目标 IP,但一个包都没有。原因:选错了网卡。在虚拟机或 Docker 环境里,流量走的是虚拟网桥,物理网卡上看不到。解决:先不加任何过滤器全抓,看包列表里有没有目标 IP 的 ARP 或 DNS 请求,确认流量到底走哪张网卡。Docker 环境通常要抓docker0或对应的 veth 对。
5.3 显示过滤器语法正确但结果为空
现象:输入http.request.method == "POST"背景是绿的,但一个包都不显示。原因:抓包时用的捕获过滤器已经把非目标流量丢了,或者流量本身是 HTTPS 加密的,Wireshark 解析不出 HTTP 层。解决:确认捕获过滤器没有过度限制;HTTPS 需要配置 SSLKEYLOGFILE 环境变量才能解密,否则只能看到 TLS 记录层,看不到 HTTP。
5.4 大文件抓包导致 Wireshark 卡死
现象:抓了几分钟,Wireshark 界面无响应,内存飙升。原因:全量抓包且没有设置环形缓冲区,几百万个包同时加载到内存。解决:在捕获选项里勾选“输出到多个文件”并设置环形缓冲区,比如每个文件 100MB、最多 10 个文件。这样磁盘占用可控,也不会一次性加载全部。
5.5 时间戳对不上,排查时序问题被误导
现象:抓包看到请求和响应的时间差和日志里对不上。原因:Wireshark 默认显示的是抓包主机的本地时间,而服务端日志可能是 UTC,或者跨机器抓包时两台机器时钟不同步。解决:菜单View → Time Display Format可以切换成 UTC;跨机抓包前先对时(NTP),否则时序分析没有意义。
6. 进阶:用 tshark 和 pyshark 把抓包变成可自动化的数据管道
图形界面适合交互排查,但要做批量分析或集成到监控系统里,就得靠命令行。Wireshark 自带的tshark是同一套解析引擎的命令行版本,安装 Wireshark 时默认就有。
6.1 tshark 提取字段并导出 CSV
下面这条命令抓 100 个包,只提取时间、源 IP、目的 IP、TCP 目的端口和 HTTP 请求方法,输出成 CSV:
tshark -i eth0 -c 100 \ -T fields \ -e frame.time_relative \ -e ip.src \ -e ip.dst \ -e tcp.dstport \ -e http.request.method \ -E header=y \ -E separator=, \ -E quote=d \ > capture.csv-T fields表示按字段输出而不是完整协议树,-e指定要提取的字段名(和显示过滤器里的字段名一致),-E header=y输出表头,-E separator=,用逗号分隔,-E quote=d用双引号包裹字段防止内容里有逗号。这条命令可以直接塞进定时任务,把抓包结果喂给后续的日志分析或告警系统。
6.2 pyshark 做条件触发式抓包
Python 里用 pyshark 可以在抓到特定包时触发自定义逻辑。注意热词里提到的“python2.7+pyshark 无法抓包”是个经典问题——pyshark 依赖 tshark 可执行文件,Python 2.7 环境下路径解析和编码问题特别多,现在一律建议用 Python 3。
import pyshark # 只抓 8080 端口,避免全量 capture = pyshark.LiveCapture(interface='eth0', bpf_filter='tcp port 8080') for packet in capture.sniff_continuously(packet_count=50): try: # 判断是否是 HTTP 请求且方法为 POST if hasattr(packet, 'http') and packet.http.request_method == 'POST': # 检查载荷里是否包含可疑脚本标签 if 'frame_raw' in packet.frame.field_names: raw = packet.frame_raw.value if '<script>' in raw.lower(): print(f"[告警] 可疑 POST 载荷,源 {packet.ip.src}") except AttributeError: # 非 HTTP 包没有 http 层,跳过 continue这段代码的逻辑是:用 BPF 过滤器tcp port 8080在抓包阶段就限制范围,然后逐包检查是否有 HTTP 层、是否是 POST、原始字节里是否含<script>。packet.frame_raw.value拿到的是十六进制字符串,实际匹配前可能需要转成字节再解码,这里为了可读性做了简化。AttributeError的捕获是必须的,因为不是每个包都有 HTTP 层,直接访问会抛异常。
6.3 一个我自己的习惯
我现在排查线上问题,第一步永远是tshark -i any -f "port 目标端口" -w /tmp/cap.pcap -a duration:30,先抓 30 秒存成文件,再用 Wireshark 打开慢慢看。这样做的好处是现场只留一个命令,不占用交互界面,抓完的文件可以反复分析、可以发给同事、可以留作证据。图形界面是给“看”用的,命令行是给“抓”用的,把这两件事分开,排查效率会高很多。
抓包这件事,工具只是入口,真正值钱的是你对 TCP/IP 四层模型和协议行为的理解。过滤器写得再花,看不懂 SYN 重传和窗口滑动,照样定位不了问题。希望帮到你。
本文还有配套的精品资源,点击获取