引言

上一篇我们学习了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:9300:0A:95
    • Intel:00:02:B300:1B:21
    • Cisco:00:01:4200:06:2A

NIC(Network Interface Controller)

  • 后24位,厂商自行分配
  • 理论上可分配16,777,216个设备

MAC地址的特点

  1. 全球唯一

    • 由IEEE统一管理和分配
    • 网卡出厂时固化在ROM中
    • 理论上全球没有两个相同的MAC地址
  2. 不可路由

    • 平坦的地址空间(无层次结构)
    • 路由器不转发MAC地址
    • 只在同一网段(广播域)有效
  3. 可修改(软件层面)

    • 虽然固化在网卡,但可以通过软件修改
    • 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地址。

用途

  1. 检测IP冲突:如果有响应,说明IP被占用
  2. 更新ARP缓存:当MAC地址变更时通知其他设备
  3. 主动通告:新设备加入网络时

示例

ARP请求:
发送方IP:192.168.1.100
目标IP:192.168.1.100(自己的IP)

ARP欺骗攻击

什么是ARP欺骗?

攻击者伪造ARP响应,将受害者的流量重定向到攻击者。

攻击过程

正常情况:
主机A → 网关 → 互联网

ARP欺骗后:
主机A → 攻击者 → 网关 → 互联网
          ↓
      窃听/篡改

攻击步骤

  1. 攻击者发送伪造ARP响应

    "网关(192.168.1.1)的MAC地址是我(攻击者)的MAC"
    
  2. 受害者更新ARP缓存

    192.168.1.1 → 攻击者的MAC(错误)
    
  3. 受害者发送数据包

    • 目标IP:互联网某个IP
    • 目标MAC:攻击者的MAC(原本应该是网关MAC)
    • 数据包被发送到攻击者
  4. 攻击者转发数据包

    • 窃听/篡改数据
    • 转发到真正的网关(避免被发现)

防护措施

  1. 静态ARP绑定

    sudo arp -s 192.168.1.1 aa:bb:cc:dd:ee:ff
    
  2. ARP防火墙

    • 监控ARP流量
    • 检测异常ARP响应
  3. 交换机端口安全

    • 绑定端口和MAC地址
    • 限制每个端口的MAC地址数量
  4. 动态ARP检测(DAI)

    • 交换机验证ARP数据包
    • 丢弃伪造的ARP响应

RARP:MAC → IP

什么是RARP?

RARP(Reverse ARP):反向地址解析协议,从MAC地址获取IP地址。

用途

早期无盘工作站启动时:

  1. 网卡固化MAC地址
  2. 不知道自己的IP地址
  3. 发送RARP请求:“我的MAC是XX,我的IP是多少?”
  4. 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

数据包旅程

  1. 主机A发送

    • 目标IP:93.184.216.34(主机B)
    • 目标MAC:BB:BB:BB:BB:BB:BB(路由器1的LAN口)
  2. 路由器1转发

    • 去掉以太网头尾
    • 查看IP目标地址
    • 查找路由表
    • 重新封装:
      • 目标IP:93.184.216.34(不变)
      • 目标MAC:下一跳路由器的MAC(变化!)
  3. 经过多个路由器

    • 每个路由器都会替换MAC地址
    • IP地址始终不变(除非经过NAT)
  4. 到达主机B

    • 目标IP:93.184.216.34(始终不变)
    • 目标MAC:FF:FF:FF:FF:FF:FF(主机B的MAC)

总结

核心要点

  1. MAC地址的本质

    • 48位物理地址,全球唯一
    • 固化在网卡ROM中
    • 只在同一网段有效
    • 不可路由
  2. 为什么需要两个地址?

    • IP地址:逻辑地址,可路由,全局寻址
    • MAC地址:物理地址,本地传输
    • 两者配合,完成端到端通信
  3. ARP协议

    • 实现IP → MAC的映射
    • 广播请求,单播响应
    • 缓存机制提高效率
    • 存在安全隐患(ARP欺骗)
  4. 跨路由器通信

    • MAC地址每经过一个路由器就会被替换
    • IP地址保持不变(端到端)
    • 这就是分层设计的优势

第一阶段总结

恭喜你完成了第一阶段!现在你已经掌握了:

  • ✅ 网络的本质和价值
  • ✅ OSI七层模型和TCP/IP四层模型
  • ✅ 数据包的传输过程
  • ✅ IP地址和子网划分
  • ✅ MAC地址和ARP协议

你已经建立了完整的网络基础知识框架!

下一阶段预告

第二阶段我们将深入学习传输层协议,重点是TCP和UDP,包括:

  • 传输层的核心使命
  • TCP三次握手
  • TCP四次挥手
  • TCP流量控制
  • TCP拥塞控制
  • TCP重传机制
  • UDP协议原理
  • TCP与UDP的选择策略

这些是理解网络通信最核心的知识!


思考题

  1. 为什么MAC地址不能用于路由?
  2. 如果网络中有两台设备MAC地址相同会怎样?
  3. 为什么跨路由器通信时MAC地址会变化,但IP地址不变?

欢迎在评论区分享你的思考!