
简介这份PDF教程面向网络管理员、运维工程师及网络协议分析初学者系统讲解WIRESHARK抓包的核心方法帮助读者理解网络通信过程、诊断网络故障并优化性能。内容围绕网络结构、交换机端口镜像与抓包软件操作流程三部分展开涵盖AP、AC、交换机、PC等设备的连接关系以及抓取LAN口与WAN口数据的差异并说明如何通过物理端口或VLAN镜像端口捕获AP到AC之间及AC上行数据。操作部分按五个步骤梳理列出可用网卡、选择镜像端口网卡开始抓包、停止抓包、查看报文信息以及通过save或save as保存不同格式的报文文件。资源包为1个PDF文件大小约945KB轻量便携适合随时查阅。目前已有655人学习可作为网络抓包入门与实操参考的实用资料。1. WIRESHARK抓包教程从装完到看懂一个TCP流中间隔着多少坑很多人装完 Wireshark打开网卡列表看到几百个包刷屏第一反应是“这玩意儿怎么用”。我见过太多人卡在这一步明明按教程点了捕获过滤框里敲了 http结果一个包都没有。问题不在 Wireshark在于你根本没搞清它抓的是哪一层、哪个接口、什么协议。Wireshark 不是“打开就能看”的工具它是一台显微镜你得先知道要看什么切片。这篇内容面向的是已经装好 Wireshark、但抓完包不知道从哪下手的工程师或者正准备用 Wireshark 排查接口超时、重传、握手失败的后端和运维。我会按“装完之后的第一次有效捕获 → 过滤器的正确写法 → TCP 流追踪 → 典型故障定位”这条线走每一步都给可复现的命令和参数。不扯协议教科书只讲你打开软件之后手该怎么动。2. 第一次有效捕获选网卡、设捕获过滤器、定保存策略2.1 选错网卡等于白抓接口列表里的三个关键判断打开 Wireshark 第一件事不是点开始是看清楚接口列表。Windows 上你会看到一长串名字以太网、WLAN、本地连接* 10、Npcap Loopback Adapter、vEthernet (Default Switch)。选哪个判断依据只有三条流量走向、接口状态、地址匹配。流量走向决定你抓哪张卡。如果你在排查本机访问外部 API 超时走的是物理网卡以太网或 WLAN。如果你在排查本机两个服务之间的调用走的是 LoopbackNpcap Loopback Adapter。如果你在 Docker 或 WSL 里跑服务走的是 vEthernet。选错了捕获列表里只有零星几个 ARP 或 STP 包你会以为“没流量”其实是抓错了口。接口状态看两点有没有实时波形、地址是不是你预期的。Wireshark 接口列表右侧有迷你波形图有起伏说明有流量。点开接口详情看 IP 是不是你本机地址。如果 IP 是 169.254 开头说明这张卡没拿到 DHCP抓了也没用。地址匹配是最容易翻车的地方。很多人用host 192.168.1.100做捕获过滤器结果本机 IP 是 192.168.1.101过滤器直接把所有包都挡掉了。捕获过滤器是在内核层生效的写错了连包都进不来你连“抓到了但看不懂”的机会都没有。提示不确定走哪张卡时先不加任何捕获过滤器抓 10 秒看哪个接口的包在涨。涨得最快的通常就是你要的口。2.2 捕获过滤器 vs 显示过滤器写错位置等于没过滤这是 Wireshark 新手翻车率最高的点。捕获过滤器和显示过滤器是两个完全不同的东西语法不同、生效时机不同、写错位置的后果也不同。捕获过滤器Capture Filter在开始抓包之前设置语法是 BPFBerkeley Packet Filter。它决定哪些包被内核交给 Wireshark。写错了包直接丢弃捕获列表里干干净净。显示过滤器Display Filter在抓包过程中或抓完之后设置语法是 Wireshark 自己的。它只影响显示不影响捕获。写错了顶部过滤框变红但包还在改对就能看到。常见错误在捕获过滤器里写http.request.method GET。这是显示过滤器语法BPF 不认识Wireshark 会直接报错或者捕获不到任何包。正确的捕获过滤器写法是tcp port 80或host 10.0.0.5 and port 443。我一般这样分工捕获过滤器只做粗筛比如限定主机和端口减少噪音显示过滤器做精筛比如只看某个 TCP 流的重传或只看 HTTP 响应码。粗筛用 BPF精筛用显示语法各司其职。# 捕获过滤器示例BPF 语法写在捕获选项里 host 192.168.1.50 and tcp port 8080 # 含义只抓本机与 192.168.1.50 之间 8080 端口的 TCP 包 # 显示过滤器示例写在顶部过滤框 tcp.analysis.retransmission # 含义只显示 TCP 重传包 tcp.port 8080 http.response.code 500 # 含义8080 端口上 HTTP 响应码大于等于 500 的包捕获过滤器里host和port是最常用的两个原语and、or、not做组合。显示过滤器里tcp.port、ip.addr、http.response.code是高频字段。记住一条捕获过滤器里没有显示过滤器里必须有或!。2.3 环形缓冲与保存策略别让一次抓包撑爆硬盘Wireshark 默认把捕获包存在内存里抓久了内存暴涨最后崩溃丢包。生产环境排查问题一次抓几十分钟很正常必须设环形缓冲。位置在“捕获选项”里勾选“输出到多个文件”和“使用环形缓冲区”。参数含义在多个文件中设置文件数量比如 10 个。每个文件大小比如 100 MB。环形缓冲区勾选后写满第 10 个文件就覆盖第 1 个。这样最多占 1 GB 磁盘永远保留最近一段时间的包。排查偶发问题时你不需要从头到尾的包只需要故障发生前后那几十秒。环形缓冲就是你的后悔药。另一个参数是“自动停止捕获条件”可以设“在 N 个包之后停止”或“在 N 秒之后停止”。做性能压测时我一般设 60 秒自动停避免忘记关。注意如果抓包机磁盘是机械盘每个文件大小不要超过 200 MB否则写入延迟会导致丢包。SSD 可以放宽到 500 MB。3. 显示过滤器实战从几百个包里捞出你要的那一个3.1 最常用的 12 个显示过滤器字段与组合写法抓完包面对几千行第一件事是过滤。下面这些字段覆盖了日常排查的八成场景。过滤目标显示过滤器写法说明某 IP 的所有流量ip.addr 10.0.0.5源或目的任一匹配某 IP 作为源ip.src 10.0.0.5只看出站某 IP 作为目的ip.dst 10.0.0.5只看入站某端口tcp.port 443源或目的任一匹配某 TCP 流tcp.stream eq 5追踪流编号HTTP 请求http.request所有 HTTP 请求HTTP 响应码http.response.code 502只看 502TCP 重传tcp.analysis.retransmission重传包TCP 零窗口tcp.analysis.zero_window接收方缓冲满TCP RSTtcp.flags.reset 1连接被重置DNS 查询dns.qry.name contains api域名包含 apiTLS 握手失败tls.alert_messageTLS 告警组合写法用、||、!。比如ip.addr 10.0.0.5 tcp.port 8080 tcp.analysis.retransmission意思是“10.0.0.5 在 8080 端口上的重传包”。这个组合在排查接口超时时几乎必用。还有一个技巧在包详情里右键某个字段选“作为过滤器应用”Wireshark 会自动生成对应的显示过滤器。比如右键 TCP 头的 Destination Port选“作为过滤器应用 → 选中”顶部就变成tcp.dstport 8080。这比手敲快也不容易写错字段名。3.2 追踪 TCP 流看懂一次请求到底经历了什么过滤只是第一步真正定位问题要看完整交互。Wireshark 的“追踪 TCP 流”功能把一次 TCP 连接的所有包按方向拼在一起像看聊天记录一样。操作选中任意一个属于该流的包右键 → 追踪 → TCP 流。弹出的窗口里红色是客户端到服务端蓝色是服务端到客户端。看什么按顺序看四件事第一三次握手是否完成。SYN → SYN/ACK → ACK三个包齐全说明连接建立成功。如果只有 SYN 没有 SYN/ACK说明服务端没响应或中间被拦。如果 SYN 之后直接 RST说明端口没开或被防火墙拒绝。第二TLS 握手是否成功。Client Hello → Server Hello → Certificate → Finished。如果中间出现 Alert看 Alert 的 Level 和 Description。Level 2 是 FatalDescription 40 是 handshake failure通常意味着协议版本或加密套件不匹配。第三HTTP 请求和响应是否配对。一个 GET 对应一个 200或者一个 POST 对应一个 201。如果请求发了但没响应看是服务端处理慢还是网络丢包。如果响应码是 502 或 504问题在网关或后端。第四连接如何关闭。正常是 FIN → ACK → FIN → ACK。如果出现 RST说明某一方强制断开通常是应用层超时或崩溃。追踪流窗口底部有“跟随 TCP 流”的统计信息包括包数量、字节数、持续时间。持续时间特别有用如果一个请求从第一个包到最后一个包超过 3 秒而服务端日志显示处理只用了 50 毫秒那问题就在网络传输或客户端。3.3 用 tcp.analysis 字段定位重传、乱序、零窗口Wireshark 的tcp.analysis字段是排查 TCP 性能问题的黑匣子。它自动标记了各种异常你不需要手动算序列号。常用字段tcp.analysis.retransmission重传。发送方没收到 ACK重新发了一遍。tcp.analysis.fast_retransmission快速重传。收到三个重复 ACK 后立即重传比超时重传快。tcp.analysis.out_of_order乱序。包到达顺序和发送顺序不一致。tcp.analysis.zero_window零窗口。接收方缓冲区满告诉发送方暂停。tcp.analysis.window_update窗口更新。接收方缓冲释放通知发送方继续。排查接口超时时我一般先过滤tcp.analysis.retransmission || tcp.analysis.fast_retransmission。如果重传集中在某几个包看时间间隔。超时重传的间隔通常是指数退避1 秒、2 秒、4 秒、8 秒。如果看到 1 秒和 2 秒的重传说明第一次重传没成功第二次也丢了网络质量很差。零窗口更隐蔽。过滤tcp.analysis.zero_window如果出现看是哪个方向。如果是服务端发给客户端零窗口说明服务端应用读取太慢数据积压在接收缓冲区。这时候客户端会停止发送直到收到窗口更新。如果窗口更新迟迟不来客户端就会超时。提示tcp.analysis字段只在 Wireshark 解析了完整 TCP 流之后才生效。如果抓包不完整比如只抓了单向这些字段可能不出现。确保抓包点覆盖双向流量。4. 典型故障排查超时、握手失败、中文乱码怎么下刀4.1 接口超时的排查路径从 SYN 到 RST 的五个检查点接口超时是最常见的抓包需求。用户反馈“调你的接口要 5 秒才返回”你抓了包怎么定位按时间线走五个检查点检查点一SYN 发出后多久收到 SYN/ACK。如果超过 1 秒说明网络 RTT 高或服务端 accept 队列满。正常内网 RTT 小于 1 毫秒跨机房小于 10 毫秒。检查点二TLS 握手耗时。从 Client Hello 到 Finished正常在 100 毫秒以内。如果超过 500 毫秒检查证书链是否完整、OCSP 是否超时。检查点三HTTP 请求发出到第一个响应包的时间。这是服务端处理时间。如果超过 1 秒问题在后端应用或数据库。检查点四响应包之间的间隔。如果响应分多个包返回看是否有停顿。停顿可能是服务端分页查询或流式输出被阻塞。检查点五FIN 或 RST 的时机。如果客户端在收到完整响应前就发 FIN说明客户端超时主动断开。如果服务端发 RST说明服务端崩溃或连接被重置。我一般用显示过滤器tcp.stream eq N锁定单个流然后看 Wireshark 的“时间”列。把时间列改成“自上一显示包的时间”能直观看到每个包之间的间隔。超过 1 秒的间隔就是嫌疑点。4.2 中文显示为乱码或省略号字符编码与显示过滤器冲突热词里有人问“wireshark抓包为什么中文用....显示了”。两个原因。原因一字符编码不是 UTF-8。HTTP 响应头里Content-Type: text/html; charsetgbkWireshark 默认按 UTF-8 解码中文就变成乱码或点。解决在包详情里找到 HTTP 负载右键 → 显示为 → 选择正确的编码。或者直接看十六进制手动解码。原因二显示过滤器把包截断了。Wireshark 默认只显示前 256 字节的负载。如果中文在 256 字节之后就显示为省略号。解决编辑 → 首选项 → Protocols → HTTP → 取消“限制显示字节数”或调大。还有一个坑如果 HTTP 是分块传输Transfer-Encoding: chunkedWireshark 可能把每个块单独显示中文被切在两个块之间。这时候用“追踪 TCP 流”看完整负载不要只看单个包。4.3 抓不到包的五种情况网卡、权限、过滤器、加密、虚拟化“app抓包失败”是高频问题。Wireshark 抓不到包按顺序排查情况一选错网卡。手机 App 的流量走 WLAN你抓的是以太网。解决确认手机和电脑在同一网段抓 WLAN 接口。情况二没有管理员权限。Windows 上 Npcap 需要管理员权限才能捕获。解决右键 Wireshark → 以管理员身份运行。情况三捕获过滤器写错。比如写了host 192.168.1.100但手机 IP 是 192.168.1.101。解决清空捕获过滤器先抓全部。情况四流量被加密。HTTPS 流量在 Wireshark 里只能看到 TLS 握手看不到明文。解决配置 SSLKEYLOGFILE 环境变量让浏览器或客户端导出密钥。或者用中间人方式解密但注意合规。情况五虚拟化或容器网络。Docker 容器的流量走 vEthernetWSL 走 WSL 虚拟网卡。解决在宿主机上抓 vEthernet 接口或者进入容器内抓。注意安卓 8.1 及以上版本默认不信任用户安装的证书导致中间人抓包失败。这是系统行为不是 Wireshark 的问题。需要 root 或改 APK 的网络安全配置。5. 进阶技巧用 tshark 命令行批量分析把抓包变成可重复的流程5.1 tshark 常用命令从单文件统计到字段导出Wireshark 图形界面适合交互排查但批量分析或自动化必须用 tshark。它随 Wireshark 一起安装命令行直接调用。# 统计每个 TCP 流的包数量和字节数 tshark -r capture.pcap -q -z conv,tcp # -r 读取文件-q 安静模式-z 统计conv,tcp 输出 TCP 会话 # 导出所有 HTTP 请求的 URL 和方法 tshark -r capture.pcap -Y http.request -T fields -e http.request.method -e http.request.uri # -Y 显示过滤器-T fields 输出指定字段-e 指定字段名 # 统计 DNS 查询最多的域名 tshark -r capture.pcap -Y dns.flags.response 0 -T fields -e dns.qry.name | sort | uniq -c | sort -rn | head -20 # 过滤 DNS 查询提取域名排序统计-z conv,tcp输出的会话表里看“Duration”列。如果某个流持续时间特别长但包数量很少说明中间有长时间停顿。看“Bytes”列如果某个流字节数远大于其他可能是大文件传输或异常重传。-T fields是导出利器。配合-e可以提取任意字段输出成 TSV 格式直接导入 Excel 或数据库。我一般用这个做接口性能基线抓 10 分钟包导出所有 HTTP 请求的http.time和http.request.uri按 URI 分组算 P99。5.2 用 Python pyshark 做自定义分析绕开 python2.7 的坑热词里有人问“python2.7pyshark无法抓包问题”。pyshark 是 tshark 的 Python 封装但 python2.7 已经停止维护pyshark 新版本只支持 Python 3.6。如果你还在用 python2.7要么升级 Python要么直接用 tshark 命令行。Python 3 下用 pyshark 的示例import pyshark # 打开抓包文件display_filter 参数对应显示过滤器 cap pyshark.FileCapture(capture.pcap, display_filtertcp.analysis.retransmission) # 遍历重传包打印源 IP、目的 IP、序列号 for pkt in cap: if hasattr(pkt, ip) and hasattr(pkt, tcp): print(f{pkt.ip.src} - {pkt.ip.dst} seq{pkt.tcp.seq}) cap.close()FileCapture的display_filter参数在读取时过滤比读入内存再过滤快。keep_packetsFalse可以边读边释放处理大文件时避免内存溢出。如果要实时抓包用LiveCaptureimport pyshark # 指定网卡capture_filter 对应捕获过滤器 cap pyshark.LiveCapture(interfaceeth0, capture_filtertcp port 8080) # 抓 10 个包 for pkt in cap.sniff_continuously(packet_count10): print(pkt) cap.close()interface参数在 Windows 上要写网卡 GUID 或名称用tshark -D列出所有接口。capture_filter是 BPF 语法和 Wireshark 捕获过滤器一致。提示pyshark 依赖 tshark确保 tshark 在 PATH 里。如果报“tshark not found”在代码里指定tshark_path参数。5.3 把抓包分析固化成脚本一个接口超时自动定位的模板最后给一个我常用的模板抓包文件 目标 IP 目标端口自动输出该流的重传次数、零窗口次数、最大间隔。import pyshark import sys def analyze_stream(pcap_file, target_ip, target_port): cap pyshark.FileCapture(pcap_file, display_filterfip.addr {target_ip} tcp.port {target_port}) retrans 0 zero_win 0 max_gap 0 prev_time None for pkt in cap: if hasattr(pkt, tcp): # 统计重传 if hasattr(pkt.tcp, analysis_retransmission): retrans 1 # 统计零窗口 if hasattr(pkt.tcp, analysis_zero_window): zero_win 1 # 计算包间隔 curr_time float(pkt.sniff_timestamp) if prev_time: gap curr_time - prev_time if gap max_gap: max_gap gap prev_time curr_time cap.close() print(f重传次数: {retrans}) print(f零窗口次数: {zero_win}) print(f最大包间隔: {max_gap:.3f} 秒) if __name__ __main__: analyze_stream(sys.argv[1], sys.argv[2], sys.argv[3])用法python analyze.py capture.pcap 10.0.0.5 8080。输出三个关键指标。重传次数大于 5 说明网络质量差零窗口出现说明接收方处理慢最大间隔大于 1 秒说明有停顿。这个脚本我放在 CI 里每次压测后自动跑把结果写进测试报告。抓包不再是“出了问题才去抓”而是变成性能基线的一部分。我自己的习惯是任何接口上线前先抓一次正常流量的包存成基线。出问题时抓故障包用脚本对比两个文件的指标差异。差异最大的那个指标就是根因方向。这个习惯帮我省掉了大量“猜”的时间。希望帮到你。本文还有配套的精品资源点击获取