IPv6邻居发现协议
NDP(Neighbor Discovery Protocol,邻居发现协议)是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。
1.地址解析:地址解析是一种确定目的节点的链路层地址的方法。NDP中的地址解析功能不仅替代了原IPv4中的ARP,同时还用邻居不可达检测(NUD)方法来维持邻居节点之间的可达性状态信息。
2.无状态地址配置:NDP中特有的地址自动配置机制,包括一些列相关功能,如路由器发现、接口ID自动生成、重复地址监测等。通过无状态自动配置机制,链路上的节点可以自动获得IPv6全球单播地址。
a)路由器发现:路由器与其他相连的链路上发布网络参数信息,主机捕获此信息后,可以获得全球单播IPv6地址前缀、默认路由、链路参数(链路MTU)等信息。
b)接口ID自动生成:主机根据EUI-64规范或其他方式为接口自动生成接口标识符。
c)重复地址监测(DAD):根据前缀信息生成或手动配置IPv6地址后,为保证该地址的唯一性,在其可以使用之前,主机需要检验它是否已被链路上的其他节点所使用。
d)前缀重新编址:当网络前缀变化时,路由器在与其相连的链路上发布新的网络参数信息,主机捕获这些新信息后,重新配置前缀、链路MTU等地址相关信息。
3.路由重定向:当在本地链路上存在一个更好的到达目的网络的路由器时,路由器需要通告节点来进行相应配置改变。
NDP定义了5种ICMPv6报文类型,包括RS、RA、NS、NA和Redirect报文,如表所示。
ICMPv6报文类型
IPv6地址解析
地址解析在报文转发过程中具有至关重要的作用。当一个节点需要得到同一条链路上另外一个节点的链路层地址时,需要进行地址解析。IPv6使用NDP实现了这个功能,且有所增强。IPv6的地址解析过程包括两部分:一部分解析目的IP地址所对应的链路层地址;另一部分是邻居可达性状态的维护过程,即邻居不可达检测。
1、地址解析
与IPv4的ARP相比,IPv6地址解析技术工作在OSI参考模型的网络层,与链路层协议无关。这一特点的益处如下:
(1)加强了地址解析协议与底层链路的独立性。对每一种链路层协议都使用相同的地址解析,无须再为每一种链路层协议定义一个新的地址解析协议。
(2)增强了安全性。在第三层实现地址解析可以利用三层标准的安全认证机制来防止ARP攻击和ARP欺骗。
(3)减小了报文传播范围。IPv6的地址解析利用三层组播寻址限制了报文的传播范围,可节省网络带宽。
在IPv6中,NDP通过在节点间交互NS和NA报文完成IPv6地址到链路层地址的解析,然后通过解析后得到的链路层地址和IPv6等地址信息来建立相应的邻居缓存表项。
如下图2-10所示,NodeA的链路层地址为00E0-FC00-0001,全局地址为1::1:A;NodeB的链路层地址为00E0-FC00-0002,全局地址为1::2:B。当NodeA要发送数据报文到NodeB时,需要NDP完成地址解析过程。
(1)NodeA发送一个NS报文到链路上,目的IPv6地址为NodeB对应的被请求节点组播地址(FF02::1:FF02:B),选项字段中携带了NodeA的链路层地址00E0-FC00-0001。
(2)NodeB接收到该NS报文后,由于报文的目的地址FF02::1::FF02:B是NodeB的被请求节点组播地址,所以NodeB会处理该报文;同时,根据NS报文中的源地址和源链路层地址选项更新自己的邻居缓存表项。
(3)NodeB发送一个NA报文来应答NS,同时在消息的目标链路层地址选项中携带自己的链路层地址00E0-FC00-0002。
(4)NodeA接收到NA报文后,根据报文中携带的NodeB链路层地址,创建一个到目标节点NodeB的邻居缓存表项。
图2-10 地址解析
通过交互,NodeA和NodeB就获得了对方的链路层地址,建立起了到达对方的邻居缓存表项,从而可以相互通信。
当一个节点的链路层地址发生改变时,将以所有节点组播地址FF02::1为目的地址发送NA报文,通知链路上的其他节点更新邻居缓存表项。
2.邻居不可达检测(NUD)
NUD(Neighbor Unreachable Detection,邻居不可达检测)是节点确定邻居可达性的过程。邻居不可达检测机制通过邻居可达性状态机来描述邻居的可达性。
邻居可达性状态机保存在邻居缓存表中,共有如下6种状态:
(1)INCOMPLETE(未完成状态):表示正在解析地址,但邻居链路层地址尚未确定。
(2)REACHABLE(可达状态):表示地址解析成功,该邻居可达。
(3)STALE(失效状态):表示可达时间耗尽,未确定邻居是否可达。
(4)DELAY(延迟状态):表示未确定邻居是否可达。DELAY状态不是一个稳定的状态,而是一个延时等待状态。
(5)PROBE(探测状态):节点会向处于PROBE状态的邻居持续发送NS报文。
(6)EMPTY(空闲状态):表示节点上没有相关邻接点的邻居缓存表项。
图2-11 邻居状态机
图中实线箭头表示由NS/NA报文交互导致的状态变化,各状态间的相互转换如下:
① 在EMPTY状态时,如果有报文要发送给邻接节点,则在本地邻居缓存表建立该邻接节点的表项,并将该表项置于INCOMPLETE状态,同时向邻接节点以组播方式发送NS报文。
② 节点收到邻居回应的单播NA报文后,将处于INCOMPLETE状态的邻居缓存表项转化为REACHABLE状态。如果地址解析失败(发出的组播NS超时),则删除该表项。
③ 处于REACHABLE状态的表项,如果在REACHABLE_TIME时间内没有收到关于该邻居的"可达性证实信息",则进入STALE状态。此外,如果该节点收到邻居节点发出的非S置位NA报文,并且链路层地址有变化,相关表项会进入STALE状态。
④ 处于STALE状态的表项,当有报文发往该邻居时,这个报文会利用缓存的链路层地址进行封装,并使该表项进入DELAY状态,等待收到"可达性证实信息"。
⑤ 进入DELAY状态后,如果DELAY_FIRST_PROBE_TIME时间之内还未收到关于该邻居的"可达性证实信息",则该表项进入PROBE状态。
⑥ 在PROBE状态时,节点会周期性地用NS报文来探测邻居的可达性,探测最大时间间隔为RETRANS_TIMER,在最多尝试MAX_ UNICAST_SOLICIT次后,如果仍未收到邻居回应的NA报文,则认为该邻居已不可达,该表项将被删除。
NodeA上,NodeB的表项处于STALE状态。此时若NodeA有报文发往NodeB,且没有上层协议能够提供到NodeB的"可达性证实信息"时,则NodeA需要重新验证到NodeB的可达性。
NUD过程与地址解析过程的主要不同之处在于以下两点:
(1)NUD的NS报文的目的MAC是目的节点的MAC地址;目的IPv6地址为NodeB的单播地址,而不是被请求节点组播地址。
(2)NA报文中的S标记须置位,表示是可达性确认报文,即这个NA报文是专门响应NS报文的。
无状态地址自动配置
IPv6同时定义了无状态和有状态地址自动配置机制。有状态地址自动配置使用DHCPv6来给主机动态分配IPv6地址,无状态地址自动配置通过NDP来实现。在无状态地址自动配置中,主机通过接收链路上的路由器发出的RA消息,结合接口的标识符而生成一个全球单播地址。
1.路由器发现
路由器发现是指主机定位本地链路上的路由器和确定其配置信息的过程,主要包含以下3方面内容:
(1)路由器发现(Router Discovery):主机发现邻居路由器及选择某一个路由器作为默认网关的过程。
(2)前缀发现(Prefix Discovery):主机发现本地链路上的一组IPv6前缀,生成前缀列表。该列表用于主机的地址自动配置和on-link判断。
(3)参数发现(Parameter Discovery):主机发现相关操作参数的过程,如MTU、报文的默认跳数限制、地址分配方式等信息。
2.重复地址检测
DAD(Duplicate Address Detection,重复地址检测)是节点确定即将使用的地址是否在链路上唯一的过程。所有的IPv6单播地址,包括自动配置或手动配置的单播地址,在节点使用之前必须要通过重复地址检测。
DAD机制通过NS和NA报文实现。节点会发送NS报文,其源地址为未指定地址,目的地址为接口配置的IPv6地址。在NS报文发送到链路上后,如果在规定时间内没有收到应答的NA报文,则认为这个单播地址在链路上是唯一的,可以分配给接口;反之,如果收到应答的NA报文,则表明这个地址已经被其他节点所使用,不能配置到接口。
3.前缀重新编址
前缀重新编址(Prefix Renumbering)允许网络从以前的前缀平稳地过渡到新的前缀,用于提供对用户透明的网络重新编址能力。路由器通过RA报文中的优先时间和有效时间参数来实现前缀重新编址。
(1)优先时间(Preferred Lifetime):无状态自动配置得到的地址保持优先选择状态的时间。
(2)有效时间(Valid Lifetime):地址保持有效状态的时间。
对于一个地址或前缀,优先时间小于或等于有效时间。当地址的优先时间到期时,该地址不能被用来建立新连接,但是在有效时间内,该地址还能用来保持以前建立的连接。
在重新编址时,站点内的路由器会继续通告当前前缀,但是有效时间和优先时间将被减小到接近于0;同时路由器开始通告新的前缀。这样,在每个链路上至少有两个前缀共存,RA消息中包括一个旧的和一个新的IPv6前缀信息。
4.无状态地址自动配置过程
NDP的无状态自动配置包含两个阶段:链路本地地址的配置和全球单播地址的配置。当一个接口启用时,主机会首先根据本地前缀FE80::/64和EUI-64接口标识符,为该接口生成一个链路本地地址,如果在后续的DAD中发生地址冲突,则必须对该接口手动配置本地链路地址,否则该接口将不可用。
需要说明的是,一个链路本地地址的优先时间和有效时间是无限的,永远不超时。
对于主机上全球单播地址的配置步骤如下:
① 主机节点NodeA在配置好链路本地地址后,发送RS报文,请求路由器的前缀信息。
② 路由器收到RS报文后,发送单播RA报文,携带用于无状态地址自动配置的前缀信息,同时路由器也会周期性地发送组播RA报文。
③ NodeA收到RA报文后,根据前缀信息和配置信息生成一个临时的全球单播地址。同时启动DAD,发送NS报文验证临时地址的唯一性,此时该地址处于临时状态。
④ 链路上的其他节点收到DAD的NS报文后,如果没有用户使用该地址,则丢弃报文,否则产生应答NS的NA报文。
⑤ NodeA如果没有收到DAD的NA报文,说明地址是全局唯一的,则用该临时地址初始化接口,此时地址进入有效状态。
地址自动配置完成后,路由器可以自动进行NUD,周期性地发送NS报文,探测该地址是否可达。
路由器重定向
在重定向过程中,路由器通过发送重定向报文来通知链路上的报文发送节点,在同一链路上存在一个更优的转发数据报文的路由器。接收到该消息的节点据此修改其本地路由表项。路由器仅为单播数据流发送重定向报文,而重定向报文也仅以单播形式发送到始发主机,并且只会被始发节点处理。
如图2-12所示,NodeA的默认路由器为RTA,现在NodeA想发送数据报文到NodeB,路由器重定向机制需要经过以下过程:
(1)NodeA首先传送第一个数据报文到它的默认路由器RTA,当该报文经过RTB到达NodeB后,RTA知道RTB是链路上转发报文的更好选择。
(2)RTA向始发报文的NodeA发送一个ICMPv6重定向报文,目标地址中含有RTB的IPv6地址,报文选项字段的目标链路层地址中含有RTB的链路层地址。
(3)NodeA获悉RTB是到NodeB的更好路径后,修改自己的目的缓存表,当再发送到NodeB的报文时优先发送到RTB,重定向完成。