注:本文基于模型知识整理,建议结合权威教材与 RFC 原文核对细节。
一句话定义
抓包分析是在网卡上按需复制流经的帧并逐层解码的过程:tcpdump 用 BPF(Berkeley Packet Filter)在内核做捕获过滤,Wireshark 负责交互式解码与可视化,二者是网络排错与协议学习的「显微镜」。
为什么重要
日志只能告诉你应用看到了什么,抓包才能告诉你网络上实际传输了什么。「服务端说没收到、客户端说发了」这类各执一词,pcap(packet capture,抓包文件)是唯一裁判。它也是学协议最直观的方式:kp-004 里的抽象封装链在抓包里就是一行行可读的字节。用它有个前提:懂 kp-024 的握手结构,否则看到 ClientHello 也不知道自己在看什么。
前置知识
建议先读 kp-004《封装与复用》,理解以太网帧→IP→TCP→应用数据的逐层封装;排错流程与命令见 kp-033《网络排错方法论与常用命令》;HTTP 请求结构与 kp-023《HTTP》对应;TLS 握手中的消息见 kp-024《HTTPS/TLS》。
核心概念
可见性边界:本机抓包看到的是进出本机网卡的帧。想看别人主机之间的流量,需要交换机端口镜像(SPAN,Switched Port Analyzer)或让流量经过你控制的代理、网关——跨主机取证存在权限与法律边界。
tcpdump 高频选项:-i 指定接口(-i any 抓所有接口);-n 不解析域名,避免反向解析拖慢输出并污染流量;-w file.pcap 写文件供 Wireshark 离线深挖;-c 100 抓满即停,防止文件撑爆磁盘。
BPF 捕获过滤三例:
tcpdump -i eth0 -n host 10.0.0.5 and port 443
tcpdump -i eth0 -n tcp and not port 22
tcpdump -i eth0 -n src 192.168.1.10 and dst port 53语法要点:host/port/tcp 选对象,and/or/not 组合条件。
Wireshark 的两套过滤器:捕获过滤器用 BPF 语法,在内核层面直接丢弃不匹配的帧,省资源但抓完不可恢复;显示过滤器用另一套语法(如 tcp.port==443、http.request.method=="GET"),事后在已捕获数据里筛选,可反复调整。新手最常犯的错就是把 tcp.port==443 用进 tcpdump。
三窗布局与流跟随:包列表逐行列出帧,包详情把选中帧按协议栈逐层展开,字节窗显示原始十六进制;在任意 TCP 包上选 Follow TCP Stream 可把双向载荷拼成对话视图,看 HTTP 明文最方便。
图示
Wireshark 三窗布局 一次 HTTP GET 的封装读法
+---------------------+ 以太网帧头 [目的MAC|源MAC|类型0x0800]
| 包列表(每行一帧) | └ IP 头 [源IP|目的IP|协议=6]
| No. Time Source ... | └ TCP 头 [源端口|443|SEQ|FLAG]
+---------------------+ └ HTTP: GET / HTTP/1.1
| 包详情(逐层展开) | └ 载荷(HTTPS 下为密文)
+---------------------+
| 字节窗(原始十六进制) |
+---------------------+
三次握手在包列表中的样子
1 A -> B [SYN] Seq=100
2 B -> A [SYN,ACK] Seq=300 Ack=101
3 A -> B [ACK] Ack=301原理与机制
捕获过滤器为什么快:libpcap 把 BPF 表达式编译成内核里的过滤指令,帧从网卡驱动上来时先过这层判断,不匹配的连拷贝到用户态都省掉;显示过滤则是在用户态对已捕获的每条记录做表达式求值。二者发生在数据通路的不同阶段,这就是「捕获省资源、显示更灵活」的根源。
握手在抓包里的样子:kp-018 的三次握手就是三行——FLAGS=SYN(Seq=x)→ SYN,ACK(Seq=y,Ack=x+1)→ ACK(Ack=y+1);此后数据段的 Seq 按载荷字节数增长,ACK 确认对端已收到的字节。先核对三行是否齐全,再沿序号增长看是否连续,可判断连接建立失败与丢包重传。
TLS 流量的可见性:TLS(Transport Layer Security,传输层安全)加密的是应用数据,握手元数据仍然明文可见——ClientHello 里的 SNI(Server Name Indication,服务器名称指示,即目标域名)、协商的加密套件、服务器返回的证书链、以及 alert 告警。排查 TLS 问题看三样:握手停在哪一步、alert 的类型与描述、证书链是否完整。所以「抓包看不到 HTTPS 内容」是常态,要看自己服务的明文得在 TLS 终止点(反向代理)之后抓。
合规与隐私:只抓自己有权抓的流量;pcap 里含 Cookie、令牌、手机号等敏感数据,外发前脱敏;企业环境先过法务,抓包记录本身也是证据。
实例分析
反馈:某 HTTPS 接口在特定网络下时通时断。抓包 tcpdump -i any -n -w tls.pcap host api.example.com and port 443,Wireshark 中显示过滤器输入 tls,发现失败时客户端发出 ClientHello 后直接收到 Alert (Level: Fatal, Description: Handshake Failure),且仅出现在特定运营商出口上——SNI 可见、握手被链路中断,指向中间设备的 TLS 干扰而非服务端故障。应用日志里只有超时没有方向,pcap 给出了「停在哪一步、被谁断」的完整证据。
常见误区
- 把显示过滤器语法用于 tcpdump:
tcp port 443对,tcp.port==443错。 - 在高流量机器上无过滤全量抓:内核缓冲区来不及处理会丢包,分析结果反而失真。
- 抓到包看不出异常就下结论「网络没问题」:要对照期望行为(握手应答、序号连续性、重传)逐项核对。
- 省掉
-n:域名反向解析会显著拖慢输出并引入额外查询流量。
自测题
- 捕获过滤器与显示过滤器的本质区别是什么?
答案要点: 捕获过滤器是 BPF 语法、编译进内核,帧到达时即丢弃不匹配者,省资源但抓完不能找回;显示过滤器是 Wireshark 自有语法、对已捕获数据做用户态筛选,可反复调整。语法不同、阶段不同、不可混用。
- 在抓包输出里如何识别一次完整的三次握手?
答案要点: 依次出现 SYN、SYN+ACK、ACK 三行;客户端 Seq=x,服务端以 Seq=y、Ack=x+1 应答,客户端再回 Ack=y+1;三行齐全且方向、序号正确即握手完成。
- 抓 HTTPS 流量能直接看到 URL 和表单内容吗?能看到什么?
答案要点: 不能,应用数据已加密;但握手元数据可见:SNI 暴露目标域名、证书链、协商套件与 alert 类型。要看明文须在 TLS 终止点(如反向代理)之后抓。
- 为什么推荐
tcpdump -w存 pcap 再用 Wireshark 打开?
答案要点: 终端直读只有单行摘要;pcap 保存完整帧字节,可离线用显示过滤器、Follow TCP Stream 逐层深挖,也便于留存证据与协作分析。
- 想在自己笔记本上看两台服务器之间的流量,直接抓包可行吗?
答案要点: 通常不可行:交换机按目的 MAC 转发,你的网卡收不到别人的帧;需要端口镜像/SPAN,或让流量经过你控制的代理网关,且须有相应授权。
延伸阅读
- tcpdump 与 libpcap 手册页:
man tcpdump、man pcap-filter - Wireshark 官方用户指南(Wireshark User's Guide)
- W. Richard Stevens 等《TCP/IP 详解 卷 1:协议》(第 2 版)