1446 字
7 分钟
IPv6中的DAD
1. 什么是 DAD?
DAD(Duplicate Address Detection),全称是重复地址检测 。它是 IPv6 协议中一个至关重要的机制,用于确保一个 IPv6 地址在即将被使用的链路上是唯一的。
简单来说,当一个网络接口(如电脑的网卡、路由器的端口)想要使用某个 IPv6 地址时,它不能想用就用。它必须首先“礼貌地”在所在的本地网络链路上“喊一嗓子”:“喂!有人用这个地址吗?”。如果没有人回应,它就认为这个地址是空闲的,可以放心使用。如果有人回应了,那就说明地址冲突了,它就不能使用这个地址。
这有效防止了 IPv4 中常见的 IP 地址冲突问题(两台设备用了同一个 IP,导致网络通信异常)。
2. DAD 的工作原理
DAD 的过程完全由设备自动执行,无需人工干预。其核心原理是利用 邻居发现协议 中的两种 ICMPv6 报文:
- 邻居请求报文
- 邻居通告报文
以下是 DAD 过程的详细步骤:
场景 :假设一台主机刚刚启动,并通过 无状态地址自动配置 给自己分配了一个链路本地地址fe80::1234(或者通过 DHCPv6、手动配置获得了地址)。
-
tentative 地址
在运行 DAD 之前,这个新地址fe80::1234处于“试验性” 状态。处于此状态的地址不能用于正式通信,只能用于执行 DAD。 -
发送 NS 报文
主机会构造一个 邻居请求 报文。- 源 IPv6 地址 :
::(未指定地址,因为此时自己的地址还不能用) - 目的 IPv6 地址 :
ff02::1:ff00:1234(这是针对fe80::1234的被请求节点组播地址。设计得非常巧妙,只有监听这个地址的设备才会处理该报文,减少了网络噪音。) - 目标地址 :
fe80::1234(就是我要询问的那个地址) - 消息大意 : “请问,谁是
fe80::1234?如果你是这个地址的主人,请回答我!”
- 源 IPv6 地址 :
-
等待响应
主机等待一段时间(通常 1 秒左右)。这段时间内可能发生两种情况:- 情况 A:没有收到响应
- 这意味着在网络链路上没有任何其他设备使用目标地址
fe80::1234。 - 主机因此判定地址唯一,将
fe80::1234从“试验性”状态提升为 “首选” 状态。此后,这个地址就可以正常使用了。
- 这意味着在网络链路上没有任何其他设备使用目标地址
- 情况 B:收到了 NA 报文
- 这意味着网络上已经有另一台设备在使用
fe80::1234这个地址了。它收到了 NS 请求,于是回复一个 邻居通告 报文。 - 消息大意 :“我就是
fe80::1234!这个地址我已经在用了!” - 发起 DAD 的主机检测到冲突,会 禁用 这个试验性地址,并不会使用它。系统通常会记录一条错误日志。
- 这意味着网络上已经有另一台设备在使用
- 情况 A:没有收到响应
总结原理 :通过“询问-应答”机制,主动探测地址冲突,确保地址在本地链路范围内的唯一性。
3. DAD 的应用
DAD 并非一个独立的功能,而是深度集成在 IPv6 的各种核心操作中,只要涉及配置新的单播 IPv6 地址,几乎都会触发 DAD。
- 无状态地址自动配置
这是 DAD 最经典的应用场景。当主机通过路由器通告消息获取到 IPv6 前缀后,会结合自己的接口标识符(如 EUI-64)生成一个全球单播地址或链路本地地址。在正式使用这个新生成的地址前, 必须 进行 DAD 检测。 - 手动配置静态 IPv6 地址
当网络管理员在一台服务器或路由器接口上手动配置一个 IPv6 地址时,系统也会自动对该地址执行 DAD,以防止人为配置错误导致地址冲突。 - DHCPv6 分配地址
当客户端通过 DHCPv6 协议从服务器获取到一个 IPv6 地址时,在绑定使用该地址前,客户端也会执行 DAD,以确保 DHCP 服务器分配的地址在链路上没有冲突。(虽然 DHCP 服务器本身会管理地址池,但 DAD 提供了第二道保障,防止静态配置等其他原因造成的冲突)。 - 移动 IPv6
当移动设备从一个网络移动到另一个网络时,它需要配置新的转交地址。在启用这个新地址之前,同样需要执行 DAD 来确保其唯一性。 - 路由器接口地址
网络中的路由器在其接口上启用任何一个 IPv6 地址时,也会进行 DAD。这对于网络稳定性至关重要,因为路由器地址冲突会导致路由黑洞和网络瘫痪。
注意事项
- DAD 的延迟 :DAD 过程会引入短暂的延迟(约 1 秒),这意味着在接口启用后,IPv6 地址不能立即使用。在某些对实时性要求极高的场景中,可以通过参数调整延迟时间,或者在某些特定环境下(如隔离的点对点链路) 谨慎地 关闭 DAD 功能。
- 仅限本地链路 :DAD 只在 本地链路 上有效。它无法检测到其他网段上的地址冲突。例如,主机 A 在网段 1,主机 B 在网段 2,它们可以使用相同的 IPv6 地址而 DAD 无法察觉,但这通常由路由器的路由表正确管理,不会造成问题。