Wireshark 抓包入门:如何看见网络发生了什么
学网络最让人挫败的,不是概念难,而是看不见。你背得出 TCP 三次握手,但从没亲眼见过 SYN、SYN ACK、ACK 是怎么一来一回的;你知道 DNS 先解析域名,但没见过查询报文长什么样;你知道连接会重传,但不知道线上那条"很慢"的请求到底卡在握手、卡在等响应、还是卡在重传。知识停留在想象层,遇到真实问题就抓瞎。
抓包就是把这层"看不见"捅破。Wireshark 之所以是网络工程师的必备工具,不是因为界面花哨,而是因为它把原本藏在内核和网线里的过程,一帧一帧摊到你眼前。
如果说读教材是在脑子里建模型,抓包就是拿现实去校验这个模型——你会发现很多记错的地方,也会把对的东西钉得更牢。
这一篇我们先讲清抓包这件事机制上是怎么工作的(包是从哪一层被捕获的、Wireshark 怎么把字节解析成协议、追踪流是怎么把散乱的包重组成会话),再讲怎么用过滤和追踪流去解决真实排障问题。
一、抓包的机制:包是在哪里被截下来的
先搞清一个根本问题:Wireshark 是怎么"看到"数据包的?
数据从应用层一路向下封装,最终变成链路层的帧从网卡发出去。抓包工具的工作位置,是在网卡驱动和协议栈之间插了一只"探针"。在 Linux 上这套机制叫 libpcap(Windows 上是 Npcap),它会让网卡进入一种特殊模式,把经过网卡的每一帧都复制一份交给抓包程序,而不影响正常的协议栈处理。
这个机制位置决定了两个重要事实:
- 抓到的是链路层完整帧:从以太网头、IP 头、TCP/UDP 头到应用层数据,整个封装栈都在。这正是你前面学的"分层封装"第一次变成肉眼可见的字节。
- 抓包是旁路复制,不改变流量:它只是拷贝一份观察,不影响真实通信(这点和中间人代理不同)。
Wireshark 看到的,是网卡进出的每一帧的完整副本。你前面学的每一层协议头,在这里都会被原原本本地拆出来——抓包是把"分层封装"从抽象变成实物的最佳途径。
补充一个常被忽略的点:抓包默认抓的是本机网卡经过的流量。在交换网络里,交换机只把发给你的帧送到你的网口,所以你抓不到别人之间的通信(除非配置端口镜像)。这也解释了为什么有时"明明在抓,却看不到目标流量"。
二、Wireshark 的核心能力:捕获、解析、过滤、追踪流
Wireshark 在 libpcap 之上做了四件事,构成它的全部价值:
- 捕获:选一块网卡开始抓,把每一帧存下来。
- 协议解析(dissect):这是它最强的地方——它内置了上千种协议的解析器,能把一串十六进制字节,按协议格式逐字段翻译成人能读的形式。一个 TCP 段会被拆成
Source Port、Seq、Ack、Flags等字段,鼠标点哪个字段,下方就高亮对应的原始字节。 - 过滤:从海量包里筛出你关心的那一小撮(下一节专讲)。
- 追踪流(Follow Stream):把属于同一条 TCP/HTTP 会话的、散落在抓包文件各处的包,按序重组成一段连贯的对话给你看。
理解"解析"和"追踪流"这两个机制很关键。原始抓包是按时间顺序混在一起的所有包,一条 HTTP 请求的来回可能夹在成百上千个无关包之间。追踪流的本质,是 Wireshark 按四元组(源 IP、源端口、目的 IP、目的端口)把同一条连接的包挑出来、按序列号排好,还原成"请求—响应"的完整面貌。
三、过滤表达式:抓包能不能用,全看会不会过滤
真实网络流量极杂,一秒钟成千上万个包,不过滤根本没法看。过滤是抓包从"眼花缭乱"变成"精准定位"的关键技能。 要分清两种过滤:
- 捕获过滤器(capture filter):抓之前设,决定"抓哪些、不抓哪些",用 BPF 语法,如
tcp port 443、host 1.2.3.4。它在抓的时候就丢弃不要的,省内存,适合长时间抓大流量。 - 显示过滤器(display filter):抓完之后设,从已抓到的包里筛出当前想看的,语法更丰富,是日常用得最多的。
显示过滤器的常用写法,建议直接记住这几条:
1 | ip.addr == 192.168.1.10 # 只看和某 IP 相关的包 |
抓包最忌"什么都想看"。正确姿势是先想清楚要回答的问题——是想确认 DNS 解析成没成?还是想看有没有 TCP 重传?——再用过滤器把视野收窄到那一小段流量。问题驱动,而不是字段驱动。
四、实战看握手:让 TCP 状态机变得可见
抓包最有成就感的一刻,是亲眼看到课本上的机制。抓一次访问网站的流量,用 tcp.flags.syn==1 or tcp.flags.fin==1 过滤,你会看到连接的骨架:
1 | No. 时间 源→目的 协议 信息 |
这就是前面学的三次握手活生生地展开了。更值得做的一步:把每个包里的 Seq= 和 Ack= 字段和你学过的序列号递进对上号——你会看到第二个包的 Ack 正好是第一个包 Seq+1,那个"SYN 消耗一个序列号"的抽象规则,瞬间变成眼前的具体数字。这种印证,比看十遍流程图记得都牢。
把抓包里的
Seq/Ack和你脑中的 TCP 状态机对上号,是验证理解最有效的方式。能看懂的人和只会背的人,差别就在这一步。
五、实战看 TLS 握手:哪些能看见,哪些已加密
抓一次 HTTPS 访问,用 tls 过滤,你会清楚看到握手阶段的几个明文报文:
Client Hello:能看到客户端支持的密码套件、SNI(要访问的域名);Server Hello:服务端选定的套件;Certificate:服务端证书链,能展开看到颁发者、有效期、域名;- 之后变成
Application Data:全是密文,看不到内容。
这恰好印证了上一篇 TLS 的机制分工:握手协商是明文可见的,业务数据是对称加密的。看到这里,你对"为什么 HTTPS 能保护内容、但 SNI 和证书却是明文"就有了直观认识。这也提醒你:HTTPS 场景下别指望抓包能直接看到应用层明文(除非你有服务端私钥或配置了 SSLKEYLOGFILE 让 Wireshark 解密)。
六、入门路线:先看哪几类包
不要一上来就研究所有字段。按由浅入深的顺序,建立"看包的手感":
- DNS:查询—响应一来一回,最直观。看一个域名怎么变成 IP,过滤
dns即可。 - TCP 握手/挥手:建立"连接是有状态、分步骤的"这个感觉,对照状态机看。
- HTTP 报文:看请求行、方法、Host、Cookie、状态码、响应头,理解一次请求响应的全貌。
- HTTPS 握手:感受哪些能看到、哪些被加密,把 TLS 机制落到实物。
这四类看顺了,Wireshark 就不再吓人。剩下的字段,用到哪个查哪个,不必一次背全。
七、和工程排障的真实关系
抓包真正的价值,是在线上排障时补上日志看不到的那一段"在路上发生了什么"。很多疑难问题,靠日志反复猜没用,一抓包就真相大白:
- 请求超时:是请求根本没发出去(抓不到出向包,可能是 DNS 没解析出来或本地路由问题),还是发出去了没回应(看到请求包但没响应包,问题在对端或中间链路)?这一步就能把锅分清楚。
- 连接慢:用追踪流看时间戳,是卡在三次握手(网络 RTT 高)、卡在 TLS 握手(证书链大/协商慢)、还是卡在服务端处理(请求发完到响应之间空了很久)?
- 疑似丢包:过滤
tcp.analysis.retransmission看有没有重传、tcp.analysis.duplicate_ack看有没有快重传信号,丢包率一目了然。 - 连接被重置:看到
RST包,结合是谁发的,判断是服务端主动拒绝、还是防火墙/中间设备干预。
Wireshark 不能代替系统日志,但它能回答日志回答不了的问题:“包到底有没有发出去、对面到底有没有回、慢在了哪一段。” 在"应用日志一切正常、但用户就是访问不了"的场景里,它往往是唯一能定位真相的工具。
一个实践建议:服务器上常用命令行的 tcpdump 抓包存成 .pcap 文件(tcpdump -i eth0 -w cap.pcap port 443),再下载到本地用 Wireshark 图形界面分析。这是后端/SRE 最常见的工作流——抓在远端、看在本地。
学习这一部分最容易踩的坑
1. 把 Wireshark 当"答案生成器"
它只展示现象,不替你做推理。它能告诉你"有重传、有 RST、响应慢了 2 秒",但"为什么"还得你结合协议知识和系统上下文去判断。抓包是证据,结论得你下。
2. 一上来就想看懂所有字段
每个协议头有几十个字段,新手全盯着看必然崩溃。正确做法是先抓主线:这是谁发给谁的?在哪一层出了问题?有没有重传?有没有响应?主线清楚了,再按需深入具体字段。
3. 期待 HTTPS 能直接看到明文
HTTPS 的应用数据是对称加密的,抓包看到的是 Application Data 密文。想看明文得有服务端私钥(且非前向保密套件)或配置 SSLKEYLOGFILE。不懂这点,会以为"抓包工具坏了"。
4. 在交换网络里以为能抓到所有人的流量
交换机只把发给你的帧送到你的网口,默认你只能抓到本机相关流量。想抓别人之间的通信,需要在交换机上配端口镜像(SPAN),否则抓了半天也看不到目标。
总结
这一篇我们先讲抓包的机制、再讲怎么用它排障,核心是把"看不见的网络"变成"看得见的证据":
- 抓包工作在网卡和协议栈之间,旁路复制每一帧的完整副本,让分层封装第一次变成肉眼可见;
- Wireshark 的四大能力是捕获、协议解析、过滤、追踪流,其中"解析"把字节翻译成字段、"追踪流"按四元组重组会话;
- 过滤是抓包能否实用的关键,分捕获过滤器和显示过滤器,核心是问题驱动、收窄视野;
- 抓包能让 TCP 握手、TLS 握手等机制变成眼前的具体报文,把
Seq/Ack和状态机对上号是最有效的验证; - 工程排障中,它专门回答日志答不了的问题——包有没有发出、对面有没有回、慢在哪一段;
- HTTPS 应用数据是密文、抓包只能看握手明文,交换网络默认只抓得到本机流量。
当你遇到一个网络现象,第一反应是"抓个包看看",并且知道该过滤什么、该看哪几个字段,这部分就真正属于你了。
参考资源:
- Wireshark 官方用户手册
- 《Wireshark 网络分析就这么简单》
- 《TCP/IP 详解 卷一:协议》(对照抓包阅读效果最佳)
- Wireshark Display Filter Reference