Skip to content

1.9 DAD (地址冲突检测) 原理深度解析

在网络世界中,IP 地址就像我们的身份证号,必须是唯一的。如果网络中两台设备拥有相同的 IP 地址,就会发生冲突,导致通信异常甚至网络中断。

DAD (Duplicate Address Detection,地址冲突检测) 就是一种用来确保 IP 地址在网络链路中唯一性的机制。

本文将分别介绍 IPv4 和 IPv6 环境下的 DAD 工作原理。

1. IPv4 机制:基于免费 ARP

在 IPv4 网络中,DAD 主要通过 免费 ARP (Gratuitous ARP) 来实现。(关于免费 ARP 的详细原理,请参考上一章 1.8 免费 ARP 详解

当接口配置 IP 地址或接口 Up 时,设备会发送 Sender IP = Target IP 的 ARP 请求。

1.1 图解 IPv4 冲突检测流程

当接口配置 IP 地址或接口 UP 时,会触发 DAD 流程:

  1. 发送请求:设备发送 免费 ARP (Gratuitous ARP) 请求。
    • Sender IP = 192.168.1.100 (自己想要的 IP)
    • Target IP = 192.168.1.100 (自己想要的 IP)
  2. 等待响应
    • 无响应:IP 可用。
    • 有响应:收到 Reply,说明有人在用。此时设备会报错 (Duplicate IP Address) 并禁用该 IP。
💻 新设备 (New Device)🌐 网络 (Network)
1. 配置 IP 192.168.1.100
发送免费 ARP Request
广播 (Broadcast)
Who has .100? Tell .100
✅ 情况 A: 无响应
超时无 Reply
→ DAD 成功,地址生效
❌ 情况 B: 收到响应
⬅ 收到 ARP Reply (I am .100)
→ DAD 失败,禁用 IP

当你给电脑或路由器配置了一个静态 IP(例如 192.168.1.100),或者通过 DHCP 获取到一个 IP 时,系统并不会马上使用它,而是会先进行冲突检测:

  1. 发送请求:设备以广播形式发送一个免费 ARP 请求包。
    • 源 MAC:本机 MAC
    • 目的 MAC:全 F (广播)
    • 源 IP:192.168.1.100
    • 目的 IP:192.168.1.100
  2. 等待响应
    • 情况 A(无冲突):如果在一段时间内(通常是几百毫秒),没有收到任何 ARP Reply(应答),设备就认为网络中没有其他人在使用这个 IP。此时,该 IP 地址正式生效。
    • 情况 B(有冲突):如果网络中已经有一台设备使用了 192.168.1.100,它收到这个广播后,会按照 ARP 协议规则,发现“有人在问我的 IP”,于是立刻回复一个 ARP Reply:“我是 192.168.1.100,我的 MAC 是 XXX”。
  3. 处理冲突
    • 发送检测的设备收到了 ARP Reply,意识到“撞号”了。
    • 操作系统通常会弹出“IP 地址冲突”的警告,并且该网卡会禁用此 IP,无法上网,直到冲突解决。

2. IPv6 机制:基于 NDP 协议

IPv6 抛弃了 ARP 协议,改用 ICMPv6NDP (Neighbor Discovery Protocol,邻居发现协议) 来实现地址解析和重复地址检测。

IPv6 的 DAD 机制比 IPv4 更加规范和严谨。

2.1 核心概念:NS 与 NA

  • 试验地址 (Tentative Address):当一个 IPv6 单播地址刚配置到接口上时,它处于“试验”状态。此时该地址不能用于正常的单播通信,只能用于 DAD 检测。
  • NS (Neighbor Solicitation,邻居请求):类似于 IPv4 的 ARP 请求。
  • NA (Neighbor Advertisement,邻居通告):类似于 IPv4 的 ARP 应答。
  • 被请求节点组播地址 (Solicited-Node Multicast Address):每个 IPv6 单播地址都有一个对应的组播地址。监听特定 IP 的设备一定会监听其对应的被请求节点组播组。

2.2 图解 IPv6 冲突检测流程

📡 节点 A (Node A)📢 组播组 (Multicast Group)
1. 状态: Tentative (试验中)
发送 NS 报文
Src=::, Dst=被请求节点组播
Target=2001::1
✅ 情况 A: 无响应
超时无 NA 报文
→ 状态变为 Preferred (可用)
❌ 情况 B: 收到响应
⬅ 收到 NA 报文 (Target=2001::1)
→ 状态变为 Duplicate (重复)

假设设备 A 想要配置 IPv6 地址 2001::1

  1. 状态置位:接口配置 2001::1,状态标记为 Tentative
  2. 加入组播组:设备 A 加入 2001::1 对应的被请求节点组播组 FF02::1:FF00:1
  3. 发送 NS 报文:设备 A 发送一个 NS 报文进行探测。
    • 源 IP:: (未指定地址,因为此时本机 IP 还没生效)
    • 目的 IPFF02::1:FF00:1 (被请求节点组播地址)
    • 查询内容:Target Address = 2001::1
  4. 等待响应
    • 情况 A(无冲突):如果在规定时间内没有收到针对 2001::1 的 NA 报文,则 DAD 成功。地址状态从 Tentative 变为 Preferred (首选)Valid (有效),可以正常使用。
    • 情况 B(有冲突):如果网络中已有设备 B 使用了 2001::1,它也是该组播组的成员。收到 NS 后,设备 B 会回复一个 NA 报文(目的地址为所有节点组播 FF02::1),宣示主权。
  5. 处理冲突
    • 设备 A 收到 NA,检测失败。
    • 该 IPv6 地址被标记为 Duplicate (重复),无法使用。

3. 故障现象:当冲突发生时会看到什么?

当 DAD 检测到地址冲突时,不同设备会有不同的提示方式。

3.1 桌面端:Windows 弹窗与日志

在 Windows 系统中,如果检测到 IP 冲突,右下角任务栏通常会弹出黄色警告三角形,提示“Windows 检测到 IP 地址冲突”。

同时,在“事件查看器 (Event Viewer)”的系统日志中,可以看到来源为 Tcpip 的错误日志 (Event ID 4199):

系统检测到 IP 地址 192.168.1.100 与网络硬件地址 XX-XX-XX-XX-XX-XX 发生冲突。

alt text

3.2 服务器端:Linux 内核日志

在 Linux 系统中(如 Ubuntu/CentOS),通常会在终端或 /var/log/syslog (或 /var/log/messages) 中打印内核日志:

bash
# dmesg 输出示例
[ 123.456789] IPv4: host 192.168.1.100/24 already assigned to 52:54:00:12:34:56
[ 123.456790] ARPOP_REPLY 192.168.1.100 [52:54:00:12:34:56] 00:0c:29:ab:cd:ef

3.3 网络侧:交换机/路由器的告警

网络设备通常会通过控制台 (Console) 或日志中心 (Syslog) 输出告警信息。

Cisco IOS 设备:

text
%IP-4-DUPADDR: Duplicate address 192.168.1.100 on Vlan1, sourced by 0000.1111.2222

这条日志明确指出了冲突的 IP (192.168.1.100) 以及对方的 MAC 地址 (0000.1111.2222)。

alt text

华为 VRP 设备:

text
ARP/4/ARP_DUPLICATE_IP_ADDR: Detected an IP address conflict. The IP address is 192.168.1.100, the interface is GigabitEthernet0/0/1, and the source MAC address is 00e0-fc00-0001.

alt text

可下载实验拓扑查看抓包信息:

eNSP-IP地址冲突实验

4. 网管实战:如何排查“哑终端”冲突?

对于没有显示器的服务器、IoT 设备或哑终端,我们无法直接看到“IP 冲突”的弹窗。此时,我们需要从网络设备(交换机/路由器)侧进行排查。

4.1 侦探思路:捕捉 MAC 地址漂移

IP 冲突的本质是 一个 IP 对应了多个 MAC 地址

在交换机的 ARP 表中,这个冲突的 IP 会在两个不同的 MAC 地址之间来回切换(Flapping),或者在日志中频繁出现针对同一 IP 的不同 MAC 记录。

4.2 三步定位法:ARP、日志与 MAC 表

步骤 1:查看 ARP 表

在网关设备上查看 ARP 表,检查疑似冲突的 IP 对应的 MAC 地址是否稳定。

  • Cisco: show ip arp | include 192.168.1.100
  • Huawei: display arp | include 192.168.1.100

如果你多次执行该命令,发现 MAC 地址在变化,说明存在冲突。

步骤 2:查看设备日志

这是最有效的方法。交换机通常会记录 ARP 冲突或重复 IP 的告警。

  • 查看 Cisco 日志:

    text
    show logging | include DUPADDR

    输出示例:%IP-4-DUPADDR: Duplicate address 192.168.1.100 on Vlan1, sourced by 0000.1111.2222

  • 查看 Huawei 日志:

    text
    display logbuffer | include DUPLICATE

    输出示例:ARP/4/ARP_DUPLICATE_IP_ADDR: ... IP address is 192.168.1.100 ... source MAC address is 00e0-fc00-0001.

步骤 3:定位物理端口

一旦通过日志或 ARP 表找到了冲突的 MAC 地址(例如 00e0-fc00-00010000.1111.2222),就可以在交换机上查找这些 MAC 位于哪个物理端口。

  • Cisco: show mac address-table address 0000.1111.2222
  • Huawei: display mac-address 00e0-fc00-0001

通过这一步,你可以精确地知道是哪两根网线连接的设备配置了相同的 IP,然后物理拔线或关闭端口即可解决问题。

5. 总结与对比:IPv4 vs IPv6

特性IPv4 DADIPv6 DAD
基础协议ARP (免费 ARP)ICMPv6 (NDP)
报文类型ARP Request / ReplyNS / NA
源 IP 地址自身的 IPv4 地址 (Sender IP):: (未指定地址)
目的类型广播 (Broadcast)组播 (Multicast)
优势简单,兼容性好效率高(不打扰不想关设备),标准化

理解 DAD 原理对于排查网络故障(如设备无法上线、Windows 报 IP 冲突错误)非常有帮助。当你在抓包软件(如 Wireshark)中看到源 IP 为 0.0.0.0 (IPv4 DHCP 探测时) 或 :: (IPv6 DAD 时) 的请求包时,通常就是设备正在进行地址冲突检测。