企业“IPv6+”网络规划设计与演进
上QQ阅读APP看书,第一时间看更新

1.2.3 ICMPv6/NDP

ICMPv6和NDP是IPv6的两个重要协议。其中,ICMPv6由IPv4的ICMP(Internet Control Message Protocol,互联网控制报文协议)引申而来。NDP作为ICMPv6的子协议,通过定义的5种ICMPv6报文实现,可实现类似IPv4中ARP(Address Resolution Protocol,地址解析协议)的地址解析功能。两类协议相结合,可以支撑实现IPv6的即插即用、无状态地址配置等功能。

1.ICMPv6简介

在IPv4中,ICMP将数据包传输过程中出现的错误信息(包括目的不可达、数据包过大、超时、回应请求和回应应答等)返回给源节点。而IPv6中,ICMPv6除了提供ICMPv4的常用功能之外,还可实现多项基础功能,如邻接点发现、无状态地址配置(包括重复地址检测)、PMTU发现等。ICMPv6的协议类型号(即IPv6报文中下一个扩展报文头字段的值)为58,最新定义可参见RFC 8335,报文格式如图1-10所示。其中,类型字段表示消息类型,字段值为0~127的是差错报文,字段值为128~255的是消息报文;编码字段则表示此消息类型细分的类型;校验和字段表示ICMPv6报文的校验和。

ICMPv6报文分为差错报文和消息报文两种。其中,差错报文用于报告在转发IPv6数据包过程中出现的错误信息,主要包括4种类型,如表1-6所示。

图1-10 ICMPv6报文格式

表1-6 ICMPv6差错报文说明

续表

ICMPv6消息报文提供诊断功能和附加的主机功能,比如组播侦听发现和ND。常见的ICMPv6消息报文主要包括回传请求(Echo Request)报文和回传应答(Echo Reply)报文,这两种报文也就是通常使用的ping报文。

•回传请求报文:回传请求报文用于发送到目标节点,以使目标节点立即发回一个回传应答报文。回传请求报文的类型字段值为128,编码字段的值为0。

•回传应答报文:当收到一个回传请求报文时,目标节点通过ICMPv6回传应答报文响应。回传应答报文的类型字段的值为129,编码字段的值为0。

2.NDP简介

NDP是IPv6体系中一个重要的基础协议,类似IPv4的ARP和IRDP(ICMP Router Discovery Protocol,ICMP路由器发现协议)功能。NDP主要功能包括地址解析、NUD(Neighbor Unreachable Detection,邻居不可达检测)、重复地址检测、路由器发现、重定向和ND代理等,均通过以下5种ICMPv6消息报文实现。

•RS(Router Solicitation,路由器请求)报文:类型字段值为133,编码字段值为0,主要用于路由器发现。主机接入网络后希望尽快获取网络前缀进行通信,因此通过RS报文向路由器发出请求,路由器则会以RA报文响应。

•RA(Router Advertisement,路由器通告)报文:类型字段值为134,编码字段值为0。路由器以组播方式周期性发布RA报文,携带网络前缀和其他标志位信息,向二层网络上的主机和设备报告自己的存在。

•邻居请求(NS)报文:类型字段值为135,编码字段值为0。IPv6节点通过NS报文得到邻居的链路层地址,检查邻居是否可达,完成地址冲突检测。在地址解析中,NS报文类似IPv4中的ARP请求报文,在ICMPv6 NS中携带希望获取对应链路层地址的IPv6地址。

•NA(Neighbor Advertisement,邻居通告)报文:类型字段值为136,编码字段值为0。NA报文是IPv6节点对NS报文的响应,同时IPv6节点在链路层变化时也可以主动发送NA报文。

•重定向(Redirect)报文:类型字段值为137,编码字段值为0。报文中会携带重定向的路径下一跳地址和需要重定向转发的报文目的地址等信息。

通过这5种报文和NDP定义的各种功能的交互流程,可以实现以下关键能力。

(1)地址解析

在IPv4中,主机和目标主机通信必须先通过ARP获得其链路层地址。在IPv6中,NDP实现了从IP地址到链路层地址的解析功能,主要通过NS报文和NA报文实现。

IPv6地址解析的过程如图1-11所示。

图1-11 IPv6地址解析的过程

Host A在向Host B发送报文之前必须先解析出其链路层地址,因此首先发送一个NS报文,报文的Source Address(源地址)字段为Host A的IPv6地址,Destination Address(目的地址)字段为Host B的被请求节点组播地址,ICMPv6 Option字段携带Host A的链路层地址。ICMP中携带需要解析的目标IP地址,即Host B的IPv6地址,表明Host A想要知道Host B的链路层地址。当Host B接收到NS报文之后,就会回应NA报文给Host A,完成地址解析。其中Source Address字段为Host B的IPv6地址,Target Address字段为Host B的IPv6地址,链路层地址使用对应的Host B的链路层地址,Host B的链路层地址被放在ICMPv6 Option字段中。

(2)邻居状态监测

通过邻居或到达邻居的通信可能因为各种原因而中断,包括硬件故障、接口卡的热插拔等,如果邻居故障未被及时发现,会影响所有经过该邻居的通信报文。因此链路中的每个节点均需要维护一张邻居表,记录每个邻居的实时状态,包括Incomplete(未完成)、Reachable(可达)、Stale(陈旧)、Delay(延迟)和Probe(探查)5种,状态之间可以迁移。邻居状态迁移示例如图1-12所示,其中Empty表示邻居表项为空。

图1-12 邻居状态迁移示例

下面以A、B两个邻居节点相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未相互通信),说明邻居状态迁移的过程。

第一步:A先发送NS报文并生成缓存条目,此时邻居状态为Incomplete。

第二步:若B回复NA报文,则A的邻居状态由Incomplete变为Reachable。否则,固定时间后,A的邻居状态由Incomplete变为Empty,即删除表项。

第三步:A进入Reachable状态后,超过邻居可达时间,邻居状态由Reachable变为Stale,即未知邻居是否可达。同时,如果A在Reachable状态下收到B的非请求NA报文,且报文中携带的B的链路层地址与表项中的不同,则邻居状态马上变为Stale。

第四步:在Stale状态下,若A要向B发送数据,则需要重新发送NS报文,且邻居状态由Stale变为Delay。

第五步:经过一段固定时间后,A的邻居状态由Delay变为Probe,其间若收到NA报文,则邻居状态由Delay变为Reachable。

第六步:在Probe状态下,A每隔一定时间间隔发送单播NS报文,发送固定次数后,如有应答,则邻居状态变为Reachable,否则邻居状态变为Empty,即删除表项。

(3)重复地址检测

IPv6自动配置要求在使用地址之前进行重复地址检测,接口使用某个IPv6单播地址之前进行重复地址检测,可以探测是否有其他节点使用了该地址。分配给某个接口的IPv6单播地址在进行重复地址检测之前称为试验地址(Tentative Address),不能用于单播通信。节点获取试验地址后,向其对应的Solicited-Node组播组发送携带该地址的NS报文。如果收到其他站点回应的NA报文,证明该地址已被使用,节点不能通过其完成通信。如果经过规定时间和规定检测次数仍未收到NA报文,则证明该地址可以使用。

图1-13给出了重复地址检测示例。

图1-13 重复地址检测示例

假设Host A的IPv6地址FC00::1为计划使用的地址,即Host A的试验地址。此时Host A会向其对应的Solicited-Node组播组发送一个以FC00::1为目的地址的NS报文进行重复地址检测。由于FC00::1并未正式指定,所以NS报文的源地址为未指定地址。当Host B收到该NS报文后,可能有以下两种情况。

•如果Host B发现FC00::1是自身的一个试验地址,则放弃使用此地址作为接口地址,并且不会发送NA报文。

•如果Host B发现FC00::1是自己已经正常使用的地址,则向所有节点组播组(即FF02::1)发送NA报文,携带FC00::1信息。Host A收到该报文后,发现自身试验地址重复,因此该试验地址不生效,被标识为Duplicated状态。

(4)路由器发现

图1-14给出了路由器发现示例。路由器发现主要用来寻找与本地链路相连的路由器设备,并获取与地址自动配置相关的前缀和其他配置参数。IPv6地址可以支持无状态的地址自动配置,即主机通过某种机制获取网络前缀信息,自动生成地址的接口标识部分。因此,路由器发现是IPv6地址自动配置功能的基础,主要通过RS和RA两种报文实现。

路由器发现功能主要应用于地址自动配置、默认路由器优先级及其路由信息发现两种场景。

图1-14 路由器发现示例

地址自动配置:通告RS和RA报文实现地址无状态自动配置。地址无状态自动配置首先自动生成链路本地地址,然后主机根据RA报文的前缀信息,自动配置全球单播地址,并获得其他相关信息。IPv6主机无状态自动配置过程如下。

第一步:主机上线,根据接口标识生成链路本地地址。

第二步:主机发送NS报文,进行链路本地地址的重复地址检测。

第三步:如地址冲突,则停止自动配置,需要手动配置;如地址不冲突,链路本地地址生效,节点具备本地链路通信能力。

第四步:主机发送RS报文(或接收到设备定期发送的RA报文),目的地址为所有路由器组播组(FF02::2)。

第五步:路由器接收到RS报文立刻回应RA报文,或定期发送RA报文,目标地址为所有节点组播组(FF02::1)。RA报文中通过ICMPv6 Option字段携带前缀信息、路由生命周期等信息。

第六步:主机根据RA报文中的前缀信息和本地接口标识生成IPv6地址。

默认路由器优先级及其路由信息发现:当主机所在的链路中存在多个路由器时,主机需要根据本地生成的路由表选择转发设备。

在RA报文中定义了默认路由优先级和路由信息两个字段。当主机收到包含路由信息的RA报文后,会学习相应的明细路由信息;当主机收到包含默认路由优先级信息的RA报文后,会添加本地的默认路由,并刷新对应路由器网关的优先级。当主机向其他设备发送报文时,通过查询路由表,选择合适的路由发送报文;当主机向其他设备发送报文时,如果没有明细路由可选,则选择本链路内优先级最高的默认路由,向所对应的路由器网关发送报文。

(5)路由重定向

当网关设备收到报文后,如果发现报文从其他网关设备转发可以获得更优的传输路径,则网关设备会发送重定向报文告知报文的发送者,让报文发送者选择传输路径更优的网关设备。网关设备收到报文后,只有同时满足如下条件才会向主机发送重定向报文。

•报文的目的地址不是一个组播地址。

•路由计算的下一跳接口与接收报文的接口相同。

•报文的最佳下一跳IP地址和报文的源IP地址处于同一网段。

•网关设备自身的邻居表项中有用报文源地址作为全球单播地址或链路本地地址的邻居。

图1-15给出了重定向示例。

图1-15 重定向示例

Host A的默认网关设备是Router A,因此要发送给Host B的报文也会被发送到Router A。当Router A发现Host A可以直接发送报文给Router B后,会向Host A发送重定向报文,其中Target Address(代表更好的下一跳)字段为Router B的链路本地地址,ICMPv6 Option字段中携带需要重定向报文的目的地址,即Host B地址。Host A接收到该重定向报文之后,会在默认路由表中添加一个主机路由,确保之后发往Host B的报文不再转发至Router A,而是直接发送给Router B。