Bootstrap

IPv6之邻居发现协议NDP

通过文章《认识IPv6》,我们了解了IPv6产生的背景原因,了解了IPv6的地址格式,单播、组播、任播的基础知识。那么接下来最重要的就是终端如何通过IPv6网络访问网络上的其它主机。一个终端如果要访问IPv6网络上的的资源,和IPv4一样,有非常关键的步骤是需要分配一个IPv6的地址,知道自己所处的子网,知道网关地址,知道DNS server地址。我们的第一反应肯定是有一个支持IPv6协议的DHCPv6的服务器,和IPv4走一样的过程,这个想法是正确的,的确IPv6主机可以通过DHCPv6的服务器进行有状态的IP分配。但更重要的是,IPv6有了更加简洁的地址分配方式,这就是我们接下去要介绍的邻居发现协议NDP,通过NDP可以实现上述的IPv6地址的自动分配,分配子网,分配网关地址,知道DNS server地址等。下面会针对IPv6邻居发现协议提供的功能做一些原理和过程的入门讲述。

1、IPv4里的地址分配与配置

开始NDP协议介绍前,我们先来回顾一下IPv4的这个过程,通常来说在IPv4里,我们需要ARP协议和DHCP协议,来完成地址分配以及告诉新加入的主机当前网络拓扑配置的过程。

  • ARP协议
    通过ARP广播和ARP请求,完成子网内各个主机和网关的IP地址和MAC地址的映射
  • DHCP协议
    通过广播DHCP请求,向DHCP服务器请求后,DHCP服务器给新加入网络的主机分配IP地址,网关地址,DNS服务器地址,子网掩码等

通过上述二种协议的ARP和DHCP过程后,就可以正常访问网络了(当然网络配置也可以通过手动配置完成,如果手动配置网络的话,DHCP服务和过程就不再被需要了)。

在IPv6中,通常来说,设计了更为简单的NDP协议和NDP过程取代了IPv4里的上述二种协议和二种过程。我们知道IPv6不再支持广播,我们可以简单的理解为IPv6里,用组播的功能来取代广播,在IP地址分配等需要广播的过程中使用组播来代替了广播。NDP协议是基于IPv6的组播进行工作的,所以开始下面NDP之前,需要大家已经对IPv6的组播有了一定的了解。

2、NDP协议概述

NDP(Neighbor Discovery Protocol,邻居发现协议)是IPv6协议体系中一个重要的基础协议。IPv6网络中的主机能够使用唯一的链路本地地址自动配置自身,而一旦主机获得IPv6地址,它就自动加入了多个多播组。 那么NDP协议就通过这些组播地址,完成网络地址分配与配置的过程。NDP主要是通过ICMPv6报文实现以下功能:

• 无状态自动配置:路由器发现、前缀发现、参数发现;

• 重复地址检测(DAD),相当于IPv4的免费ARP;

• 地址解析,相当于IPv4的ARP;

• 邻居不可达检测(NUD);

•路由器重定向。

2.1、无状态自动配置

区别于手动配置,IPv6的自动配置通常分成通过DHCPv6服务器进行的有状态自动配置和不需要DHCPv6服务器的无状态自动配置二种。我们可以将无状态自动配置理解为简化版的DHCP,它是一个无状态的配置过程。这个过程中用到的最重要的就是四个消息:路由器通告消息(RA)与路由器请求消息(RS),邻居请求报文(NS)和邻居通告报文(NA)。

  • 路由器通告消息(RA)
    每台路由器以组播方式定时发送RA报文,用于在二层网络中通告自己的存在。RA报文中会带有网络前缀信息。

  • 路由器请求消息(RS)
    主机接入网络后希望尽快获取网络前缀进行通信,那么主机可以立刻以组播的方式主动发送RS报文,网络上的路由器收到RS请求后,将用RA报文进行回应。

  • 邻居请求报文(NS)
    发送到FF02::1:FF00:0/104,可以简单的理解为IPv4中的ARP请求报文

  • 邻居通告报文(NA)
    发送到FF02::1,可以简单的理解为IPv4中的ARP应答报文

2.1.1、无状态自动配置过程

服务器主机 路由器 路由器或者链路上任意节点 接入网络,根据接口标识产生链路本地地址 发出邻居请求NS消息到FF02::1:FF00:0/104(链路上所有节点),进行重复地址检测 如果有人占有了NS里发布的IP地址,则发回NA消息否则什么都不做 如果收到NA,表里冲突发生,则停止等待手工配置,否则进行下一步 发出路由器请求消息RS到FF02::2(链路上所有路由器) 路由器返回路由器通告消息RA到FF02::1(链路上所有节点),能告路由前缀 根据RA报文中的前缀信息和通过EUI-64规范生成的接口标识获得IPv6全局单播地址 服务器主机 路由器 路由器或者链路上任意节点

2.2、重复地址检测DAD

DAD(Duplicate Address Detect,重复地址检测)是在接口开始使用某个IPv6单播地址之前,为了防止IP冲突,而进行的一个主动探测是否有其它的节点使用了该地址的过程。所有的IPv6单播地址,包括自动配置和手动配置的单播地址,在节点开始使用之前都要通过重复地址检测。IPv6重复地址检测过程和IPv4中的利用免ARP协议进行IP冲突检测的过程类似:节点向链中上所有节点组播发送NS报文。NS报文中目的地址即为该本机IP地址。如果收到任意一个站点回应的NA报文,就证明该地址已被网络上使用,则节点将不能使用该地址。

服务器主机 链路上任意节点 接入网络,根据接口标识产生链路本地地址 发出邻居请求NS消息到FF02::1:FF00:0/104(链路上所有节点),进行重复地址检测 如果有人占有了NS里发布的IP地址,则发回NA消息,否则什么都不做 发回NA消息 链路上已经有人占用了这个IP,停止等待手动配置 服务器主机 链路上任意节点

2.3、地址解析

在IPv4中,当主机需要和目标主机通信时,需要先通过ARP协议根据目标主机的IP地址获得目票主机的MAC地址。然后才可以在链路层填上正确的对方MAC地址,以完成链路层通信。在IPv6中,没有ARP协议,但同样需要从IP地址解析到MAC地址的功能,所以在IPv6中是通过邻居请求报文(NS)和邻居通告报文(NA)来解析IP地址对应的MAC地址的。

服务器主机 链路上任意节点 要与目标主机进行通信 发出邻居请求NS组播消息到FF02::1:FF00:2/104(链路上所有节点),目标MAC为3333.FF00.0002 发现自己就是NS请求的目标节点 发回NA消息,告之自己的MAC地址 开始使用NA消息中的MAC地址与目标主机进行单播通信 服务器主机 链路上任意节点

2.4、邻居不可达检测(NUD)或者跟踪邻居状态

这是一个定时的邻居节点老化更新过程,可以理解为IPv4中的ARP表的老化与更新的过程,也是借助于NS/NA消息来完成的。

2.5、路由器重定向

这是一个路由器发现有更好的路由器时,主动向主机节点发送一个路由器重定向报文,让主机节点修改默认路由的过程。

;