IPv6基本功能包括 IPv6邻居发现协议(邻居发现、路由器发现、无状态地址自动配置、重定向)、IPv6路径 MTU发现协议以及 IPv6域名解析。其中路由器发现和无状态地址自动配置是IPv6新增的功能,邻居发现功能类似于IPv4中的 ARP功能,但做了改进和增强。
2.2.1 IPv6 邻居发现协议
IPv6邻居发现协议使用 ICMPv6消息和被请求节点的组播地址来得到同一网络(本地链路)上某个邻居的链路层地址,验证邻居的可达性,找到邻居路由器。每个IPv6节点都必须加入和单播与泛播地址对应的多播组。IPv6邻居发现协议主要包括邻居发现、路由器发现、无状态地址自动配置、重定向。
1. 邻居发现
邻居发现功能和IPv4中的ARP功能类似,通过邻居请求和邻居通告机制实现。
(1) 邻居请求
当一个节点需要得到同一本地链路上另外一个节点的链路本地地址时,就会发送邻居请求报文。此报文类似于IPv4中的 ARP请求报文,不过使用多播地址而不使用广播,只有被请求节点的最后 24bit和此组播相同的节点才会收到此报文,降低了广播风暴的可能性。源节点使用目的节点的 IPv6地址的最右 24bit形成相应的多播地址,然后在相应链路上发送ICMPv6类型为 135的报文。目的节点在响应报文中填充其链路地址。为了发送邻居请求报文,源节点必须首先知道目的节点的IPv6地址。邻居请求报文也用来在邻居的链路层地址已知时验证邻居的可达性。
(2) 邻居通告
IPv6邻居通告报文是对 IPv6邻居请求报文的响应。如图2-11所示,收到邻居请求报文后,目的节点通过在本地链路上发送ICMPv6类型为 136的邻居通告报文进行响应。收到邻居通告报文后,源节点和目的节点可以进行通信。当一个节点的本地链路上的链路层地址改变时也会主动发送邻居通告报文。
图2-11 IPv6邻居发现示意
IPv6邻居发现只要一次报文交互就可以互相学习到对方的链路层地址,而IPv4的 ARP实现此功能需要两次报文交互,因此 IPv6邻居发现的效率比较高。另外,IPv6邻居发现是在 IP层实现的,理论上可以支持各种传输媒介,这也是针对 IPv4中的 ARP改进的。
2. 路由器发现
路由器发现用来定位邻居路由器,同时学习和地址自动配置有关的前缀和配置参数。IPv6路由器发现通过下面两种机制实现。
(1) 路由器请求
当主机没有配置单播地址(例如,系统刚启动)时,就会发送路由器请求报文。路由器请求报文有助于主机迅速进行自动配置而不必等待IPv6路由器的周期性IPv6路由器通告报文。IPv6路由请求也是 ICMP报文,类型为 133。IPv6路由器请求报文中的源地址通常为未指定的IPv6地址(0::0)。如果主机已经配置了一个单播地址,则此接口的单播地址可在发送路由器请求报文时作为源地址填充。IPv6 路由器请求报文中的目的地址是所有路由器的多播地址(FF02::2),作用域为本地链路。如果路由器通告是针对路由器请求发出的,则其目的地址为相应路由器请求报文的 源地址。
(2) 路由器通告
每个IPv6路由器的配置接口会周期性地发送路由器通告报文。在本地链路上收到 IPv6节点的路由器请求报文后,路由器也会发送路由器通告报文。IPv6路由器通告报文发送到所有节点的链路本地多播地址(FF02::1)或发送到路由器请求报文节点的 IPv6单播地址。路由器通告为 ICMP报文,类型为 134,包括是否使用地址自动配置、标记支持的自动配置类型(无状态或有状态自动配置)、一个或多个本 地链路前缀——本地链路上的节点可以使用这些前缀完成地址自动配置、通告的本 地链路前缀的生存期、是否发送路由器通告的路由器可作为缺省路由器,如果可以, 还包括此路由器作为缺省路由器的时间(用秒表示)和与主机相关的其他信息,如跳数限制,主机发起的报文可以使用的 MTU。本地链路上的IPv6节点接收路由器通告报文,并用其中的信息得到更新的缺省路由器、前缀列表以及其他配置,如图 2-12所示。
图2-12 IPv6路由器通告示意
3. 无状态地址自动配置
通过使用路由器通告报文(和针对每一前缀的标记),路由器可以通知主机如何进行地址自动配置。例如,路由器可以指定主机是使用有状态(DHCPv6)地址 自动配置还是无状态地址自动配置。主机收到路由器通告报文后,使用其中的前缀信息和本地接口ID自动形成 IPv6地址,同时还可以根据其中的默认路由器信息设置默认路由器。使用无状态地址自动配置可以使IPv6节点很容易完成地址重新编址,降低了网络重新部署的复杂性。进行重新编址时,路由器通告报文中既包括旧的前缀也包括新的前缀。旧的前缀的生存期缩短,促使节点使用新的前缀,同时保证现有连接可以继续使用旧的前缀。其间,节点同时具有新旧两个单播地址。当旧的前缀不再使用时,路由器只通告新的前缀。
4. 重定向
和 IPv4类似,IPv6路由器发送重定向报文的目的仅限于把报文重新路由到更合适的路由器。收到重定向报文的节点随后会把后续报文发送到更合适的路由器。路由器只针对单播流发送重定向报文,重定向报文只发给引起重定向的报文的发起节点(主机),并被处理。