IPv4 时代的地址冲突检测:从"裸奔"到"安检"的演进
摘要:本文梳理 IPv4 地址冲突检测的演进脉络:早期 IPv4 没有强制的冲突检测机制,只能"先配先用、冲突再说";随后免费 ARP(Gratuitous ARP)成为事实上的"事后补救"手段,但存在时机太晚、非强制、易被忽略等局限;2008 年 RFC 5227 引入 ACD(地址冲突检测),实现"先探测、后配置"的正规流程,并广泛应用于 APIPA、现代操作系统与 DHCP 服务器。最后对比 IPv4 与 IPv6 DAD 的机制差异,说明 IPv6 从设计之初就把地址唯一性内建为"基因",而 IPv4 的 ACD 更像是一块"补丁"。
在上一篇文章中,我们详细剖析了 IPv6地址状态 DAD(重复地址检测) 和 TENTATIVE 状态,在地址"出生"前就完成严格的"安检"。那么,在"上古时代"的 IPv4 网络中,主机们是如何避免地址冲突的呢?
答案可能出乎你的意料:IPv4 早期并没有强制的、标准化的冲突检测机制。 它经历了一个从"先配先用、冲突再说",到"免费 ARP 宣告",再到借鉴 IPv6 思路推出 ACD(地址冲突检测) 的演进过程。
1. 早期 IPv4:没有"安检",只有"宣告"
在 IPv4 的 RFC 标准早期(如 RFC 826 ARP 协议),并没有定义"在配置地址前先检查一下"的流程。当时的逻辑非常粗暴:
- 管理员手动配置一个 IP 地址,或者通过 DHCP 获取一个。
- 操作系统直接将这个地址绑定到网卡上。
- 开始正常通信。
如果局域网里有两个人配了同一个 192.168.1.100,会发生什么?
- 两台主机会互相"踩踏"对方的 ARP 缓存。
- 发往
192.168.1.100的流量会在两者之间随机跳转(取决于谁的 ARP 回复后到)。 - 结果就是:两台主机都时通时断,网络体验极其诡异。
这种"先上车后补票"的方式,显然不够优雅。
2. 免费 ARP(Gratuitous ARP):传统的"自救"手段
为了解决上述尴尬,操作系统和网络设备引入了一个"偏方"------免费 ARP(Gratuitous ARP)。
2.1. 什么是免费 ARP?
它不是一个标准流程,而是一种"约定俗成"的用法。其本质是:
- 源 IP 和目标 IP 都是自己的 IP 地址。
- 源 MAC 是自己的 MAC 地址。
- 目标 MAC 是全 0(或广播地址)。
简单来说,就是主机在配好地址后,向全网大喊一声:"我是 192.168.1.190,我的 MAC 是 00:e0:4c:xx:xx:x8,大家都记一下!"

2. 免费 ARP 如何检测冲突?
如果局域网里已经有人在使用 192.168.1.190,当新主机发出免费 ARP 时,那个"原主人"会听到这个广播。它发现有人在用和自己一样的 IP,就会判定:冲突发生了!
此时,原主人通常会:
- 在系统日志里记录错误。
- 弹出"IP 地址冲突"的警告(Windows 上那个经典的"IP 冲突"气泡就是这么来的)。
- 持续发送免费 ARP 来"捍卫"自己的地址。
3. 免费 ARP 的局限性
- 时机太晚:地址已经配好了,冲突已经发生了,应用可能已经开始报错。
- 非强制:RFC 并没有强制要求所有设备必须响应或检测免费 ARP。有些设备"装死",冲突依然无法被发现。
- 容易被忽略:在繁忙的网络中,免费 ARP 可能被淹没,导致冲突检测失败。
三、IPv4 ACD(RFC 5227):迟到的"正规军"
随着网络规模扩大,尤其是笔记本电脑、手机等移动设备频繁切换网络,地址冲突问题越来越突出。IETF 终于在 2008 年发布了 RFC 5227《IPv4 Address Conflict Detection (ACD)》,为 IPv4 引入了一套类似 IPv6 DAD 的正规流程。
1. ACD 的核心思想
"先探测,后配置"。在把 IPv4 地址真正绑定到接口之前,先发 ARP 请求探探路。
2. ACD 的工作流程
-
探测(PROBING):
- 主机想使用
192.168.1.190。 - 它连续发送 3 个 ARP 请求,间隔随机(0-2 秒)。
- 关键点 :这些 ARP 请求的 源 IP 填 0.0.0.0 (避免污染别人的 ARP 表),目标 IP 是
192.168.1.190。 - 这就像在屋里喊:"
192.168.1.190在吗?在吗?在吗?"
- 主机想使用
-
判断结果:
- 无人应答:说明地址空闲,主机正式配置该地址。
- 有人应答 (收到 ARP 回复,或看到别人发的 ARP 请求里源 IP 就是
192.168.1.190):说明冲突,地址不能使用。
-
持续保护(DEFEND):
- 即使地址配置成功,主机在后续通信中,如果收到别人发的免费 ARP 宣告同一个 IP,它会再次检测到冲突。
- 此时,主机可以选择"退让"(放弃地址)或"捍卫"(发送自己的免费 ARP)。
3. ACD 的实际应用
- APIPA(169.254.x.x) :Windows 等系统在 DHCP 失败时会自动分配
169.254.x.x地址,这个过程强制使用 ACD。 - 现代操作系统 :Windows、macOS、Linux(通过
avahi-autoipd或NetworkManager)在配置地址时,通常都会先跑 ACD。 - DHCP 服务器:很多 DHCP 服务器在分配地址前,也会先代客户端做一次 ACD(Ping 或 ARP),确保地址没被静态占用。
四、IPv4 vs IPv6:冲突检测机制对比
| 特性 | IPv4 (传统/ACD) | IPv6 (DAD) |
|---|---|---|
| 标准 | ACD 是可选扩展 (RFC 5227) | 强制内置 (RFC 4862) |
| 触发时机 | 配置前(ACD)或配置后(免费 ARP) | 配置前,地址进入 TENTATIVE 状态 |
| 检测报文 | ARP 广播 | NS(邻居请求)组播 |
| 检测范围 | 广播域 | 链路范围(Link-Local) |
| 冲突处理 | 放弃地址或弹窗警告 | 地址进入 DUPLICATE 状态,不可用 |
| 自动化程度 | 依赖操作系统实现 | 协议栈原生支持,无缝集成 |
五、总结
IPv4 时代的地址冲突检测,是一部"摸着石头过河"的进化史:
- 早期:完全依赖人工规划,冲突了就靠管理员去查。
- 中期:免费 ARP 成为事实标准,实现了"事后补救"和"被动发现"。
- 晚期:RFC 5227 ACD 的出台,终于为 IPv4 补上了"事前安检"的短板。
然而,IPv4 的 ACD 终究是"补丁",而 IPv6 的 DAD 则是"基因"。IPv6 从设计之初就将地址唯一性作为核心要求,通过 TENTATIVE 状态和 DAD 流程,让冲突检测成为地址生命周期中不可逾越的一环。