ARP 协议:地址解析的幕后英雄
系列文章:这是网络协议系列的第 8 篇,前 7 篇已覆盖 HTTP、HTTPS、TCP、UDP、IP、IPv6 和 ICMP。本文深入链路层,探索 ARP 协议如何完成 IP 地址到 MAC 地址的映射。
一、为什么需要 ARP?
想象你寄快递:知道收件人的门牌号(IP 地址),但快递员最终需要找到具体的房子(MAC 地址)才能送达。ARP(Address Resolution Protocol,地址解析协议)就是网络世界的"地址翻译官"——把逻辑 IP 地址映射为物理 MAC 地址。
在以太网中,数据帧的实际传输依赖 MAC 地址。当你的设备需要与局域网内的另一台设备通信时,ARP 就是那个不可或缺的中间人。
二、ARP 的工作原理
2.1 基本流程
ARP 的工作过程简单直接,分为两个核心步骤:
- ARP 请求(广播):主机 A 想知道 IP 为 192.168.1.10 的设备 MAC 地址,于是在局域网内广播:"谁是 192.168.1.10?告诉我你的 MAC 地址!"
- ARP 响应(单播):目标主机 B 收到请求后,单播回复:"我是 192.168.1.10,我的 MAC 是 AA:BB:CC:DD:EE:FF"
2.2 报文格式
| 字段 | 长度 | 说明 |
|---|---|---|
| 硬件类型 | 2 字节 | 以太网值为 1 |
| 协议类型 | 2 字节 | IPv4 为 0x0800 |
| 硬件地址长度 | 1 字节 | MAC 地址长度 = 6 |
| 协议地址长度 | 1 字节 | IPv4 地址长度 = 4 |
| 操作码 | 2 字节 | 1=请求,2=响应 |
| 发送方 MAC | 6 字节 | 请求者的 MAC |
| 发送方 IP | 4 字节 | 请求者的 IP |
| 目标 MAC | 6 字节 | 请求时填 0 |
| 目标 IP | 4 字节 | 要查询的 IP |
2.3 ARP 缓存
为了避免频繁广播,操作系统会维护一张 ARP 缓存表:
# Linux/macOS 查看 ARP 缓存
$ arp -a
? (192.168.1.1) at aa:bb:cc:dd:ee:ff on en0
? (192.168.1.105) at 11:22:33:44:55:66 on en0
# Windows
> arp -a
Interface: 192.168.1.100 --- 0x12
Internet Address Physical Address Type
192.168.1.1 aa-bb-cc-dd-ee-ff dynamic
192.168.1.105 11-22-33-44-55-66 dynamic
缓存条目有生存时间(通常几分钟到几小时),过期后需要重新 ARP 查询。
三、ARP 的变种
3.1 代理 ARP(Proxy ARP)
路由器代替其他主机响应 ARP 请求,常用于:
- 不同子网间的通信
- 没有配置默认网关的老旧设备
- 某些 VPN 场景
3.2 无偿 ARP(Gratuitous ARP)
主机主动广播自己的 IP 和 MAC 映射,不期待回复。用途:
- IP 冲突检测:刚配置 IP 时广播,如果有人回复说明 IP 已被占用
- 更新 ARP 缓存:更换网卡后通知局域网更新缓存
- HA 切换:主备切换时快速更新 MAC 映射
3.3 RARP(反向 ARP)
与 ARP 相反,已知 MAC 地址查询 IP 地址。已被 DHCP 取代,基本淘汰。
四、ARP 的安全问题
4.1 ARP 欺骗(ARP Spoofing)
由于 ARP 没有认证机制,攻击者可以伪造 ARP 响应:
攻击者告诉主机 A:"192.168.1.1 的 MAC 是我"
攻击者告诉网关:"192.168.1.100 的 MAC 是我"
→ 流量全部经过攻击者(中间人攻击)
防御措施:
- 静态 ARP 绑定:关键设备绑定静态 ARP 条目
- 动态 ARP 检测(DAI):交换机验证 ARP 报文合法性
- ARP 防火墙:检测异常的 ARP 流量
4.2 常见攻击工具
- Ettercap:经典的中间人攻击框架
- arpspoof(dsniff 套件):简单的 ARP 欺骗工具
- BetterCAP:现代化的网络攻击和监控框架
五、ARP 与网络分层
应用层 HTTP/HTTPS/FTP/DNS...
传输层 TCP/UDP
网络层 IP/ICMP/IGMP
链路层 ARP ← 就在这里!
物理层 以太网/Wi-Fi
有趣的是,ARP 虽然工作在链路层,但它直接为网络层(IP)服务,可以说是"跨层"协议。
六、IPv6 时代的替代者:NDP
ARP 是为 IPv4 设计的。IPv6 不再使用 ARP,而是用 NDP(Neighbor Discovery Protocol,邻居发现协议),它是 ICMPv6 的一部分,功能更强大:
| 功能 | ARP (IPv4) | NDP (IPv6) |
|---|---|---|
| 地址解析 | ARP 请求/响应 | 邻居请求/通告 |
| 路由器发现 | DHCP 或静态配置 | 路由器请求/通告 |
| 重复地址检测 | 无偿 ARP | 邻居请求 |
| 重定向 | ICMP 重定向 | ICMPv6 重定向 |
七、实战:抓包分析 ARP
使用 Wireshark 或 tcpdump 抓包:
# 只抓 ARP 包
$ sudo tcpdump -i eth0 arp
# 输出示例
ARP, Request who-has 192.168.1.1 tell 192.168.1.100, length 28
ARP, Reply 192.168.1.1 is-at aa:bb:cc:dd:ee:ff, length 28
Wireshark 中过滤 ARP 包:直接在过滤器输入 arp
八、总结
| 特性 | 说明 |
|---|---|
| 全称 | Address Resolution Protocol |
| 工作层级 | 链路层(为网络层服务) |
| 核心功能 | IP 地址 → MAC 地址映射 |
| 通信方式 | 请求广播,响应单播 |
| 安全问题 | ARP 欺骗(无认证机制) |
| IPv6 替代 | NDP(邻居发现协议) |
ARP 是网络通信中最基础却最容易被忽视的协议之一。没有它,IP 数据包根本无法在局域网内送达。理解 ARP,就是理解网络数据包"最后一公里"的投递过程。
📚 系列索引