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算法了,因为剩下的无非是组包,填包,发包收包的工作了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值