引言
上一篇我们学习了IP地址,它是网络层的逻辑地址,用于跨网络寻址。
但你有没有想过一个问题:既然有了IP地址,为什么还需要MAC地址?
这是一个非常好的问题,涉及到网络分层设计的核心思想。
第一性原理:为什么需要两种地址?
问题场景
假设你要给朋友寄一封信:
方案1:只用身份证号
- 身份证号:320123199001011234
- 问题:❌ 无法投递(不知道地址在哪里)
方案2:只用门牌号
- 门牌号:XX街道XX号
- 问题:❌ 无法确认收件人身份
方案3:身份证号 + 门牌号
- 身份证号:确认收件人身份
- 门牌号:确认投递地址
- 结果:✅ 准确投递
类比理解
| 概念 | 现实世界 | 网络世界 |
|---|---|---|
| 身份标识 | 身份证号 | IP地址 |
| 位置标识 | 门牌号 | MAC地址 |
| 作用范围 | 全国唯一 | 全球唯一(IP) |
| 作用范围 | 本地唯一 | 本地唯一(MAC) |
| 是否变化 | 不变 | IP可变 |
| 是否变化 | 可变(搬家) | MAC不变 |
为什么需要两个地址?
IP地址(网络层):
- ✅ 全球唯一(公网IP)
- ✅ 可路由(根据前缀转发)
- ✅ 逻辑地址(可变,如DHCP分配)
- ❌ 无法直接传输(需要知道下一跳的物理地址)
MAC地址(数据链路层):
- ✅ 全球唯一(网卡出厂固化)
- ✅ 可直接传输(同一网段)
- ❌ 不可路由(平坦地址空间)
- ❌ 仅本地有效(跨路由器会被替换)
结论:
- IP地址:解决"要去哪里"的问题(目的地)
- MAC地址:解决"怎么去"的问题(下一跳)
- ARP协议:解决"IP → MAC"的映射问题
MAC地址详解
什么是MAC地址?
MAC(Media Access Control)地址:媒体访问控制地址,也叫物理地址或硬件地址。
格式:48位(6字节),通常用6对十六进制数表示
AA:BB:CC:DD:EE:FF
或
AA-BB-CC-DD-EE-FF
MAC地址结构
AA:BB:CC:DD:EE:FF
└─┬──┘ └────┬────┘
│ │
OUI NIC
厂商标识 网卡序列号
(24位) (24位)
OUI(Organizationally Unique Identifier):
- 前24位,由IEEE分配给厂商
- 例如:
- Apple:
00:03:93、00:0A:95 - Intel:
00:02:B3、00:1B:21 - Cisco:
00:01:42、00:06:2A
- Apple:
NIC(Network Interface Controller):
- 后24位,厂商自行分配
- 理论上可分配16,777,216个设备
MAC地址的特点
全球唯一
- 由IEEE统一管理和分配
- 网卡出厂时固化在ROM中
- 理论上全球没有两个相同的MAC地址
不可路由
- 平坦的地址空间(无层次结构)
- 路由器不转发MAC地址
- 只在同一网段(广播域)有效
可修改(软件层面)
- 虽然固化在网卡,但可以通过软件修改
- MAC地址欺骗(伪装成其他设备)
- 用于测试或绕过限制
查看MAC地址
macOS/Linux:
ifconfig en0
# 输出
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
ether aa:bb:cc:dd:ee:ff
# 或使用
ip link show
Windows:
ipconfig /all
# 输出
物理地址 . . . . . . . . . : AA-BB-CC-DD-EE-FF
特殊MAC地址
FF:FF:FF:FF:FF:FF # 广播地址(发送给所有设备)
01:00:5E:xx:xx:xx # IPv4多播地址
33:33:xx:xx:xx:xx # IPv6多播地址
00:00:00:00:00:00 # 无效地址
ARP协议:IP → MAC的桥梁
为什么需要ARP?
问题:
- 网络层使用IP地址通信
- 数据链路层使用MAC地址传输
- 如何从IP地址找到对应的MAC地址?
解决方案:ARP(Address Resolution Protocol)地址解析协议
ARP工作原理
场景
假设主机A(192.168.1.100)要访问主机B(192.168.1.200),在同一网段。
步骤1:检查ARP缓存
主机A先检查ARP缓存表:
arp -a
# 输出示例
Internet地址 物理地址 类型
192.168.1.1 aa:bb:cc:dd:ee:ff 动态
192.168.1.200 11:22:33:44:55:66 动态
如果缓存中有192.168.1.200的MAC地址,直接使用;否则发送ARP请求。
步骤2:发送ARP请求(广播)
ARP请求(Broadcast):
┌────────────────────────────────┐
│ 以太网帧头: │
│ 目标MAC:FF:FF:FF:FF:FF:FF │ 广播
│ 源MAC:aa:bb:cc:dd:ee:ff │ 主机A
├────────────────────────────────┤
│ ARP请求内容: │
│ 操作码:1(请求) │
│ 发送方MAC:aa:bb:cc:dd:ee:ff │
│ 发送方IP:192.168.1.100 │
│ 目标MAC:00:00:00:00:00:00 │ 未知
│ 目标IP:192.168.1.200 │
└────────────────────────────────┘
广播到局域网所有设备:
- 交换机会将此帧转发到所有端口
- 所有设备都会接收到此ARP请求
- 但只有目标IP(192.168.1.200)会响应
步骤3:目标主机B响应(单播)
主机B收到ARP请求后,发送ARP响应:
ARP响应(Unicast):
┌────────────────────────────────┐
│ 以太网帧头: │
│ 目标MAC:aa:bb:cc:dd:ee:ff │ 主机A
│ 源MAC:11:22:33:44:55:66 │ 主机B
├────────────────────────────────┤
│ ARP响应内容: │
│ 操作码:2(响应) │
│ 发送方MAC:11:22:33:44:55:66 │ 主机B的MAC
│ 发送方IP:192.168.1.200 │
│ 目标MAC:aa:bb:cc:dd:ee:ff │
│ 目标IP:192.168.1.100 │
└────────────────────────────────┘
单播:直接发送给主机A,不广播。
步骤4:更新ARP缓存
主机A收到ARP响应后,更新ARP缓存表:
192.168.1.200 → 11:22:33:44:55:66
缓存默认保存时间:几分钟到几小时(根据操作系统不同)。
完整流程图
主机A 主机B
(192.168.1.100) (192.168.1.200)
│ │
│──── ARP Request (Broadcast) │
│ "谁是192.168.1.200?" │
│ 目标MAC:FF:FF:FF:FF:FF:FF │
│────────────────────────────>│
│ │
│ 检查IP是否匹配
│ 是!准备响应
│ │
│<──── ARP Reply (Unicast) ───│
│ "我是192.168.1.200" │
│ 我的MAC是11:22:33:44:55:66 │
│ │
更新ARP缓存:
192.168.1.200 → 11:22:33:44:55:66
│ │
│──── 数据包(使用MAC地址) ──>│
ARP缓存管理
查看ARP缓存:
# macOS/Linux
arp -a
# Windows
arp -a
# 查看特定IP
arp -a 192.168.1.1
删除ARP缓存:
# macOS/Linux
sudo arp -d 192.168.1.100 # 删除特定条目
sudo arp -a -d # 删除全部(macOS)
# Windows
arp -d 192.168.1.100 # 删除特定条目
arp -d * # 删除全部
添加静态ARP:
# macOS/Linux
sudo arp -s 192.168.1.100 aa:bb:cc:dd:ee:ff
# Windows
arp -s 192.168.1.100 aa-bb-cc-dd-ee-ff
免费ARP(Gratuitous ARP)
定义:主机发送ARP请求查询自己的IP地址。
用途:
- 检测IP冲突:如果有响应,说明IP被占用
- 更新ARP缓存:当MAC地址变更时通知其他设备
- 主动通告:新设备加入网络时
示例:
ARP请求:
发送方IP:192.168.1.100
目标IP:192.168.1.100(自己的IP)
ARP欺骗攻击
什么是ARP欺骗?
攻击者伪造ARP响应,将受害者的流量重定向到攻击者。
攻击过程
正常情况:
主机A → 网关 → 互联网
ARP欺骗后:
主机A → 攻击者 → 网关 → 互联网
↓
窃听/篡改
攻击步骤
攻击者发送伪造ARP响应:
"网关(192.168.1.1)的MAC地址是我(攻击者)的MAC"受害者更新ARP缓存:
192.168.1.1 → 攻击者的MAC(错误)受害者发送数据包:
- 目标IP:互联网某个IP
- 目标MAC:攻击者的MAC(原本应该是网关MAC)
- 数据包被发送到攻击者
攻击者转发数据包:
- 窃听/篡改数据
- 转发到真正的网关(避免被发现)
防护措施
静态ARP绑定:
sudo arp -s 192.168.1.1 aa:bb:cc:dd:ee:ffARP防火墙:
- 监控ARP流量
- 检测异常ARP响应
交换机端口安全:
- 绑定端口和MAC地址
- 限制每个端口的MAC地址数量
动态ARP检测(DAI):
- 交换机验证ARP数据包
- 丢弃伪造的ARP响应
RARP:MAC → IP
什么是RARP?
RARP(Reverse ARP):反向地址解析协议,从MAC地址获取IP地址。
用途
早期无盘工作站启动时:
- 网卡固化MAC地址
- 不知道自己的IP地址
- 发送RARP请求:“我的MAC是XX,我的IP是多少?”
- RARP服务器响应:“你的IP是YY”
现状
已被DHCP取代,很少使用。
实战案例
案例1:查看ARP缓存
arp -a
# 输出
? (192.168.1.1) at aa:bb:cc:dd:ee:ff on en0 ifscope [ethernet]
? (192.168.1.100) at 11:22:33:44:55:66 on en0 ifscope [ethernet]
? (192.168.1.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
解读:
- 192.168.1.1(网关)MAC:aa:bb:cc:dd:ee:ff
- 192.168.1.100(某设备)MAC:11:22:33:44:55:66
- 192.168.1.255(广播地址)MAC:ff:ff:ff:ff:ff:ff
案例2:ARP缓存失效导致网络不通
现象:突然无法访问某台服务器。
排查:
# 1. ping测试
ping 192.168.1.200
# 无响应
# 2. 查看ARP缓存
arp -a | grep 192.168.1.200
# 没有条目,或MAC地址错误
# 3. 清除ARP缓存
sudo arp -d 192.168.1.200
# 4. 重新ping
ping 192.168.1.200
# 正常(ARP会自动重新解析)
案例3:检测ARP欺骗
方法1:检查ARP缓存
arp -a | grep 192.168.1.1
# 如果网关MAC地址频繁变化,可能被攻击
方法2:使用arp-scan
# 安装
brew install arp-scan # macOS
sudo apt install arp-scan # Linux
# 扫描网络
sudo arp-scan --interface=en0 --localnet
# 输出
192.168.1.1 aa:bb:cc:dd:ee:ff TP-LINK
192.168.1.100 11:22:33:44:55:66 Apple
192.168.1.200 22:33:44:55:66:77 Dell
检查:
- 如果同一IP有多个MAC地址,可能被攻击
- 如果MAC地址与设备厂商不符,可能被伪造
跨路由器的通信
关键问题
MAC地址只在同一网段有效,跨路由器会被替换!
示例
主机A 路由器1 路由器2 主机B
192.168.1.100 WAN: 123.45.67.89 WAN: 223.45.67.89 93.184.216.34
MAC: AA:AA:AA:AA:AA:AA LAN: 192.168.1.1 LAN: 10.0.0.1 MAC: FF:FF:FF:FF:FF:FF
MAC: BB:BB:BB:BB:BB:BB MAC: EE:EE:EE:EE:EE:EE
数据包旅程:
主机A发送:
- 目标IP:93.184.216.34(主机B)
- 目标MAC:BB:BB:BB:BB:BB:BB(路由器1的LAN口)
路由器1转发:
- 去掉以太网头尾
- 查看IP目标地址
- 查找路由表
- 重新封装:
- 目标IP:93.184.216.34(不变)
- 目标MAC:下一跳路由器的MAC(变化!)
经过多个路由器:
- 每个路由器都会替换MAC地址
- IP地址始终不变(除非经过NAT)
到达主机B:
- 目标IP:93.184.216.34(始终不变)
- 目标MAC:FF:FF:FF:FF:FF:FF(主机B的MAC)
总结
核心要点
MAC地址的本质
- 48位物理地址,全球唯一
- 固化在网卡ROM中
- 只在同一网段有效
- 不可路由
为什么需要两个地址?
- IP地址:逻辑地址,可路由,全局寻址
- MAC地址:物理地址,本地传输
- 两者配合,完成端到端通信
ARP协议
- 实现IP → MAC的映射
- 广播请求,单播响应
- 缓存机制提高效率
- 存在安全隐患(ARP欺骗)
跨路由器通信
- MAC地址每经过一个路由器就会被替换
- IP地址保持不变(端到端)
- 这就是分层设计的优势
第一阶段总结
恭喜你完成了第一阶段!现在你已经掌握了:
- ✅ 网络的本质和价值
- ✅ OSI七层模型和TCP/IP四层模型
- ✅ 数据包的传输过程
- ✅ IP地址和子网划分
- ✅ MAC地址和ARP协议
你已经建立了完整的网络基础知识框架!
下一阶段预告
第二阶段我们将深入学习传输层协议,重点是TCP和UDP,包括:
- 传输层的核心使命
- TCP三次握手
- TCP四次挥手
- TCP流量控制
- TCP拥塞控制
- TCP重传机制
- UDP协议原理
- TCP与UDP的选择策略
这些是理解网络通信最核心的知识!
思考题:
- 为什么MAC地址不能用于路由?
- 如果网络中有两台设备MAC地址相同会怎样?
- 为什么跨路由器通信时MAC地址会变化,但IP地址不变?
欢迎在评论区分享你的思考!