1446 字
7 分钟
IPv6中的DAD

1. 什么是 DAD?#

​DAD​​(Duplicate Address Detection),全称是重复地址检测 ​​。它是 IPv6 协议中一个至关重要的机制,用于确保一个 IPv6 地址在即将被使用的链路上是唯一的。

简单来说,当一个网络接口(如电脑的网卡、路由器的端口)想要使用某个 IPv6 地址时,它不能想用就用。它必须首先“礼貌地”在所在的本地网络链路上“喊一嗓子”:“喂!有人用这个地址吗?”。如果没有人回应,它就认为这个地址是空闲的,可以放心使用。如果有人回应了,那就说明地址冲突了,它就不能使用这个地址。

这有效防止了 IPv4 中常见的 IP 地址冲突问题(两台设备用了同一个 IP,导致网络通信异常)。


2. DAD 的工作原理#

DAD 的过程完全由设备自动执行,无需人工干预。其核心原理是利用 ​​ 邻居发现协议 ​​ 中的两种 ICMPv6 报文:

  • ​ 邻居请求报文 ​
  • ​ 邻居通告报文 ​

以下是 DAD 过程的详细步骤:

​ 场景 ​​:假设一台主机刚刚启动,并通过 ​​ 无状态地址自动配置 ​​ 给自己分配了一个链路本地地址fe80::1234(或者通过 DHCPv6、手动配置获得了地址)。

  1. ​ tentative 地址 ​
    在运行 DAD 之前,这个新地址fe80::1234处于​“试验性”​​ 状态。处于此状态的地址不能用于正式通信,只能用于执行 DAD。

  2. ​ 发送 NS 报文 ​
    主机会构造一个 ​​ 邻居请求 ​​ 报文。

    • ​ 源 IPv6 地址 ​​:::(未指定地址,因为此时自己的地址还不能用)
    • ​ 目的 IPv6 地址 ​​:ff02::1:ff00:1234(这是针对fe80::1234的被请求节点组播地址。设计得非常巧妙,只有监听这个地址的设备才会处理该报文,减少了网络噪音。)
    • ​ 目标地址 ​​:fe80::1234(就是我要询问的那个地址)
    • ​ 消息大意 ​​: “请问,谁是fe80::1234?如果你是这个地址的主人,请回答我!”
  3. ​ 等待响应 ​
    主机等待一段时间(通常 1 秒左右)。这段时间内可能发生两种情况:

    • ​ 情况 A:没有收到响应 ​
      • 这意味着在网络链路上没有任何其他设备使用目标地址fe80::1234
      • 主机因此判定地址唯一,将fe80::1234从“试验性”状态提升为 ​​“首选”​​ 状态。此后,这个地址就可以正常使用了。
    • ​ 情况 B:收到了 NA 报文 ​
      • 这意味着网络上已经有另一台设备在使用fe80::1234这个地址了。它收到了 NS 请求,于是回复一个 ​​ 邻居通告 ​​ 报文。
      • ​ 消息大意 ​​:“我就是fe80::1234!这个地址我已经在用了!”
      • 发起 DAD 的主机检测到冲突,会 ​​ 禁用 ​​ 这个试验性地址,并不会使用它。系统通常会记录一条错误日志。

​ 总结原理 ​​:通过“询问-应答”机制,主动探测地址冲突,确保地址在本地链路范围内的唯一性。


3. DAD 的应用#

DAD 并非一个独立的功能,而是深度集成在 IPv6 的各种核心操作中,只要涉及配置新的单播 IPv6 地址,几乎都会触发 DAD。

  1. ​ 无状态地址自动配置 ​
    这是 DAD 最经典的应用场景。当主机通过路由器通告消息获取到 IPv6 前缀后,会结合自己的接口标识符(如 EUI-64)生成一个全球单播地址或链路本地地址。在正式使用这个新生成的地址前,​​ 必须 ​​ 进行 DAD 检测。
  2. ​ 手动配置静态 IPv6 地址 ​
    当网络管理员在一台服务器或路由器接口上手动配置一个 IPv6 地址时,系统也会自动对该地址执行 DAD,以防止人为配置错误导致地址冲突。
  3. ​DHCPv6 分配地址 ​
    当客户端通过 DHCPv6 协议从服务器获取到一个 IPv6 地址时,在绑定使用该地址前,客户端也会执行 DAD,以确保 DHCP 服务器分配的地址在链路上没有冲突。(虽然 DHCP 服务器本身会管理地址池,但 DAD 提供了第二道保障,防止静态配置等其他原因造成的冲突)。
  4. ​ 移动 IPv6​
    当移动设备从一个网络移动到另一个网络时,它需要配置新的转交地址。在启用这个新地址之前,同样需要执行 DAD 来确保其唯一性。
  5. ​ 路由器接口地址 ​
    网络中的路由器在其接口上启用任何一个 IPv6 地址时,也会进行 DAD。这对于网络稳定性至关重要,因为路由器地址冲突会导致路由黑洞和网络瘫痪。

注意事项#

  • ​DAD 的延迟 ​​:DAD 过程会引入短暂的延迟(约 1 秒),这意味着在接口启用后,IPv6 地址不能立即使用。在某些对实时性要求极高的场景中,可以通过参数调整延迟时间,或者在某些特定环境下(如隔离的点对点链路)​​ 谨慎地 ​​ 关闭 DAD 功能。
  • ​ 仅限本地链路 ​​:DAD 只在 ​​ 本地链路 ​​ 上有效。它无法检测到其他网段上的地址冲突。例如,主机 A 在网段 1,主机 B 在网段 2,它们可以使用相同的 IPv6 地址而 DAD 无法察觉,但这通常由路由器的路由表正确管理,不会造成问题。