Skip to content

以太网、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(载波侦听多路访问/碰撞检测):

  1. 载波侦听:发送前先听总线是否空闲
  2. 碰撞检测:发送时监测总线信号,发现碰撞立即停止
  3. 退避算法:碰撞后随机等待一段时间再重试

现代以太网基本用星型拓扑,通过交换机连接,碰撞域被隔离,每个端口独享带宽。但 CSMA/CD 的思想仍然影响了协议设计。

ARP 协议:IP 到 MAC 的桥梁

ARP(Address Resolution Protocol)用于根据 IP 地址找到对应的 MAC 地址

为什么需要 ARP?

IP 地址工作在网络层,MAC 地址工作在数据链路层。发送数据时:

  1. 知道目标 IP,但不知道它的 MAC 地址
  2. 不知道 MAC 地址就无法封装以太网帧
  3. 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 缓存

bash
# 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 eth0

ARP 缓存过期

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 欺骗?如何防御?
  • 交换机和集线器的区别是什么?各工作在哪一层?
  • 以太网帧的最大和最小长度是多少?为什么?

基于 VitePress 构建