邻居发现协议(NDP–Neighbor Discovery Protocol) 是指用icmpv6协议实现的一种路由协议; IPv6 环境中的常规主机和路由器都依赖于NDP 来帮助实现重要的信息交换。


NDP报文种类:


  • 路由器请求(RS)
  • 路由器宣告(RA)
  • 邻居请求(NS)
  • 邻居宣告(NA)
  • 重定向(RD)

1.邻居请求&公告消息代替ARP


在IPv4中ARP由本地链路地址上的节点用来确定其他节点的链路层MAC地址。每个节点维护一个ARP缓存,缓存中包含ARP获悉的节点的链路层地址。

在IPv6中,对节点链路层MAC地址的确认使用邻居请求消息(ICMPv6类型135)、邻居公告消息(ICMPv6类型136)和被请求节点多播地址(FF02::1:FFxx:xxxx)的组合

4-ipv6基础知识之-邻居发现协议NDP_重定向

在IPv6中使用的NDP比IPv4中的ARP效率高很多:


  • 在IPv6中,只有关系这个机制的邻居节点才会在它们的协议栈中处理邻居请求和邻居公告消息。在IPv4中,ARP广播消息用来发现一个节点的链路层地址,但是ARP广播迫使本地链路上的所有节点都把ARP广播消息发给IPv4协议栈。
  • 在IPv6中,节点在相同的请求中互相交换链路层地址。在IPv4中,需要两个ARP广播消息才能够得到相同的结果。
  • 验证邻居缓存中的IPv6地址和链路层地址的可达性,在IPv4的ARP中,表项过期后被删除。

openwrt上面查看邻居表

root@zihome:/# ip -6 neighbor show
fe80::8a:169d:ba8e:7802 dev br-lan lladdr bc:a9:20:8d:18:d1 STALE
fe80::c8e8:4a5:7ff9:b706 dev br-lan lladdr a0:a4:c5:1e:61:c1 STALE
fe80::2a35:45ff:feea:743e dev br-lan lladdr 28:35:45:ea:74:3e STALE
fe80::94df:e550:f5aa:973c dev br-lan lladdr ec:41:18:7c:15:0b STALE
fe80::811:ddc0:eb48:6fa2 dev br-lan lladdr 20:ab:37:8d:c2:f6 REACHABLE
fe80::ba3d:4eff:feaa:449b dev br-lan lladdr b8:3d:4e:aa:44:9b STALE

root@zihome:/# ip -4 neighbor show
192.168.18.174 dev br-lan FAILED
192.168.18.127 dev br-lan lladdr a0:a4:c5:1e:61:c1 REACHABLE
192.168.18.155 dev br-lan lladdr ec:41:18:7c:15:0b STALE
192.168.18.161 dev br-lan FAILED
192.168.18.176 dev br-lan FAILED
192.168.18.145 dev br-lan lladdr 20:ab:37:8d:c2:f6 REACHABLE
192.168.18.146 dev br-lan FAILED

2.路由器请求&公告(RS&RA)/无状态自动分配地址

无状态自动配置地址是IPv6最具吸引力和最有用的新特性之一。

在IPv6中可以使用路由器公告消息RA (ICMPv6类型134) ,通过节点的多播地址(FF02::1)定时发送前缀地址给节点,节点收到RA消息的前缀地址后再根据EUI64规则生成一个IPv6单播地址。

由于路由器的定时发布有一定的时间间隔,所以节点也可以主动发送路由器请求消息RS(ICMPv6类型133)获取前缀地址。节点发送RS消息到路由器的多播地址(FF02::2),路由器收到后就会直接返回附带前缀地址的RA消息给对应的节点。

路由器定时发送RA过程如下:

4-ipv6基础知识之-邻居发现协议NDP_链路层_02

节点主动发送RS请求过程如下:

4-ipv6基础知识之-邻居发现协议NDP_重定向_03

3.重复地址检测DAD

DAD是无状态自动配置和节点启动时的一个NDP机制,在节点使用无状态自动配置的IPv6单播地址之前,必须在本地链路上验证要使用的临时地址值是唯一的并且未被其他节点使用。

DAD使用邻居请求消息(ICMPv6类型135)和被请求节点的多播地址完成这个任务,节点A发送邻居请求消息,使用被请求节点的多播地址为目的地址。

只要有节点对这个请求应答,就说明这个单播IPv6地址已经被另外一个节点使用,没有则说明在本地链路上是唯一的,可以使用这个地址。

重复地址检测DAD过程如下:

4-ipv6基础知识之-邻居发现协议NDP_链路_04

4.前缀重新编址

因为IPv6协议的严格路由聚合,当一个组织机构决定改变IPv6提供商时,它必须进行前缀重新编址,前缀重新编址允许节点从以前的网络前缀平稳地过度到新的前缀。

前缀重新编址由在本地公告前置的路由器执行,这个机制使用与前缀公告机制相同,使用路由器公告消息RA (ICMPv6类型134)和多播地址(FF02::1)实现。

前缀重新编址过程


  • 站点中的所有路由器继续公告当前的前缀,但是有效期和首选生存期被减少到接近于0的一值,然后路由器开始在本地链路公告新的前缀。
  • 节点收到路由器的公告消息后,节点会有两个单播地址,一个基于旧的前缀,一个基于新的前缀,但是旧的前缀有效期只有很短,所以经过一段短暂的过渡期,节点就平稳的切换到新的前缀地址。

5.路由器重定向

IPv6中的路由器重定向机制使用重定向消息(ICMPv6类型137)。

路由器使用ICMPv6重定向消息通知链路上的节点,链路上存在一个更好的转发数据包的路由器,接收到这个ICMPv6重定向消息包的节点可以根据新的路由器地址修改它的本地路由选择表,后期访问改地址的时候就用新的路由地址发送请求数据。

4-ipv6基础知识之-邻居发现协议NDP_链路层_05

6.NDP消息总结

机制

ICMPv6消息

多播地址

代替ARP

类型135(邻居请求),类型136(邻居公告)

所有节点的多播(FF02::1),被请求节点的多播(FF02::1FFxx:xxxx)

前缀公告

类型133(路由器请求),类型134(路由器公告)

所有节点的多播(FF02::1),所有路由器的多播(FF02::2)

DAD

类型135(邻居请求)

被请求节点的多播(FF02::1FFxx:xxxx)

前缀重新编址

类型133(路由器请求),类型134(路由器公告)

所有节点的多播(FF02::1),所有路由器的多播(FF02::2)

路由器重定向

类型137(路由器重定向)

-

参考文档《深入解析IPv6》《Cisco ipv6网络实现技术》