ARP 协议如何在一个以太网局域网中将 IP 映射为 MAC。
它的本质是:**在同一个二层网络(局域网)中,设备只知道目标 IP 地址,但不知道对应的物理硬件地址(MAC)。ARP (Address Resolution Protocol) 通过“大声询问 (Who has IP X?)”和“私下回答 (IP X is at MAC Y)”的方式,建立 IP 到 MAC 的动态映射表。这是一种基于信任的、无状态的、广播式的服务发现协议。
如果把局域网比作一个大型开放式办公室:
- IP 地址:是员工的姓名/工号(逻辑标识,容易变,用于高层沟通)。
- MAC 地址:是员工的工位坐标/指纹(物理标识,固化在网卡上,用于底层投递)。
- 交换机:是前台/邮差,只认工位坐标(MAC),不认姓名(IP)。
- 场景:你想给“张三 (192.168.1.100)”送文件。
- 查通讯录 (ARP Cache):你先翻自己的小本子,看有没有记过张三的工位。有?直接送过去。
- 没有记录:你站起来,对着整个办公室大喊:“谁是 192.168.1.100?请告诉你的工位号!” (ARP Request - 广播)
- 其他人:听到名字不是自己,忽略。
- 张三:听到喊自己,站起来回答:“我是 192.168.1.100,我的工位是 AA-BB-CC-DD-EE-FF。” (ARP Reply - 单播)
- 记录:你把“192.168.1.100 -> AA-BB-CC-DD-EE-FF”记在小本子上。下次直接送,不用喊了。
- 旁听者:办公室里其他人也听到了张三的回答,顺便也记下了张三的工位,方便以后找他。
- 核心逻辑:先查缓存,查不到就广播问,问到就存起来。用一次广播换取后续的静默高效通信。
一、工作流程:四步走
Step 1: 检查 ARP 缓存 (Cache Lookup)
- 动作:当主机 A (192.168.1.10) 想发送数据给主机 B (192.168.1.20) 时,操作系统内核首先检查本地的ARP Table。
- 命中:如果找到 B 的 MAC,直接封装以太网帧发送。
- 未命中:进入 Step 2。
Step 2: 发送 ARP 请求 (ARP Request)
- 类型:广播 (Broadcast)。
- 目标 MAC:
FF:FF:FF:FF:FF:FF(全 F,表示发给所有人)。 - 内容:
- “Sender IP: 192.168.1.10, Sender MAC: AA:AA:AA:AA:AA:AA”
- “Target IP: 192.168.1.20, Target MAC: ??”
- 传播:交换机收到广播帧,会将其泛洪 (Flood)到除接收端口外的所有端口。局域网内所有活跃主机都会收到这个包。
Step 3: 接收与响应 (ARP Reply)
- 非目标主机:对比 Target IP,发现不是自己,丢弃该包。
- 目标主机 (B):
- 识别出 Target IP 是自己。
- 学习:将 A 的 IP-MAC 映射存入自己的 ARP 缓存(因为 A 主动告诉了 B 它的 MAC)。
- 响应:构造一个ARP Reply包。
- 类型:单播 (Unicast)。
- 目标 MAC:A 的 MAC (
AA:AA:AA:AA:AA:AA)。 - 内容:“Sender IP: 192.168.1.20, Sender MAC: BB:BB:BB:BB:BB:BB”。
- 发送:直接发给 A。
Step 4: 更新缓存与通信
- 主机 A:
- 收到 Reply。
- 学习:将 B 的 IP-MAC 映射存入 ARP 缓存。
- 发送:现在有了 B 的 MAC,A 可以将原本的 IP 数据包封装成以太网帧,发送给 B。
- 后续:在缓存过期前(通常 Linux 60秒,Windows 2分钟),A 和 B 通信不再需要 ARP。
💡 核心洞察:ARP 是“用广播换效率”。第一次通信慢(广播+等待),后续通信快(查表)。它是局域网内的“自我介绍”协议。
二、数据包结构:长什么样?
ARP 包直接封装在以太网帧中,没有 IP 头。
| 字段 | 长度 (Bytes) | 说明 |
|---|---|---|
| Hardware Type | 2 | 1 = Ethernet |
| Protocol Type | 2 | 0x0800 = IPv4 |
| Hardware Size | 1 | 6 (MAC 地址长度) |
| Protocol Size | 1 | 4 (IPv4 地址长度) |
| Opcode | 2 | 1 = Request,2 = Reply |
| Sender MAC | 6 | 发送者的物理地址 |
| Sender IP | 4 | 发送者的逻辑地址 |
| Target MAC | 6 | 目标物理地址 (Request 中为 0) |
| Target IP | 4 | 目标逻辑地址 |
关键点:
- Request:Target MAC 全是 0,因为还不知道。
- Reply:Target MAC 是请求者的 MAC,因为要单播回去。
三、缓存机制:为什么需要 ARP Cache?
1. 减少广播风暴
- 如果每次发包都广播,网络会被 ARP 请求淹没,带宽浪费,CPU 中断频繁。
- 缓存 TTL:条目有生存时间。过期后删除,防止 MAC 地址变更(如更换网卡)导致通信失败。
2. 被动学习 (Gratuitous ARP / Snooping)
- 现象:当 B 回复 A 时,局域网内其他主机 C、D 也会收到这个单播包(如果交换机未隔离)或之前的广播包。
- 行为:C 和 D 也会更新自己的 ARP 表,记录 A 和 B 的映射。
- 价值:减少了 C/D 未来与 A/B 通信时的 ARP 请求次数。
3. 查看 ARP 表
- Linux:
ip neigh show或arp -n - Windows:
arp -a - PHP: 可以通过
exec('arp -n')获取,但通常不需要在应用层处理。
四、安全风险:ARP 欺骗 (ARP Spoofing)
ARP 协议设计之初假设局域网是可信的,因此存在严重安全漏洞。
1. 攻击原理
- 无认证:主机收到 ARP Reply 时,不会验证对方是否真的拥有该 IP。只要收到,就更新缓存。
- 攻击步骤:
- 黑客主机 H 发送伪造的 ARP Reply 给受害者 A:“我是网关 (192.168.1.1),我的 MAC 是 HH:HH:HH:HH:HH:HH”。
- A 更新缓存,把发给网关的流量都发给 H。
- H 再伪造 ARP Reply 给网关:“我是 A (192.168.1.100),我的 MAC 是 HH:HH:HH:HH:HH:HH”。
- 网关把发给 A 的流量也发给 H。
- 结果:H 成为中间人 (Man-in-the-Middle),可以窃听、篡改 A 和网关之间的所有数据。
2. 防御措施
- 静态 ARP 绑定:在关键服务器或网关上,手动绑定 IP-MAC,禁止动态更新。
- DAI (Dynamic ARP Inspection):交换机功能,检查 ARP 包的合法性(需配合 DHCP Snooping)。
- ARP 防火墙:主机软件监控 ARP 变化,报警或阻断异常更新。
⚠️ 警告:在公共 Wi-Fi 下,ARP 欺骗极易发生。敏感操作务必使用 HTTPS/TLS,因为 ARP 只能劫持链路层,无法解密加密的应用层数据。
🚀 总结:原子化“ARP 协议”全景图
| 维度 | 关键点 |
|---|---|
| 本质 | 通过广播询问实现 IP 到 MAC 的动态映射 |
| 核心机制 | Request (广播) -> Reply (单播) -> Cache (缓存) |
| 工作层级 | OSI Layer 2.5 (介于链路层和网络层之间) |
| 主要优势 | 简单、自动、无需配置 |
| 主要缺陷 | 无认证、易受欺骗、广播开销 |
| PHP 隐喻 | Service Discovery via Broadcast |
| 公式 | Communication = ARP_Resolve + Ethernet_Frame_Send |
终极心法:
ARP 的本质,是“局域网内的信任握手”。
它用广播的噪音,换取了单播的寂静。
但它太天真,谁说话都信,所以容易被骗子利用。
于广播中见发现,于缓存见效率;以信任为尺,解寻址之牛,于底层通信中,求真实之真。
行动指令:
- 查看缓存:在终端运行
arp -a,看看你的电脑记住了哪些邻居。 - 清空缓存:运行
ip neigh flush all(Linux) 或arp -d *(Windows),然后 ping 一个局域网 IP,观察 ARP 请求的发生。 - 抓包分析:用 Wireshark 过滤
arp,观察 Request 和 Reply 的 MAC 地址变化。 - 思维升级:记住,IP 是逻辑的,MAC 是物理的。ARP 是连接逻辑与物理的桥梁。不懂 ARP,就不懂局域网是如何真正通起来的。
