以太网、ARP 协议、MAC 地址
当你打开电脑连接网络时,有没有想过数据包是怎么从你的电脑发送到隔壁的打印机的?
它们不在同一个网络,不经过路由器,甚至不在「云端」——它们就在同一个房间里,靠以太网和 MAC 地址完成了这次传输。
MAC 地址:设备的「身份证号」
MAC 地址(Media Access Control Address)是网卡的物理地址,用于在数据链路层标识设备。它就像每个人的身份证号——全球唯一,终身不变。
地址格式
MAC 地址是 48 位(6 字节),通常用十六进制表示:
08:00:27:3B:59:D3
或者
08-00-27-3B-59-D3前 24 位是厂商代码(OUI),由 IEEE 分配给各制造商。比如:
08:00:27是 Oracle VirtualBox 的厂商代码00:1A:2B是 Cisco 的厂商代码F8:FF:C2是 Intel 的厂商代码
后 24 位是厂商自行分配的序列号,确保同厂商的网卡也不会重复。
特殊 MAC 地址
FF:FF:FF:FF:FF:FF → 广播地址,发送给所有设备
01:00:5E:xx:xx:xx → 组播地址
00:00:00:00:00:00 → 未指定的地址广播地址用于 ARP 请求——当你不知道目标 IP 对应的 MAC 地址时,就向全网广播这个 ARP 请求。
MAC 地址 vs IP 地址
| 特性 | MAC 地址 | IP 地址 |
|---|---|---|
| 长度 | 48 位(6 字节) | IPv4: 32 位,IPv6: 128 位 |
| 作用层 | 数据链路层 | 网络层 |
| 是否可改 | 可修改(软件层面) | 可配置,但本质是网络层标识 |
| 范围 | 局域网内唯一 | 全网唯一 |
| 分配方式 | 厂商烧录,理论上全球唯一 | 由 DHCP 或手动分配 |
简单理解:IP 地址告诉你「去哪里」,MAC 地址告诉你「下一跳是谁」。
以太网:局域网的王者
以太网(Ethernet)是目前最主流的局域网技术,定义了数据链路层和物理层的标准。
以太网帧结构
┌──────────┬────────────┬──────────┬──────────┬────────┬───────────┐
│ 前导码 │ 目的 MAC │ 源 MAC │ 类型 │ 数据 │ CRC │
│ 8 字节 │ 6 字节 │ 6 字节 │ 2 字节 │ 46-1500 │ 4 字节 │
├──────────┼────────────┼──────────┼──────────┼────────┼───────────┤
│ │ │ │ 0x0800=IP │ │ │
│ 1010... │ 目的地址 │ 源地址 │ 0x0806=ARP│ 负载 │ 校验和 │
└──────────┴────────────┴──────────┴──────────┴────────┴───────────┘- 前导码:7 字节的
10101010+ 1 字节的10101011,用于时钟同步 - 目的/源 MAC:各 6 字节,标识通信双方
- 类型字段:标识上层协议,比如
0x0800表示 IP 数据报,0x0806表示 ARP - 数据:46-1500 字节,如果数据不足 46 字节会填充(padding)
- CRC:循环冗余校验,检测传输错误
以太网的工作原理
以太网最初使用总线型拓扑,所有设备共享同一根电缆——就像老式电话总机,一根线被所有人共用。
这带来了一个问题:碰撞。两个设备同时发送数据,信号会撞在一起,都变成垃圾。
于是有了 CSMA/CD(载波侦听多路访问/碰撞检测):
- 载波侦听:发送前先听总线是否空闲
- 碰撞检测:发送时监测总线信号,发现碰撞立即停止
- 退避算法:碰撞后随机等待一段时间再重试
现代以太网基本用星型拓扑,通过交换机连接,碰撞域被隔离,每个端口独享带宽。但 CSMA/CD 的思想仍然影响了协议设计。
ARP 协议:IP 到 MAC 的桥梁
ARP(Address Resolution Protocol)用于根据 IP 地址找到对应的 MAC 地址。
为什么需要 ARP?
IP 地址工作在网络层,MAC 地址工作在数据链路层。发送数据时:
- 知道目标 IP,但不知道它的 MAC 地址
- 不知道 MAC 地址就无法封装以太网帧
- ARP 就是来解决这个「鸡生蛋、蛋生鸡」的问题
ARP 的工作流程
假设你的电脑(IP: 192.168.1.100)要发送数据给 192.168.1.200,但不知道它的 MAC 地址。
第一步:ARP 请求(广播)
┌─────────────────────────────────────────────────────────┐
│ 以太网帧(广播) │
│ 目的 MAC: FF:FF:FF:FF:FF:FF(广播地址) │
│ 源 MAC: 08:00:27:3B:59:D3(你自己的 MAC) │
│ 类型: 0x0806 (ARP) │
│ │
│ ARP 请求内容: │
│ "谁是 192.168.1.200?请告诉我你的 MAC 地址" │
└─────────────────────────────────────────────────────────┘
↓ 发送给同一局域网的所有设备第二步:ARP 响应(单播)
┌─────────────────────────────────────────────────────────┐
│ 以太网帧(单播) │
│ 目的 MAC: 08:00:27:3B:59:D3(请求方的 MAC) │
│ 源 MAC: AA:BB:CC:DD:EE:FF(目标设备的 MAC) │
│ 类型: 0x0806 (ARP) │
│ │
│ ARP 响应内容: │
│ "192.168.1.200 的 MAC 地址是 AA:BB:CC:DD:EE:FF" │
└─────────────────────────────────────────────────────────┘第三步:ARP 缓存
双方都会把对方的 IP-MAC 映射存入本地 ARP 缓存表,避免重复请求。查看 ARP 缓存
# Windows
arp -a
# Linux/Mac
arp -n
# 示例输出:
# ? (192.168.1.1) at 00:11:22:33:44:55 [ether] on eth0
# ? (192.168.1.200) at aa:bb:cc:dd:ee:ff [ether] on eth0ARP 缓存过期
ARP 缓存不是永久的,通常有 TTL(生存时间)。Windows 默认 20 分钟,Linux 默认 60 秒。
为什么要过期?因为设备可能换 IP、换网卡,甚至离开网络。缓存过期后重新 ARP 请求,保证数据发到正确设备。
ARP 欺骗:安全漏洞
ARP 协议设计时没有考虑安全性,这是它的致命缺陷。
ARP 欺骗原理:攻击者发送伪造的 ARP 响应,声称「目标 IP 的 MAC 是我的」,从而:
- 中间人攻击:截获双方通信
- 断网攻击:发送伪造的 ARP 让目标无法上网
- 会话劫持:偷取登录凭证
防御手段:
- 静态 ARP 绑定(手工添加可信映射)
- ARP 防火墙
- 交换机端口安全
- 检测 ARP 缓存异常
实际案例:同一局域网内的通信
场景:你和室友在同一 WiFi 下,你向他发送文件。
通信过程:
1. 你的电脑知道室友的 IP(比如 192.168.1.101)
2. 查询 ARP 缓存,找到了对应的 MAC 地址(假设 AA:BB:CC:DD:EE:FF)
3. 如果没找到,广播 ARP 请求,室友回复 ARP 响应
4. 你的电脑构造以太网帧:
- 目的 MAC: AA:BB:CC:DD:EE:FF
- 源 MAC: 08:00:27:3B:59:D3
- 类型: 0x0800 (IP)
- 数据: IP 数据报(包含 TCP/UDP 等上层数据)
5. 交换机根据 MAC 地址表转发到室友的端口
6. 室友的网卡收到帧,检查目的 MAC 是自己的,接收并交给上层处理整个过程不需要路由器,数据包直接通过交换机到达目标。
面试追问方向
- ARP 协议的工作原理是什么?为什么需要 ARP?
- ARP 缓存的作用是什么?为什么要有 TTL?
- MAC 地址和 IP 地址的区别和联系是什么?
- 什么是 ARP 欺骗?如何防御?
- 交换机和集线器的区别是什么?各工作在哪一层?
- 以太网帧的最大和最小长度是多少?为什么?
