zoukankan      html  css  js  c++  java
  • 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的。

    规律

  • 相关阅读:
    洛谷1509 找啊找啊找GF
    要怎样努力,才能成为很厉害的人?
    随笔
    2018NOIP模拟题 曲线
    洛谷4147 玉蟾宫
    洛谷2258 子矩阵
    Vijos 纸牌
    [leetcode] Word Break
    [leetcode] Maximum Binary Tree
    [leetcode] Binary Tree Preorder Traversal
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/14728292.html
Copyright © 2011-2022 走看看