4、物理层与数据链路层抓包:以太网帧结构、MAC地址解析、ARP协议抓包分析

各位好,欢迎来到第四章。前面我们聊了抓包环境怎么搭、工具怎么用,今天终于要深入到网络最底层的两个家伙——物理层和数据链路层了。

说实话,很多搞网络的人干了三五年,对TCP、HTTP头头是道,但一问到以太网帧结构,反而支支吾吾。我个人觉得,这就像盖楼不看地基——早晚要出问题。今天我们就用Wireshark把这层窗户纸捅破。

4.1 以太网帧结构:数据链路层的“信封”

数据在网络上传输,不是光着身子跑的。它得套上信封。这个信封,就是以太网帧。

我刚开始学的时候,总觉得帧结构就是一堆字节,背下来就行了。直到有一次排查一个丢包问题,发现是帧尾的FCS校验字段被网卡错误截断了——嗯,从那以后我再也不敢小看这14个字节了。

标准以太网帧(DIX 2.0 / Ethernet II)结构:

  • 前导码(Preamble):8字节,用于同步时钟。抓包时看不到,因为网卡已经把它剥离了。
  • 目标MAC地址:6字节,谁收这封信。
  • 源MAC地址:6字节,谁发的信。
  • 类型/长度(Type/Length):2字节。大于1536表示上层协议类型(如0x0800=IP,0x0806=ARP),小于等于1500表示帧长度。
  • 数据载荷(Payload):46~1500字节。不够46字节要填充。
  • 帧校验序列(FCS):4字节,CRC32校验。抓包时通常也被网卡去掉了。

你想想看,一个帧最少64字节(不含前导码),最大1518字节。为什么最小是64?因为要防止短帧冲突检测失效。这个细节,后面讲CSMA/CD时再展开。

4.2 MAC地址解析:谁是谁的身份证

MAC地址,说白了就是网卡的硬件身份证。48位,前24位是厂商OUI,后24位是序列号。

我有个习惯:拿到一个陌生抓包文件,先看源MAC和目标MAC。这能快速判断流量是本地通信还是跨网段。

MAC地址类型 特点 举例
单播 第1字节最低位=0 00:1a:2b:3c:4d:5e
多播 第1字节最低位=1 01:00:5e:00:00:01
广播 全F ff:ff:ff:ff:ff:ff

这里有个坑:很多人以为MAC地址是唯一的。其实不是。虚拟机的MAC可以手动改,有些网卡驱动也允许自定义。我在一次渗透测试中,就遇到过攻击者伪造MAC地址绕过交换机端口安全——所以别太迷信MAC地址的“唯一性”。

4.3 ARP协议抓包分析:IP到MAC的翻译官

ARP(地址解析协议)是数据链路层和网络层之间的桥梁。它的任务很简单:给我一个IP,我告诉你对应的MAC。

但简单归简单,坑可不少。我曾经遇到一个经典故障:某台服务器间歇性丢包,抓包发现ARP表频繁刷新,原因是另一台设备用相同的IP地址在广播ARP应答——这就是ARP欺骗。

4.3.1 ARP报文结构

ARP报文直接封装在以太网帧里,类型字段是0x0806。结构如下:

+----------------+----------------+----------------+----------------+
| 硬件类型 (2B)   | 协议类型 (2B)   | 硬件地址长度(1B)| 协议地址长度(1B)|
+----------------+----------------+----------------+----------------+
| 操作码 (2B)     | 发送端MAC (6B)  | 发送端IP (4B)   |
+----------------+----------------+----------------+----------------+
| 目标MAC (6B)    | 目标IP (4B)     |
+----------------+----------------+----------------+

操作码:1=请求,2=应答。就这么简单。

4.3.2 抓包实战:ARP请求与应答

我们打开Wireshark,过滤条件输入 arp。然后ping一个同网段的主机。你会看到:

  1. ARP请求:目标MAC是ff:ff:ff:ff:ff:ff(广播),发送端MAC是本机,目标IP是你要ping的IP。
  2. ARP应答:目标MAC变成请求方的MAC,发送端MAC是目标主机的MAC,操作码=2。

小技巧:在Wireshark里,点开ARP报文,展开"Address Resolution Protocol"字段,所有信息一目了然。我习惯把"Sender MAC address"和"Target MAC address"加到列显示里,方便快速浏览。

4.3.3 ARP缓存与老化

操作系统会把解析到的IP-MAC映射缓存起来,避免每次通信都发广播。Windows下用 arp -a 查看,Linux下用 ip neigh。

缓存时间一般2~10分钟。过期后重新请求。这个机制本身没问题,但攻击者可以利用它——发送伪造的ARP应答,让受害者的缓存指向错误的MAC,从而实现中间人攻击。

避坑指南:我曾经在一个数据中心排查过“间歇性断网”问题。最后发现是某台服务器的ARP缓存被污染,导致流量发到了错误的网关。解决方案:在核心交换机上配置静态ARP条目,或者启用DAI(动态ARP检测)。

4.4 抓包实战:完整分析一个ARP交互

下面我们看一个真实的抓包片段。假设我的机器IP是192.168.1.100,MAC是00:0c:29:ab:cd:ef,去ping 192.168.1.1。

第一步:ARP请求

Ethernet II, Src: 00:0c:29:ab:cd:ef, Dst: ff:ff:ff:ff:ff:ff
Address Resolution Protocol (request)
  Hardware type: Ethernet (1)
  Protocol type: IPv4 (0x0800)
  Hardware size: 6
  Protocol size: 4
  Opcode: request (1)
  Sender MAC address: 00:0c:29:ab:cd:ef
  Sender IP address: 192.168.1.100
  Target MAC address: 00:00:00_00:00:00 (全0,未知)
  Target IP address: 192.168.1.1

第二步:ARP应答

Ethernet II, Src: 00:1a:2b:3c:4d:5e, Dst: 00:0c:29:ab:cd:ef
Address Resolution Protocol (reply)
  Opcode: reply (2)
  Sender MAC address: 00:1a:2b:3c:4d:5e
  Sender IP address: 192.168.1.1
  Target MAC address: 00:0c:29:ab:cd:ef
  Target IP address: 192.168.1.100

注意看:ARP应答是单播,不是广播。只有请求方才能收到。这是很多人容易搞混的地方。

4.5 本章知识体系

下面这张图,是我自己总结的物理层与数据链路层抓包核心逻辑。建议你保存下来,以后排查问题时对照着看。

物理层与数据链路层抓包核心逻辑 以太网帧结构 前导码 | 目标MAC | 源MAC | 类型 | 数据 | FCS MAC地址解析 单播 | 多播 | 广播 ARP协议 请求 | 应答 | 缓存 Wireshark 抓包实战 过滤 arp 请求/应答 分析 MAC 地址变化 检查 ARP 缓存表 常见问题:ARP欺骗 | MAC泛洪 | 帧校验错误 | 广播风暴 从帧结构出发,到MAC地址,再到ARP协议,最后落地到抓包实战和常见问题排查

4.6 常见问题与排查思路

最后,我把自己这些年遇到的数据链路层问题整理了一下。你遇到类似情况,可以按这个思路排查:

现象 可能原因 抓包特征 解决方向
ping不通同网段主机 ARP解析失败 只有ARP请求,无应答 检查目标主机是否在线、防火墙是否拦截ARP
间歇性断网 ARP缓存被污染 ARP应答来自非预期MAC 配置静态ARP或启用DAI
网络时快时慢 广播风暴 大量广播帧(ARP、DHCP等) 检查环路、配置风暴控制
特定应用无法通信 MTU不匹配导致分片 ICMP需要分片但DF标志置位 调整MTU或路径MTU发现

嗯,这一章的内容就到这里。物理层和数据链路层虽然基础,但很多高级问题都根植于此。下次你遇到网络故障,别急着往上三层找,先看看MAC地址对不对、ARP表稳不稳——往往能省下大把时间。