以太网里真正搬运数据帧的是 MAC 地址,而应用层只知道 IP。ARP 的任务就是在本地广播域里把”下一跳的 IP”翻译成”下一跳的 MAC”,靠广播问询、单播应答完成,结果缓存在 ARP 表里复用。

为什么需要地址解析:IP 与 MAC 的分工

IP 地址是逻辑地址,负责跨网络的全局寻址,随设备接入位置而变化;MAC 地址是链路层地址,标识网卡接口,只在当前链路(广播域)内有意义。发送一个 IP 数据报时,网络层只关心”目的 IP 是谁”,但链路层封装帧时必须填上”下一跳的 MAC”——这个空缺就由 ARP 来补。

关键点是:ARP 解析的永远是下一跳,不是最终目的地。查路由表后发现目标同网段,就解析目标主机的 MAC;目标在外网,就解析默认网关的 MAC。之后每一跳路由器重新查表、重新封装链路层头部,MAC 逐跳改写,IP 全程不变。

请求与响应流程:广播问询,单播应答

以主机 A(192.168.1.10)要给同网段主机 B(192.168.1.20)发包、且缓存未命中为例:

A -- ARP Request(广播帧, 目的MAC=FF:FF:FF:FF:FF:FF) --> 网段内所有主机
"谁是 192.168.1.20?请告诉 192.168.1.10(我的 MAC)"
B -- ARP Reply(单播帧, 直接发给 A 的 MAC) ------------> A
"192.168.1.20 是我,我的 MAC 是 xx:xx:xx:xx:xx:xx"
  1. A 构造 ARP 请求,内含自己的 IP/MAC 和目标 IP,目标硬件地址填全零;外层以太网帧用广播地址发出。
  2. 网段内所有接口都收到该帧,各自比对目标 IP,不是自己的直接丢弃。
  3. B 确认问的是自己,顺手把 A 的 IP-MAC 映射写进自己的 ARP 表,再单播应答。
  4. A 收到应答写入缓存,随后正常封装数据帧单播发送。

广播帧只在当前广播域内消化,路由器不转发 ARP 广播,所以远端主机的 MAC 永远不会出现在你的 ARP 表里——跨网段时你看到的下一跳 MAC 一定是网关的。

ARP 缓存与老化

每条缓存是 <IP, MAC, TTL> 三元组,典型生命周期 20 分钟左右,期间被命中的条目会刷新计时。缓存的意义很直接:省掉每次发包前的广播。老化机制则应对 MAC 会变化的现实——设备换网卡、IP 被 DHCP 重新分配后,旧映射必须能过期重学。排查”能 ping 通网关但上不了网”这类问题,第一件事就是 arp -a 看网关 IP 对应的 MAC 是不是真网关。

ARP 欺骗与中间人攻击

ARP 设计于互相信任的小规模网络,没有任何认证:谁发应答就信谁,甚至没发过请求、主动送来的”应答”也照单写入缓存。攻击者利用这一点,周期性向局域网发送伪造应答:

  • 对受害者宣称”网关的 IP 在我这个 MAC 上”;
  • 对网关宣称”受害者的 IP 在我这个 MAC 上”。

双向欺骗完成后,受害者与网关之间的流量全部流经攻击者机器,形成中间人攻击:窃听明文、篡改内容,或直接丢包断网。防御手段包括:交换机端口做 IP-MAC 绑定与动态 ARP 检测(DAI)、关键设备配置静态 ARP 条目、以及用 HTTPS/SSH 这类加密协议兜底——即使流量被引走,内容也无法被解读。

免费 ARP 的用途

免费 ARP(Gratuitous ARP)是自问自答式的广播:主机主动声明”我是 192.168.1.20,我的 MAC 是 xx”,没人问也发。三个典型用途:

  1. IP 冲突检测:开机时声明一次,若有人应答说明地址撞车。
  2. 刷新邻居缓存:网卡更换、浮动 IP 漂移、VRRP 主备切换后主动广播,让全网旧映射立刻更新。
  3. 宣告存在:集群 failover 场景下让交换机和网关快速收敛到新节点。

实践要点

  • 常用命令:arp -a 看缓存,arp -d 删条目,arp -s 绑静态映射(重启失效)。
  • ARP 只存在于 IPv4;IPv6 用基于 ICMPv6 的邻居发现协议(NDP)完成同样的事。
  • 抓包时若看到大量源 MAC 一致的重复 ARP 应答,基本可以怀疑局域网内存在欺骗行为。

小结

  • IP 管全局寻址,MAC 管链路上一跳交付,ARP 负责两者翻译,解析对象永远是下一跳。
  • 流程是广播问询、单播应答;结果进 ARP 缓存,TTL 到期老化重学。
  • 协议无认证是原罪,伪造应答即可实现欺骗与中间人攻击,防御靠绑定、检测和上层加密。
  • 免费 ARP 用于冲突检测、主备切换和邻居缓存刷新。