Linux(内核版本为2.4.18)中IPv6地址重复检测机制的实现
当主机开始配置一个IPv6地址(手工静态配置或者收到路由器公告配置)时,随机延迟Trand的时间(0 < Trand < 1000ms)后发送NS(邻机请求报文),此NS的源地址类型为IPV6_ADDR_ANY(全0地址),发送NS的个数n和间隔Tret可以配置,一般取n = 1和Tret = 1000,这也是RFC2462的推荐值。在DAD检测期间,主机将这个IPv6地址的状态设置成IFA_F_TENTATIVE,不能使用这个地址发送数据包或者接收来自这个地址的数据包。只有DAD检测成功后,主机才可以使用这个地址。
在DAD检测期间:
1. 当主机收到目标地址为其正在做DAD检测的地址(此时该地址的状态为IFA_F_TENTATIVE)的NS时,如果NS的源地址类型为IPV6_ADDR_ANY(全0地址),则主机从接口上删除这个地址(DAD检测失败),否则主机不处理此NS。
2. 当主机收到目标地址为其正在做DAD检测的地址(此时该地址的状态为IFA_F_TENTATIVE)的NA(邻机公告报文)时,则主机从接口上删除这个地址(DAD检测失败)。
如果主机为某个IPv6地址完成DAD检测后收到来自其它主机发送的目的地址为此IPv6地址的用作DAD检测的NS(NS的源地址类型为IPV6_ADDR_ANY),则主机应该向全节点地址(ff02::1)发送NA(邻近公告报文)。