抓包分析基础:工欲善其事,必先利其器

各位好,欢迎来到第二章。上一章我们聊了吞吐测试的整体思路,从这章开始,咱们要真正动手了。

抓包分析,说白了就是“偷看”网络上的对话。你得知道数据长什么样,才能分析它为什么慢、为什么丢包。我刚开始学的时候,对着Wireshark满屏的十六进制发懵——后来才发现,只要把结构拆开看,其实没那么复杂。

本章核心目标:装好工具、学会过滤、看懂数据包的三层结构。这三件事做扎实了,后面的吞吐分析才有根基。

2.1 Wireshark 安装与界面初识

Wireshark 是抓包界的“瑞士军刀”。免费、开源、跨平台,几乎所有的网络工程师都在用。我个人习惯在 Windows 和 Linux 上都备一份,因为不同场景下抓包策略不一样。

2.1.1 安装要点

  • Windows:去官网下载安装包,一路 Next。注意安装时会提示安装 Npcap(或 WinPcap),一定要装——这是抓包的底层驱动。我遇到过有人装完 Wireshark 发现抓不到包,结果就是没装 Npcap。
  • macOS:用 Homebrew 最省事:brew install wireshark。也可以下载 .dmg 安装包。
  • Linux:以 Ubuntu 为例:sudo apt install wireshark。安装后记得把当前用户加入 wireshark 组,否则普通用户没权限抓包。

避坑指南:我曾经在生产环境的服务器上直接装 Wireshark,结果被安全部门约谈。记住:生产环境尽量用 tcpdump 命令行抓包,抓完拿回本地用 Wireshark 分析。别在线上机器装图形界面。

2.1.2 界面速览

打开 Wireshark,你会看到这样一个界面(我描述一下,你对照着看):

  • 顶部菜单栏:文件、编辑、视图、捕获、分析…… 常用的就“捕获”和“分析”。
  • 过滤栏:就在菜单下面,一个长条输入框。这是你以后最常打交道的地方。
  • 数据包列表区:默认显示所有抓到的包。每一行是一个包,列字段包括:序号、时间、源IP、目的IP、协议、长度、信息摘要。
  • 数据包详情区:选中一个包,中间区域会分层展开——物理层、网络层、传输层、应用层。
  • 数据包字节区:最下面,显示原始十六进制和 ASCII 码。说实话,日常分析很少看这里,除非做底层协议逆向。

小技巧:刚启动时 Wireshark 会列出所有网络接口。如果你不确定用哪个,看“流量”那一列——有波动的就是正在通信的接口。我一般先选接口,点“开始捕获”,几秒钟后点“停止”,看看抓到的东西对不对。

2.2 抓包过滤器与显示过滤器

很多新手一上来就点“开始捕获”,结果几秒钟抓了几万个包,直接看花眼。嗯,这里有个关键概念:过滤器分两种,用途完全不同。

类型 作用时机 语法基础 典型场景
抓包过滤器 捕获之前设置,只抓符合条件的包 BPF(Berkeley Packet Filter) 只抓某台主机的流量,减少抓包文件体积
显示过滤器 捕获之后设置,从已抓到的包中筛选显示 Wireshark 专有语法(更丰富) 从全量数据中找出 HTTP 请求或特定 TCP 流

2.2.1 抓包过滤器(Capture Filter)

抓包过滤器在捕获开始前设置。语法是 BPF,比较简洁。举个例子:

# 只抓 192.168.1.100 的流量
host 192.168.1.100

# 只抓 HTTP 流量(TCP 80 端口)
tcp port 80

# 只抓某网段的广播包
net 192.168.1.0/24 and broadcast

你想想看,如果吞吐测试时只关心客户端和服务器之间的流量,用 host 10.0.0.1 and host 10.0.0.2 就能过滤掉所有无关噪声。我在一次数据中心搬迁项目中,就是靠这个过滤器在千兆链路上精准抓到两台存储设备之间的交互,文件大小从 2GB 降到了 200MB。

2.2.2 显示过滤器(Display Filter)

显示过滤器更强大,因为它能基于协议字段做精细筛选。语法是 Wireshark 自己的,支持自动补全。常用的有:

# 只看 TCP 流量
tcp

# 只看源 IP 为 10.0.0.1 的包
ip.src == 10.0.0.1

# 只看 TCP 端口 443 且 SYN 标志位为 1 的包
tcp.port == 443 and tcp.flags.syn == 1

# 只看 HTTP 请求(GET 或 POST)
http.request

我的习惯:抓包时用抓包过滤器做粗筛,保留核心流量;分析时用显示过滤器做细筛,层层下钻。比如先看 tcp,再看 tcp.analysis.lost_segment 找丢包,最后定位到具体流。

2.3 数据包结构解析

数据包在网络上传输,就像寄快递——外面套一层又一层的信封。每一层都有特定的头部信息。咱们从下往上拆。

2.3.1 以太网帧(Layer 2)

以太网帧是最外层的“信封”。结构如下:

字段 长度(字节) 说明
目的 MAC 6 接收方网卡地址
源 MAC 6 发送方网卡地址
类型/长度 2 0x0800 表示 IPv4,0x0806 表示 ARP
载荷 46-1500 上层数据(IP 包)
FCS 4 帧校验序列(Wireshark 通常不显示)

在 Wireshark 里展开一个包,最上面就是 Ethernet II 部分。你会看到 Source 和 Destination 两个 MAC 地址。吞吐测试中,如果发现 MAC 地址频繁变化,说明数据经过了交换机或路由器——这会影响延迟计算。

2.3.2 IP 头(Layer 3)

IP 头是网络层的核心。IPv4 头部通常是 20 字节(无选项时)。关键字段:

  • 版本:4 或 6。现在大部分还是 IPv4。
  • 总长度:整个 IP 包的长度,包括头部和数据。最大 65535 字节。
  • 标识 + 标志 + 片偏移:用于 IP 分片。吞吐测试中如果看到大量分片包,说明 MTU 设置有问题。
  • TTL:生存时间。每经过一个路由器减 1,减到 0 就丢弃。我常用 TTL 判断两台设备之间隔了几跳。
  • 协议:6 表示 TCP,17 表示 UDP。
  • 源 IP 和 目的 IP:各 4 字节。

实战经验:有一次吞吐测试结果忽高忽低,我抓包一看,发现 TTL 值在 64 和 128 之间交替出现。这说明流量走了两条不同的路径——一条经过三层设备,一条直连。后来排查发现是路由表配置了等价多路径(ECMP),导致数据包乱序。调整策略后吞吐就稳定了。

2.3.3 TCP 头(Layer 4)

TCP 头部比 UDP 复杂得多,因为要保证可靠传输。标准 TCP 头 20 字节,关键字段:

字段 长度(字节) 说明
源端口 / 目的端口 各 2 标识应用层协议(如 80=HTTP)
序列号 4 标识数据字节流的位置
确认号 4 期望收到的下一个序列号
标志位 1(实际 9 位) SYN、ACK、FIN、RST 等
窗口大小 2 接收方还能收多少数据(流量控制)
校验和 2 校验头部和数据完整性

吞吐测试中,我最关注三个东西:

  • 窗口大小:如果窗口突然变成 0,说明接收方处理不过来——这是性能瓶颈的信号。
  • 重传:Wireshark 会用黑色背景标记重传包。重传率超过 1% 就要警惕了。
  • 三次握手延迟:从 SYN 到 SYN-ACK 的时间,能反映网络往返时延(RTT)。

2.3.4 UDP 头(Layer 4)

UDP 就简单多了,只有 8 个字节:源端口、目的端口、长度、校验和。没有序列号、没有确认、没有窗口。说白了就是“发了就不管了”。

吞吐测试中,UDP 常用于测试纯带宽(比如 iperf 的 UDP 模式)。但要注意:UDP 没有拥塞控制,如果网络有丢包,你看到的“吞吐”可能虚高——因为丢掉的包也算在发送速率里了。

2.4 本章知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作一个“思维导图”来用。

抓包分析基础 - 知识体系 抓包分析基础 Wireshark 安装与界面 抓包过滤器与显示过滤器 数据包结构解析 安装要点 界面速览 抓包过滤器 显示过滤器 以太网帧 IP 头 TCP/UDP 头 核心原则:先粗筛后细看,从外到内逐层拆解 抓包过滤器减少噪声 → 显示过滤器精准定位 → 逐层分析头部字段

2.5 本章小结

这一章我们做了三件事:

  • 装好了 Wireshark,熟悉了界面布局。
  • 学会了两种过滤器的用法——抓包过滤器用来“节流”,显示过滤器用来“精筛”。
  • 拆解了数据包的三层结构:以太网帧、IP 头、TCP/UDP 头。每个头部都有关键字段,吞吐测试中重点关注 MAC 地址变化、TTL 跳数、TCP 窗口和重传。