NDP协议是IPv6体系中一个 重要的基础协议,它的实现基础是ICMPv6,通过使用ICMPv6中的功能,它完成了许多功能,如实现地址解析,跟踪邻居状态,重复地址检测,路由器发现以及重定向等功能。
NDP所使用的所有报文都封装在ICMPv6的报文中。
NDP通过使用三层协议进行地址解析,可以使得使用不同数据链路层的协议进行通信,即下层不同没有关系,但是上层核心是基于TCP/IP即可。
同时三层的地址解析可以使得ARP的欺骗消失
使用组播的方式进行ARP解析,减少交换网络的负担。
1、ICMPv6地址解析
虽然上面说是NDP进行了地址解析,但是其核心还是使用ICMPv6进行地址解析,只不过是在ICMPv6报文的基础上添加新的结构。
ICMPv6地址解析的过程中总共使用了两种ICMPv6的报文
1、NS报文:type=135 code=0
我们可以从中看到NS报文的格式是怎么样的,其实十分的显而易见,它不过是在ICMP的数据部分做了手脚,改成了ICMPv6的option,而这个option的字段总共分为三段,第一段是type类型,标识了源端的二层地址类别,然后就是长度,它的长度是8字节,然后就是源端的MAC地址
2、NA报文:type=136 code=0
我们现在看一下NA,也就是对于NS报文是如何回复的。
我们可以看到大致都一样,但是NA在NS中的保留字段中填入了它的IP地址,同时它的option字段中的type字段的解释也不一样了,变为了target,而在NS中是source,这样就可以很清楚的分清楚请求和回应的对象是谁。Targer就是被请求的,Source就是请求的,然后其他的结构都是一样的。回应的主机在option字段中填入它的mac地址,回送给请求端。
说到这里我们会发现,肯定有人会问,那请求者不知道被请求者的地址,那么它的目的IP和mac帧的目的mac是什么。这里就用到了一个组播地址,如果是arp的话就直接IP使用广播而mac地址是使用全f进行arp报文的转发,这样就使得二层交换流量增加,这边使用了组播,仅只有加入到这个组播组当中的主机才能对这个报文进行处理。
那么这个组播是啥呢,来个专业的定义:
-
被请求节点组播地址
被请求节点组播地址通过节点的单播或任播地址生成。当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于邻居发现机制和地址重复检测功能。
IPv6中没有广播地址,也不使用ARP。但是仍然需要从IP地址解析到MAC地址的功能。在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。
简单来说就是假如一个设备若拥有了一个单播或者任播地址,那么它就相当于加入到一个组播组当中,于是处于这个组播组当中的主机就必须对这个NS报文做出回应。
这个组播地址叫做被请求节点的组播地址,它的形成也是很有特点,它的地址格式是:
-
FF02::1:FF00:0/104
这个地址仅仅使用了104位,还有24为使用单播地址的最后24位,组播地址就与IP地址扯上了关系,因此就可以进一步缩小组播组的范围,同时还减少了各个接受设备的处理量,因为只有检查到第二层之后,如果发现后面24位不会对应,于是就丢弃。
但是这个仅仅是三层的目的IP,那目的mac是多少呢。mac地址使用使用这样的格式:
3333+单播地址后32位,于是目的mac和目的IP都形成了,而且目的IP和目的mac都与
被请求者的IP地址相关联,这就使得设备对这类报文的处理可以在低层进行判断是否接受。
最后我们再来总结一下NS报文的目的IP和目的MAC如何形成:
1、首先确定被请求节点的地址格式为:
FF02::1:FF00/104
2、将地址被请求者的单播IP地址的后24位填补在被请求节点地址的背后形成NS报文的目的IP地址
3、将3333+被请求节点地址的后32位形成NS报文的目的mac地址。