摘要

  • 重复地址检测把“生成”与“指派”拆成两步。前缀和接口标识符可以拼出地址,但它仍处于暂定状态,不能承载普通流量。
  • 节点从未指定地址发出邻居请求,只在所在链路寻找已使用或同时申请者。限定时间内无人回应,只足以允许本地启用,不证明身份、产权或全球唯一。
  • 乐观 DAD 后来允许受限的提前使用;增强 DAD 用新 nonce 区分自己的反射探测与另一个申请者。两者都不是认证机制。

计算结果先被降格为候选

IPv6 无状态自动配置的吸引力,是不必为每台主机准备地址服务器。路由器发布前缀,主机附上接口标识符;没有路由器时,主机仍能构造链路本地地址。然而,两台机器可能得到同一结果。

RFC 4862 在构造与使用之间放入一种明确状态:tentative。这个地址还没有按通常意义指派给接口。接口丢弃发往它的普通报文,只接收完成重复检测所需的 Neighbor Discovery 信息。软件持有的是候选值,不是已经运行的网络身份。

这道检查不以配置来源论资历。地址无论来自 SLAAC、DHCPv6 还是人工设置,都要独立执行 DAD;路由器也应在指派地址前通过它。管理者写入的值同样可能与链路现实冲突。

不能拿候选地址为自己作证

DAD 使用 RFC 4861 定义的邻居请求与通告。节点把暂定地址放在 Target 字段,向对应的 solicited-node multicast 地址发出请求。问题被限制在真正可能受冲突影响的本地邻居,而不是广播到互联网。

源地址是 ::。这不是匿名权威,而是在承认:候选地址尚不能作为合法源地址替自己背书。DAD 请求也不携带普通地址解析可能使用的源链路层地址选项。

已有使用者可返回 Neighbor Advertisement;两个同时测试相同候选的节点,也会在彼此的 DAD 请求里看见冲突。任一有效迹象都阻止指派。若链路本地地址重复,接口的自动配置会停止,因为后续更大作用域地址也可能建立在同一错误标识符上。

DupAddrDetectTransmits 默认是一次,可由链路规范或系统管理修改;设为零等于关闭检测。RetransTimer 决定探测间隔及最后等待时间。这是一扇有限观察窗,不是持续监控。

沉默只授予有限的运行许可

在窗口结束前没有收到失败迹象,节点便把地址转为已指派。准确说法是:在这条链路、这段时间内,没有观察到可达的冲突者。

组播过滤、链路分区、休眠设备或故障交换机都可能保持沉默;恶意邻居也能伪造通告,阻止他人配置。DAD 不查询全球账本,不认证机器,不保证可达,更不裁定谁拥有地址。不同链路使用同一链路本地地址本来就不构成冲突。

它的价值来自克制:协议只收集执行本地状态转换所需的最少证据,不把一次组播参与夸大为更广泛的授权。

提前行动不能赶走真正使用者

移动设备切换链路时,等待会直接表现为延迟。RFC 4429 引入 Optimistic 状态:DAD 尚未完成,地址可以受限使用,但实现应像对待 deprecated 地址一样,在有其他合适源地址时避开它。

提前使用的边界集中在邻居缓存。乐观节点发送通告时要清除 Override 标志,不能从该地址发送普通 Neighbor Solicitation,也不能在源自该地址的 Router Solicitation 中借链路层选项建立所有权印象。必要时,流量先绕经默认路由器,等地址不再乐观后再直接联系邻居。

因此,乐观并没有取消检测。它允许一部分可回退行为提前发生,同时禁止最可能覆盖真正使用者状态的动作。

自己的问题从链路另一端返回

运营商会用物理或逻辑回环测试电路,某些接入拓扑也会把帧反射给发送接口。路由器收到自己的 DAD 请求后,可能误判为另一台节点正在申请同一地址;即使回环撤除,IPv6 接口仍停在失败状态。

RFC 7527 为每次 DAD 请求生成并保存新的随机 nonce。若同一 Target 的请求带着相同 nonce 返回,节点认出这是自己的反射,记录后丢弃;不同 nonce 仍表示另一个候选者。持续使用新值重试,使回环消失后的接口能够自行恢复。

nonce 的证明范围很窄。攻击者可以篡改它,也能伪造 Neighbor Advertisement;RFC 因而把对抗性保护交给 Secure Neighbor Discovery。增强 DAD 只回答“这是不是我刚才发出的探测”,不回答“对方是谁”。

来源与证据边界

本文引用的标准包括 RFC 4861 的邻居消息、RFC 4862 的暂定状态与基础 DAD、RFC 4429 的受限提前使用,以及 RFC 7527 的反射识别。它们能证明设计与已记录故障,不能给出当前部署率、冲突频率、统一计时器或具体厂商质量。