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的工作流程,说白了就两步:
- 主机A发送ARP请求:广播询问“谁的IP是192.168.1.20?请告诉我你的MAC地址”。
- 主机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。
操作步骤:
- 在主机A上打开Wireshark,选择正确的网卡开始抓包。
- 在主机A的命令行执行
ping 192.168.1.20。 - 观察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地址。请求是广播,响应是单播。