IPV6重复地址检测机制

IPV6重复地址检测机制

冲突检测

在ipv4当中,我们的设备如果是静态地址,在启动网络服务的时候,设备会向外发送一个免费arp报文用做冲突检测,DHCP在分配地址时候,也会做冲突检测。IPV4当中做冲突检测主要依赖的还是arp报文。

在IPV6当中肯定也是会有冲突检测功能的,在IPV6当中主要使用的是NS和NA报文,就是邻居请求报文和邻居应答报文,NS和NA报文的作用当然不仅限于此,这一点与IPV4比较类似,arp报文不仅用于地址冲突检测,还有很多其它用途。

IPV6比IPV4要复杂一些,IPV6我们知道的,即使我们给接口配置了一个单播地址,它其实还会生成其它地址或组播地址,比如当我们给接口配置了一个单播地址之后,在地址生效之前肯定会做冲突检测,但是别忘了,接口上还有一个链路本地地址,这个地址同样也要做地址重复检测的,在IPV6当中有一个原则,任何一个单播地址要想正常使用,都要做地址重复检测。

报文分析

在ipv4当中,当电脑发现arp地址冲突检测的时候,源MAC地址就是自己的MAC,目标MAC地址全F,也就广播嘛!这里面有一个问题,ARP广播的源IP地址是多少?去特么的,ipv4当中的arp是二层协议,在二层的概念里面哪有IP地址,这个问题就是一个坑,在ipv4当中,arp报文的源地址那一列只有源MAC,没有源IP,而目的地址那一列,只有一个广播地址。

在IPV6当中,通过NS和NA报文替代arp,而NS和NA报文是三层报文,在三层报文当中是有源IP地址的,那在地址冲突检测的时候源地址添加多少呢?如果就添加将要使用的地址不太正常,因为地址还没有经过冲突检测怎么就能封装到报文当中做源IP地址使用呢?如果一定要封装一个,那封装什么好呢?明明当前没有地址,正是因为没有地址,所以我要请求一个地址,但是请求地址的时候却让我添写一个源地址,好像陷入到一个死循环当中了,在IPV6当中专门规划了一个地址用来应对这种尴尬的局面,那就是冒号冒号,如果没有IP地址的话,源地址上就添写::,源MAC就是自己接口的MAC地址,这一点和arp一样,那目标IP和目标MAC添加什么呢?目标IP是我们要使用的IP地址吗?不是的,我们认为目标IP是我们要使用的IP地址,其实不是这样的,这个地方也是一个坑,目标IP不是我们要使用的IP地址,我们要使用的IP地址其实被封装到报文当中的内容里面去了,我们来看看真实的情况:

看到了吧,目标IP是接口已经加入到的组播地址,也就是将要使用的IP地址自动加入的组播地址,既然目标IP是组播地址,那这个报文也是组播报文,目标MAC也是组播,注意在ENSP当中,PC是没有地址冲突检测的功能的,只有路由器才有。

如上图所示,当一个设备配置了IPV6的静态地址之后,当它启动之后,会发送两个NS报文,都是用于地址冲突检测的,一个是我们上述讲过的,还有一个就是链路本地地址,这个地址的NS与上述有点不一样,源IP还是::,源MAC也是自己的,目标IP就是链路本地地址加入的组播地址,这一点与上述相似,但目标IP就变了,如下所示,反正也是具体地址加入到的组播地址。


就是目标MAC有些奇怪,但都是33开头的,反正这样的地址都是组播MAC地址。

面对冲突

回复报文是通过NA报文进行回复的。
NA真的是很真的,源IP是真的IP,目标IP是固定的ff02::1,ff02::1这样的地址就相当于IPV4的广播,所有的节点都会收到,两层意思,一层意思是告知对方这个地址自己已经用了,另一层意思是告诉所有节点,自己IP是这个。

在路由器上如果冲突了,接口的IP会卡在duplicate这个状态,如下所示:

NA报文冲突报文有一个特点,FLAG位当中的S位是0的。

规律

原文地址:https://www.cnblogs.com/yizhangheka/p/14728292.html