进阶 #network#arp#protocol

ARP 协议

ARP(Address Resolution Protocol)把 IP 地址解析为 MAC 地址——当你知道对方的 IP 地址,但不知道它在哪台交换机端口时,ARP 帮你"喊一声"找到它

我有你的”门牌号”,但不知道你的”工位号”

在局域网里通信,你需要同时知道两样东西:

  • IP 地址:逻辑地址,就像”华南理工大学五山校区 33 号楼 302 室”
  • MAC 地址:物理地址,就像你的工位编号”A 区 3 排 5 号”

IP 地址告诉你目标在哪个网段,但数据最终要通过交换机转发——交换机只知道 MAC 地址在哪个端口。

问题来了:你知道对方的 IP(192.168.1.2),但不知道它的 MAC 地址——怎么把数据发过去?

🏫 类比:学校快递站

快递单上写了收件人姓名(IP 地址):“张三” 快递站有几千个包裹——每个包裹上还有一个取件码(MAC 地址) 你得先查一下:张三的取件码是什么?

于是你在快递站的群里发了一条消息:“张三同学,你的取件码是多少?” 张三回复了:“我是张三,我的取件码是 A3-502。” 现在你知道了,直接把包裹放在 A3-502 的架子上。

这就是 ARP 的工作方式!

ARP 的工作流程——喊一声,等人回

你的电脑 A(192.168.1.1)想发给 B(192.168.1.2)

Step 1:A 查自己的 ARP 缓存
┌─────────────────┬──────────────────┐
│ IP              │ MAC              │
├─────────────────┼──────────────────┤
│ 192.168.1.1     │ AA:AA:AA:AA:AA   │ ← 自己
│ 192.168.1.2     │ ???              │ ← 没有 B 的 MAC!
└─────────────────┴──────────────────┘

Step 2:A 发送 ARP 请求(广播)
  目标 MAC = FF:FF:FF:FF:FF:FF(广播地址)
  "Who has 192.168.1.2? Tell 192.168.1.1"

Step 3:所有设备都收到这个广播,但只有 B 回复

Step 4:B 发送 ARP 回复(单播——直接发给 A)
  "I am 192.168.1.2, my MAC is BB:BB:BB:BB:BB"

Step 5:A 收到后更新 ARP 缓存,下次直接查表
┌─────────────────┬──────────────────┐
│ 192.168.1.2     │ BB:BB:BB:BB:BB   │ ← 记下来了!
└─────────────────┴──────────────────┘

Step 6:A 现在可以构造完整的以太网帧了:
  ┌──────────┬──────────────┬──────────────┐
  │ 目标 MAC  │ 源 MAC       │ 数据(IP 包) │
  ├──────────┼──────────────┼──────────────┤
  │ BB:BB:BB │ AA:AA:AA     │ …            │
  └──────────┴──────────────┴──────────────┘

💡 ARP 请求是广播(发给所有人),ARP 回复是单播(只发给询问者)。为什么回复不是广播?因为回复里已经有 MAC 地址了,不需要再打扰其他人。

ARP 缓存——别每次都喊

每次通信前先广播一下——太慢了。ARP 会把刚学到的 IP↔MAC 映射缓存起来:

# 查看你的 ARP 缓存
$ arp -a
? (192.168.1.1) at aa:aa:aa:aa:aa:aa on en0 [ethernet]
? (192.168.1.2) at bb:bb:bb:bb:bb:bb on en0 [ethernet]
? (192.168.1.254) at cc:cc:cc:cc:cc:cc on en0 [ethernet]

缓存有效期: 通常 20 分钟。过期后要重新 ARP 查询。

为什么不是永久有效?因为设备可能换了网卡(MAC 变了)或者移到别的交换机端口上了。

# 如果网络出问题了,可以清空 ARP 缓存重试
$ arp -d 192.168.1.2   # 删除特定条目
$ arp -a               # 查看还剩下什么

ARP——你的电脑用它来找到”出口”

你每次访问互联网,电脑都要把数据发给网关(通常是路由器)。但你是怎么知道网关的 MAC 地址的?

没错——ARP。你电脑知道网关的 IP(通常是 192.168.1.1),但需要通过 ARP 找到它对应的 MAC 地址。

# 你也看不到这个流程——但它确实在发生
ping baidu.com
# ① DNS 查询 baidu.com 的 IP(走 UDP 53)
# ② 发现目标 IP 不在本地网段 → 发给默认网关
# ③ ARP 查询:网关 192.168.1.1 的 MAC 是什么?
# ④ 网关回复 MAC → 数据发出

ARP 欺骗——没有认证的协议是危险的

ARP 协议在设计时没有考虑安全性——任何设备都可以回复 ARP 请求,即使那个 IP 不是自己的。

攻击场景:女生宿舍的"中间人"(假设所有人都在同一局域网)

攻击者电脑(192.168.1.99)做的一件坏事:
  发送伪造的 ARP 回复:
  "我是 192.168.1.1(网关),我的 MAC 是 EE:EE:EE:EE:EE"
  (实际上网关的 MAC 是 GG:GG:GG:GG:GG)

受害者 A 的 ARP 缓存被污染了:
┌─────────────────┬──────────────────┐
│ 192.168.1.1     │ EE:EE:EE:EE:EE   │ ← 攻击者的 MAC!
│(应该是网关的)  │(应该是 GG:GG:GG)│
└─────────────────┴──────────────────┘

后果:A 发给网关的所有数据 → 先到攻击者电脑 → 攻击者"查看"后再转发给真网关
这就是 ARP 欺骗导致的「中间人攻击」。

防御措施:

方法说明
静态 ARP手动绑定 IP 和 MAC,永不广播查询
DAI(Dynamic ARP Inspection)交换机检查 ARP 包合法性
加密通信HTTPS——即使被抓到数据也看不懂

小结

概念要点一句话
ARP 作用IP 地址 → MAC 地址的解析”你的 MAC 是啥?“
ARP 请求广播,FF:FF:FF:FF:FF:FF满楼喊一声
ARP 回复单播,告诉询问者自己的 MAC私下回一句
ARP 缓存减少广播次数,20 分钟过期记在小本本上
ARP 欺骗伪造 ARP 回复劫持流量冒充网关

为什么先学这个? ARP 是 IP 层和链路层之间的”翻译员”——有了它,IP 包才能装进以太网帧里发送出去。下一节看看IP 协议与 IPv4 地址——互联网的”真正主角”。