IPV6的DAD检测算法实现

   在LINUX内核中,已经实现了DAD检测的算法,但是内核并没有给出DAD检测的结果,如果想要手动的得到DAD检测的结果,或者给内核发消息启动DAD检测,意味着要面对大量的内核代码,而且这些代码不是独立的,总之,很有得研究一番。

    也可以采用另外一种方式实现,就是socket编程,linux提供的socket接口允许我们自已组包,发送任意的数据,类型为AF_SOCKET,为什么要使用AF_SOCKET呢,RAW_SOCKET是RFC中推荐使用的,为什么不采用呢,原因是DAD检测有一个特别的规定,那就是发送NS的源地址必须为任意地址,而RAW_SOCKET只是处理ICMPV6报文中的各个部分,并不能指定源发送地址,因为icmpv6的报文是要通过IP模块的,内核会自动将一个接口的任意可用的IP地址做为源地址。如果要使用RAW_SOCKET发送任意IP源地址的报文,恭喜你,那是个大坑,又有得一番研究了。

使用AF_SOCKET有两个难点,一是CHECKSUM的计算,ICMPV6的CHECKSUM必须得自己计算了,去了解一下伪首部吧,应该不是很难的。

另一个是注意不要在ICMPV6中带源地址选项,为什么不能呢,对不起,解释不了,加了就是不行,你会收不到NA包,如果你的地址是冲突的话。

解决以上两个问题后,也恭喜你,你基本上完成了DAD算法了,因为剩下的无非是组包,填包,发包收包的工作了。

你可能感兴趣的:(IPV6的DAD检测算法实现)