计算机网络学习站

kp-034 · 07-综合实践与前沿

抓包分析:tcpdump 与 Wireshark

进阶 约 25 分钟 tcpdumpWireshark抓包BPF
我的进度:

注:本文基于模型知识整理,建议结合权威教材与 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:域名反向解析会显著拖慢输出并引入额外查询流量。

自测题

  1. 捕获过滤器与显示过滤器的本质区别是什么?

答案要点: 捕获过滤器是 BPF 语法、编译进内核,帧到达时即丢弃不匹配者,省资源但抓完不能找回;显示过滤器是 Wireshark 自有语法、对已捕获数据做用户态筛选,可反复调整。语法不同、阶段不同、不可混用。

  1. 在抓包输出里如何识别一次完整的三次握手?

答案要点: 依次出现 SYN、SYN+ACK、ACK 三行;客户端 Seq=x,服务端以 Seq=y、Ack=x+1 应答,客户端再回 Ack=y+1;三行齐全且方向、序号正确即握手完成。

  1. 抓 HTTPS 流量能直接看到 URL 和表单内容吗?能看到什么?

答案要点: 不能,应用数据已加密;但握手元数据可见:SNI 暴露目标域名、证书链、协商套件与 alert 类型。要看明文须在 TLS 终止点(如反向代理)之后抓。

  1. 为什么推荐 tcpdump -w 存 pcap 再用 Wireshark 打开?

答案要点: 终端直读只有单行摘要;pcap 保存完整帧字节,可离线用显示过滤器、Follow TCP Stream 逐层深挖,也便于留存证据与协作分析。

  1. 想在自己笔记本上看两台服务器之间的流量,直接抓包可行吗?

答案要点: 通常不可行:交换机按目的 MAC 转发,你的网卡收不到别人的帧;需要端口镜像/SPAN,或让流量经过你控制的代理网关,且须有相应授权。

延伸阅读

  • tcpdump 与 libpcap 手册页:man tcpdump、man pcap-filter
  • Wireshark 官方用户指南(Wireshark User's Guide)
  • W. Richard Stevens 等《TCP/IP 详解 卷 1:协议》(第 2 版)