3. 以太网帧:MAC地址解析、帧结构、广播与单播、ARP协议抓包分析

各位同学,今天我们聊一个非常基础但又极其重要的东西——以太网帧。你想想看,数据在网络上跑,总得有个“信封”把它装起来吧?这个信封就是以太网帧。我做了这么多年网络排障,可以说90%的问题,只要你能看懂帧结构,基本就能定位到根因。

3.1 MAC地址:网络设备的“身份证”

MAC地址,全称是Media Access Control地址。说白了,就是网卡出厂时烧录的一个唯一标识。48位,6个字节,通常用十六进制表示,比如 00:1A:2B:3C:4D:5E。

这里有个关键点:MAC地址是二层地址,只在同一个广播域内有效。跨网段通信,靠的是IP地址,但最终找到目标设备,还是得靠MAC地址。

MAC地址结构

  • 前24位(OUI):厂商代码,由IEEE分配。比如00:1A:2B是华为的。
  • 后24位(NIC):网卡序列号,由厂商自行分配。
  • 第1字节的最低2位:决定地址类型。
    • I/G位(第0位):0=单播,1=组播/广播。
    • G/L位(第1位):0=全局唯一,1=本地管理。

我记得有一次,客户说网络时通时不通。我抓包一看,发现有个设备的MAC地址竟然是全F——FF:FF:FF:FF:FF:FF。这明显是广播地址啊!后来一查,是有人手动改了MAC地址,导致网络风暴。嗯,这里要注意:不要随意修改MAC地址,除非你非常清楚自己在做什么。

3.2 以太网帧结构:数据在线上怎么“跑”

以太网帧的结构,我建议你把它刻在脑子里。因为无论你抓什么包,最终都要解析这个结构。标准的以太网帧(DIX 2.0)长这样:

字段 长度(字节) 说明
前导码(Preamble) 7 同步时钟,用于接收方锁定比特流
帧起始定界符(SFD) 1 标志帧的开始,固定为0xAB
目标MAC地址 6 接收方MAC地址
源MAC地址 6 发送方MAC地址
类型/长度(EtherType) 2 0x0800=IPv4,0x0806=ARP,0x86DD=IPv6
载荷(Payload) 46~1500 上层协议数据,不够46字节要填充
帧校验序列(FCS) 4 CRC32校验,检测传输错误

抓包时,Wireshark通常不会显示前导码和SFD,因为它们在物理层就被剥离了。你看到的帧,是从目标MAC地址开始的。

实战小技巧:在Wireshark中,你可以通过 Frame 协议看到帧的完整信息。比如帧长度、捕获长度等。我个人习惯先看 Ethernet II 这一层,确认源和目标MAC地址是否正确。

3.3 广播与单播:数据怎么“找人”

以太网通信有两种基本模式:单播和广播。还有一种组播,我们后面再讲。

  • 单播:目标MAC地址是某个特定设备的地址。交换机根据MAC地址表,把帧只转发到对应端口。这是最常见的通信方式。
  • 广播:目标MAC地址是 FF:FF:FF:FF:FF:FF。交换机收到广播帧,会把它转发到所有端口(除了接收端口)。广播用于ARP请求、DHCP发现等场景。

你想想看,如果网络里广播太多,会发生什么?没错,广播风暴。我曾经处理过一个案例,整个办公网络突然瘫痪。抓包一看,某个傻瓜交换机环路导致广播帧无限循环,所有设备都在处理广播,正常数据根本发不出去。所以,广播域越大,风险越高。这也是为什么我们要用VLAN来隔离广播域。

3.4 ARP协议:IP地址到MAC地址的“翻译官”

ARP(Address Resolution Protocol)是TCP/IP协议栈里最基础的协议之一。它的作用很简单:根据IP地址,找到对应的MAC地址。

ARP的工作原理,我画了一张图,你一看就明白:

ARP请求与响应流程 ARP请求与响应流程 主机A IP: 192.168.1.10 主机B IP: 192.168.1.20 ① ARP请求(广播) “谁的IP是192.168.1.20?请告诉我你的MAC地址” ② ARP响应(单播) “我是192.168.1.20,我的MAC是AA:BB:CC:DD:EE:FF” 关键点 • ARP请求是广播帧,目标MAC为 FF:FF:FF:FF:FF:FF • ARP响应是单播帧,直接回复给请求方 • 主机A收到响应后,将IP-MAC映射写入ARP缓存 • ARP缓存有老化时间(通常2分钟),过期后需要重新请求

ARP的工作流程,说白了就两步:

  1. 主机A发送ARP请求:广播询问“谁的IP是192.168.1.20?请告诉我你的MAC地址”。
  2. 主机B回复ARP响应:单播告诉主机A“我是192.168.1.20,我的MAC是AA:BB:CC:DD:EE:FF”。

主机A收到响应后,会把IP和MAC的对应关系写入ARP缓存。下次再通信,直接查缓存,不用再发广播了。

避坑指南:我曾经遇到过一个ARP欺骗攻击。攻击者伪造ARP响应,告诉网关“我是192.168.1.100,我的MAC是XX:XX:XX:XX:XX:XX”。结果所有发往192.168.1.100的数据,都跑到了攻击者那里。所以,在信任的网络中,建议配置静态ARP条目,或者使用DAI(Dynamic ARP Inspection)来防御。

3.5 ARP抓包实战:用Wireshark看个明白

光说不练假把式。我们来实际操作一下,用Wireshark抓一个ARP包看看。

实验环境:两台Windows机器,IP分别为192.168.1.10和192.168.1.20。

操作步骤:

  1. 在主机A上打开Wireshark,选择正确的网卡开始抓包。
  2. 在主机A的命令行执行 ping 192.168.1.20。
  3. 观察Wireshark捕获的ARP包。

你会看到类似这样的内容:

Frame 1: 42 bytes on wire (336 bits), 42 bytes captured (336 bits)
Ethernet II, Src: 00:1A:2B:3C:4D:5E (00:1A:2B:3C:4D:5E), Dst: ff:ff:ff:ff:ff:ff (ff:ff:ff:ff:ff:ff)
    Destination: ff:ff:ff:ff:ff:ff (ff:ff:ff:ff:ff:ff)  ← 广播地址
    Source: 00:1A:2B:3C:4D:5E (00:1A:2B:3C:4D:5E)
    Type: ARP (0x0806)
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:1A:2B:3C:4D:5E
    Sender IP address: 192.168.1.10
    Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00)  ← 未知,填0
    Target IP address: 192.168.1.20

注意看几个关键字段:

  • Opcode:1表示请求,2表示响应。
  • Sender MAC/IP:发送方的地址。
  • Target MAC/IP:目标方的地址。请求时,Target MAC是未知的,所以填0。

然后你会看到主机B回复的ARP响应:

Frame 2: 42 bytes on wire (336 bits), 42 bytes captured (336 bits)
Ethernet II, Src: AA:BB:CC:DD:EE:FF (AA:BB:CC:DD:EE:FF), Dst: 00:1A:2B:3C:4D:5E (00:1A:2B:3C:4D:5E)
    Destination: 00:1A:2B:3C:4D:5E (00:1A:2B:3C:4D:5E)  ← 单播地址
    Source: AA:BB:CC:DD:EE:FF (AA:BB:CC:DD:EE:FF)
    Type: ARP (0x0806)
Address Resolution Protocol (reply)
    Hardware type: Ethernet (1)
    Protocol type: IPv4 (0x0800)
    Hardware size: 6
    Protocol size: 4
    Opcode: reply (2)
    Sender MAC address: AA:BB:CC:DD:EE:FF
    Sender IP address: 192.168.1.20
    Target MAC address: 00:1A:2B:3C:4D:5E
    Target IP address: 192.168.1.10

看到了吗?响应包的目标MAC是主机A的地址,不再是广播了。而且Opcode变成了2,Sender MAC和IP填的是主机B自己的信息。

个人经验:我习惯在Wireshark里设置一个显示过滤器 arp,这样只显示ARP包,不会被其他流量干扰。另外,arp -a 命令可以查看本机的ARP缓存,排障时非常有用。

3.6 总结:以太网帧与ARP的核心要点

好了,这一章的内容就这些。我们来快速回顾一下:

  • MAC地址是二层地址,48位,前24位是厂商代码,后24位是序列号。
  • 以太网帧由目标MAC、源MAC、类型、载荷和FCS组成。抓包时重点关注EtherType字段。
  • 广播的目标MAC是全F,用于ARP请求等场景。单播是点对点通信。
  • ARP协议负责将IP地址解析为MAC地址。请求是广播,响应是单播。