关于IPv6 DAD机制的一种新思考

问题背景 在IPv6网络上进行地址配置时 , 需要进行DAD检测 , 以保证该地址的唯一性 。 一旦DAD检测到地址冲突 , 该地址就会置为冲突状态 , 且一直保持这个状态 , 无法恢复 。 只有未来网络中不再存在相同的冲突地址 , 并且该IPv6节点重新触发DAD探测 , 该IPv6地址才能恢复到可用状态 。
在现网中经常存在因误配置或者局部环路等原因导致的IPv6地址冲突不可用 , 而后网络恢复正常 , 但已经冲突的IPv6地址无法自动恢复 。 在复杂的网络中 , 工程人员需要花费大量的时间排查组网 , 找到处于地址冲突状态的IPv6节点 , 并确保网络中没有使用相同地址 , 然后通过重新配置或者重启接口等手段重新触发DAD探测 , 才能使该冲突地址变为可用 。
而且当网络中存在大量冲突地址可恢复时 , 手动恢复不仅耗时费力 , 短时间内发送大量DAD探测报文 , 还存在占用系统内存资源和耗用系统性能资源的风险 。
针对这种背景 , 实现一种IPv6地址检测冲突后自动恢复的方法 , 并设计指数级退避算法优化DAD探测性能 , 可以提高IPv6网络的可靠性和可维护性 , 减少人力和时间成本 。
解决方案1. 地址冲突链表的维护 。
关于IPv6 DAD机制的一种新思考文章插图
图1 地址冲突链维护流程
(1) 在初始化阶段初始化地址冲突链表;
(2) 配置IPv6地址或者重启已存在地址的接口 , 触发DAD探测;
(3) DAD探测结束 , 检查当前地址是否冲突 , 不冲突 , 结束流程;
(4) 地址冲突 , 检查当前地址冲突链表是否已存在该地址结点 , 已存在 , 采用指数级退避算法 , 结束流程;
(5) 不存在 , 分配新的结点 , 为每个结点申请一个时间轮定时器 , 用于地址状态自动恢复 , 超时时间默认为一分钟 , 将结点插入到地址冲突链表 , 流程结束 。
2. 地址冲突节点的自动恢复 。
关于IPv6 DAD机制的一种新思考文章插图
图2 地址节点的自动恢复流程
【关于IPv6 DAD机制的一种新思考】(1) 地址冲突结点定时器超时处理;
(2) 对该结点重新进行DAD探测;
(3) DAD探测结束后 , 判断该地址是否冲突;
(4) 若地址仍然冲突 , 未防止不停DAD探测 , 发送报文过多占用系统资源 ,
采用指数级退避算法 , 将此结点自动恢复优先级降低 , 流程结束;
(5) 若此时地址不再冲突 , 从链表摘除掉该结点 , 释放结点资源和定时器
资源 , 结束流程 。
3. 采用指数级退避算法
因为DAD探测时要发送NS报文 , 如果当前探测结点仍然存在冲突 , 对端还会回应一个NA报文 , 为防止地址结点一直存在冲突 , 产生大量DAD探测报文占用系统资源 , 本方案设计一种指数级退避算法 。
设一个冲突地址结点刚入链时 , 权重weight = n , 探测次数numbers = 0 。
每探测一次 , 地址仍然冲突 , 探测次数numbers + 1,权重weight退避为 weight = n * 2^numbers 。
在下次探测之前 , 结点的自动恢复定时器超时时间time重新设置为time = time0(原超时时间) * weight(退避调整后的权重) 。
为方便用户灵活调整优先级 , 用户可通过命令行重新配置某一地址的权重 。 如用户配置某一地址weight = n1,则该地址如果存在地址冲突节点 , 则weight刷新为n1,探测次数numbers刷新为0 , 相当于重新开始探测 。
方案带来的好处1. IPv6地址检测冲突后 , 无需人工干预 , 提供一种可自动恢复地址状态的方法 , 极大地减少了人力和时间成本 。
2. 该地址冲突自动恢复系统 , 与RFC4861标准不冲突 , 并重复利用了该标准实现的DAD功能 , 提高了软件的通用性和扩展性 。