ARP:把 IP 地址翻译成 MAC 地址
以太网设备在同一个二层网络里实际靠 MAC 地址(物理地址) 投递帧,但应用和 IP 层用的是 IP 地址。ARP(Address Resolution Protocol,地址解析协议,RFC 826) 负责在本地网段把"下一跳的 IPv4 地址"解析成"它的 MAC 地址",IP 包才能被封装成以太帧发出去。
一、解析过程:广播问、单播答
主机 A(10.0.0.1)要给同网段 B(10.0.0.2)发数据,但不知道 B 的 MAC:
A -> 广播(ff:ff:ff:ff:ff:ff):ARP Request
"谁是 10.0.0.2?请把你的 MAC 告诉我,我是 10.0.0.1,MAC aa:aa:aa:aa:aa:aa"
(同网段所有主机都收到,只有 10.0.0.2 应答)
B -> 单播给 A:ARP Reply
"10.0.0.2 的 MAC 是 bb:bb:bb:bb:bb:bb"
A 把这条映射写入 ARP 缓存,后续直接封装发往 B- 请求是二层广播(目的 MAC 全 f),应答是单播。
- 拿到映射后缓存一段时间(Linux 通常 base_reachable_time 约 30s 级别,并经状态机确认),避免每个包都广播。
二、跨网段:解析的是网关,不是目标主机
关键细节:ARP 只解析同一广播域内、下一跳的地址。访问外网/跨网段时:
- A 查路由,发现目标不在本网段,应发给默认网关。
- A 用 ARP 解析的是网关接口的 MAC,而不是远端服务器的 MAC。
- 以太帧目的 MAC 填网关 MAC(帧每跳重写),IP 头目的地址始终是最终目标(IP 端到端不变)。
"ping 不通时抓包看到在问网关 MAC"是正常现象;NAT/路由器再逐跳解析下一跳,见 NAT。
三、ARP 缓存的状态与命令
ip neigh # 查看邻居表(现代推荐),含状态
ip neigh show dev eth0
sudo ip neigh add 10.0.0.2 lladdr bb:bb:bb:bb:bb:bb dev eth0 nud permanent # 静态绑定
sudo ip neigh flush all
arp -n # net-tools 老命令,等价查看Linux 邻居项有状态机:REACHABLE(刚确认可达)、STALE(过期但暂可用)、DELAY/PROBE(重新探测中)、FAILED、PERMANENT(静态)。"能 ping 通但偶发首包慢/解析失败"常与 STALE→PROBE 的重新解析有关。
四、几个重要变体
| 类型 | 作用 |
|---|---|
| 免费 ARP(Gratuitous ARP) | 主机主动广播"我的 IP 对应这个 MAC",常用于 IP 漂移/VRRP 切换、网卡更换后更新别人的缓存、检测 IP 冲突 |
| 代理 ARP(Proxy ARP) | 路由器替别的主机应答 ARP,让发起方误以为目标在本地(某些 VPN/特殊组网用) |
| RARP | 反向:已知 MAC 求 IP(早期无盘启动,现多用 DHCP) |
| ARP probe/announce | RFC 5227,启用 IP 前探测地址冲突(IPv4 ACD) |
五、ARP 欺骗与防护
ARP 本身不做认证:任何主机都能发 ARP Reply 声称"网关 IP 的 MAC 是我",其他主机会更新缓存,于是流量被引到攻击者(ARP 欺骗/ARP 投毒,中间人攻击),可窃听或篡改同网段流量。
防护手段:
- 交换机/网关上做 IP+MAC+端口静态绑定(DAI,Dynamic ARP Inspection)、DHCP Snooping。
- 主机上对关键地址(网关)配置静态 ARP(
ip neigh ... nud permanent)。 - 用加密通道(HTTPS/TLS、VPN)让被劫持也无法读改内容。
- 监控异常的大量 ARP 广播/映射频繁变化。
IPv6 不再用 ARP,对应功能由 NDP(Neighbor Discovery Protocol) 基于 ICMPv6(NS/NA 报文)实现,并用 SEND/CGA 等加强安全。
相关阅读
连通性与路径见 ICMP、ping/mtr,跨网段地址转换见 NAT,查看邻居表用 ip,抓 ARP 用 tcpdump
arp。
总结
ARP 在同一二层网段用"广播请求谁是某 IP、目标单播应答我的 MAC"把下一跳 IPv4 解析成 MAC 并缓存;跨网段时解析的是网关 MAC(帧逐跳改写、IP 端到端不变);免费 ARP 用于 IP 漂移与冲突检测,而 ARP 无认证会被投毒做中间人,需 DAI/静态绑定/加密防护,IPv6 则由 ICMPv6 的 NDP 取代。