邻居发现协议(NDP,Neighbor Discovery Protocol)是TCP/IP协议栈的一部分,主要与IPv6共同使用。它工作在网络层,负责在链路上发现其他节点和相应的地址,并确定可用路由和维护关于可用路径和其他活动节点的信息可达性。
邻居发现协议定义了5种ICMPv6类型
- 路由请求(RS,Router Solicitation)
- 路由通告(RA,Router Advertisement)
- 邻居请求(NS,Neighbor Solicitation)
- 邻居通告(NA,Neighbor Advertisement)
- 重定向
一、邻居请求和邻居通告
和ARP协议一样,NS和NR用来做链路层地址(mac地址)解析。
下图是使用华为eNSP做的拓扑图:
eNSP是一个网络模拟器,可以虚拟网络环境。

NS NR实验
CLIENT1配置静态IPv6地址,2000::1/64。
CLIENT2配置静态IPv6地址,2000::2/64。

CLIENT1配置
两台主机使用交换机连接起来,在CLIENT1 ping CLIENT2。

并且在CLIENT2上抓包,使用wireshark分析。

NS报文
CLIENT1在ping CLIENT2的时候,首先会查本地的邻居表(linux下使用
ip -6 neigh查看)。如果到CLIENT2是可达的,就直接向CLIENT2发送request请求,否则就会发送NS报文来学习CLIENT2的mac地址。学习对方链路地址的过程:
CLIENT1要ping 2000::2,首先要向ff02::1:ff00:2组发送一个组播,即NS报文,并在NS报文的ICMPv6 Option中附上自己的mac地址。
所有收到这个NS包的主机会检查自己是否在这个组内,CLINET2在收到包时,发现自己在这个组里就把自己的mac写到ICMPv6 Option中回给CLIENT1,并把CLIENT2的mac地址记录下来。

NA报文