NDP原理详解

概述:

节点使用ND,可以确定连接在同一链路上的邻居的链路层地址,快速清除已经变成无效的缓存值。主机也使用ND发现能为其转发报文的路由器。最后,节点使用此协议主动跟踪哪一个邻居可达,哪一个邻居不可达,以及侦听邻居们改变的链路层地址。当路由器或到路由器的路径出现故障时,主机主动搜索正常运行的替代者。同时IPv6支持即插即用,主机除了可以使用传统的DHCP获取地址之外,还可以完成 IPv6地址的自动配置等。

IPv6 的NDP(邻居发现协议)可以解决以下问题:

  1. 路由器发现:主机如何找到连接在同一链路上的路由器。
  2. 前缀发现:主机如何发现前缀集合
  3. 参数发现:节点如何发现链路上的参数(如链路MTU),以及互联网参数(如TTL跳数)。
  4. 地址自动配置:一种新的机制,允许节点采用无状态方式自动配置接口所需要的IP地址。
  5. 地址解析:仅知道目的地P地址时如何获得目的地的链路层地址,类似ARP。
  6. 下一跳确定:映射目的地IP地址到邻居地址的算法,发送给该目的地的流量将
  7. 会发送给该邻居地址(下一跳),下一跳可以是路由器或者目的地本身。
  8. 邻居不可达检测:节点如何确定邻居不再可达。如果邻居被用作路由器,其不可达时需要尝试替代默认路由器。
  9. 重复地址检测:用作节点确定自己想使用的地址是否已经被另一个节点所使用。
  10. 重定向:路由器如何通知主机有到达目的地更好的下一跳。

NDP整合了IPv4中的ARP、ICMP重定向ICMP路由器发现,并且进行了改进。NDP协议工作会使用如下几个地址:

  1. 未指定地址:表示发送者暂时无地址。
  2. 链路本地地址:只在链路范围内的单播地址。
  3. FF02::1(所有节点组播地址):到本链路范围内的所有节点地址。
  4. FF02::2(所有路由器多播地址):到本链路范围内的所有路由器地址。
  5. 被请求节点组播地址:由固定前缀FF02::1:FF00:0/104和单播地址的最后24位组成。

NDP协议的工作主要依靠以下5种ICMPv6的报文来实现:

  1. 路由器请求(RS)消息。
  2. 路由器通告(RA)消息。
  3. 邻居请求(NS)消息。
  4. 邻居通告(NA)消息。
  5. 重定向消息。

一、无状态自动配置:

IPv6的NDP可以利用RS和RA消息完成以下两个功能。

  1. 无状态自动配置
  2. 路由器发现

在这里插入图片描述
当PC 接入网络并加电后,会发出RS消息,路由器收到RS消息会回应RA消息,具体步骤如下:

  1. PC发出RS消息,向路由器进行请求。RS消息是通过类型为133的ICMPv6报文来发送的,发送到目标地址FF02::2。

  2. 路由器以RA消息作为回应。该消息包括PC所需要的前缀、前缀长度等信息;该消息发送到所有主机地址FF02::1。

  3. PC接收到RA消息后,使用其中的前缀和前缀长度信息完成地址的自动配置;PC还会将RA消息中宣告的链路本地地址添加到本地的默认路由器列表中,并将该路由器作为默认网关。

  4. PC 完成地址的自动生成过程后,在使用该地址前还会进行DAD(重复地址检测)的过程以确认该地址是否被其他设备使用。

二、路由器发现:

如果该局域网中有两台路由器同时为主机提供RA消息,如图所示:
在这里插入图片描述
RA消息的格式中在Flag字段中有一个Router preference的标志位,该标记位用于主机选择默认网关,如图所示。
在这里插入图片描述

主机根据路由器在各自RA消息中通告的优先级选择默认网关,共有3个优先等级:low、medium、high。华为路由器发出的RA消息中的默认级别为中级,主机最终会在所有路由器中间选择优先级最高的路由器作为默认网关。如果所有路由器的优先级都一样,那么主机将这些路由器都用作默认网关,也就是使用负载分担的方式。

路由器每隔一段周期向网络中发送RA消息,华为路由器默认间隔是200~600s 之间的一个随机值。以此通告IPv6 的前缀,华为路由器默认不开启RA通告,使用命令: undo ipv6 nd ra halt可以开启IPv6RA通告功能。

在图下图显示的RA消息选项中,还有两个字段需要介绍一下:优选生存期(PrefereredLifetime)和有效生存期(Valid Lifetime)。当一个IPv6地址刚被配置在接口上时,这个地址叫试验地址,这个地址还不能立刻被用于通信,必须先进行DAD(地址冲突检测);如果通过地址冲突检测并且无冲突后,即可被视为优选地址。
在这里插入图片描述

优选生存期就是指主机将以无状态自动配置方式生成的地址视为优选地址的时间(以s为单位)。主机可以使用优选地址跟其他设备进行通信。如果优选生存期到期,设备不再使用该地址创建新的通信连接。有效生存期是指主机收到的来自路由器RA消息中的前缀可以使用的时间(以s 为单位),有效生存期必须大于优选生存期,在优选生存期到期后,有效生存期到期前,主机通过该地址已建立的连接还是继续可以用的,直到该地址的有效生存期到期。

三、地址解析:

IPv6的NDP可以利用NS和NA消息完成以下三个功能。

  1. 地址解析
  2. DAD(重复地址检测)
  3. NUD(邻居不可达性检测)

地址解析是指使用NS和 NA消息来完成IPv6地址到链路层地址映射的过程,该过程类似于IPv4中的ARP,如下图所示:
在这里插入图片描述
注意:在图中的网络中,有可能存在IPv6地址最后24比特和PC2相同的的设备,当这些设备接收到PC1的NS报文时,根据ICMPv6报文中的目标地址来辨别该报文是否是发给自己的。也就是说,即使同个局域网中有多台设备的单播IPv6地址最后24比特位相同,也不会影响地址解析的进程。

PC1准备访问PC2之前,首先在本地邻居表中查找PC2 IPv6地址对应的以太网MAC地址,如果查找到相关表项,则将发往 PC2的数据包封装在以太数据帧中然后发出;如果没有找到PC2的MAC地址,则发送NS消息用来请求其链路层地址。报文如图所示:
在这里插入图片描述
PC1的NS报文是发送到一个组播IPv6地址,这个地址我们称为请求节点组播地址。一个IPv6接口会通过自动映射技术为自己的每个单播地址(包括链路本地地址)创建一个请求节点组播地址。该地址由固定的前缀加上IPv6单播地址的最后24bit位构成,前缀是FF02:0:0:0:0:1:FF00::/104。在图 1-46中,PC2的 IPv6地址是2001::2/64,它的最后24位为00:0002,加上前缀,它的请求组播地址为FF02:0:0:0:0:1:FF00::2。当PC2接收到这份NS报文后,识别目标地址自己接口的请求组播地址,因此会接收和处理该数据包,并且给予NA报文响应。

地址具体的步骤如下:

  1. PC1向PC2的请求节点的组播地址发送NS消息,该消息是通过类型为135。
  2. PC2收到NS消息后,以单播的方式向PC1回应NA消息,该消息中包含了PC2的MAC地址。PC2还会将PC1的 IPv6地址和MAC地址添加至本地的邻居缓存表中。
  3. PC1收到来自PC2的NA消息后,将PC2的IPv6地址以及它的MAC地址添加至本地的邻居缓存表中。

四、DAD(重复地址检查):

网络中的设备可以使用DAD机制来确认自己用的IPv6地址是否被其他设备使用。如果一个接口配置了多个IPv6单播地址(包括链路本地地址或全局单播地址),每个地址在使用之前,都需要执行DAD的过程。如果通过DAD过程发现了重复地址,那么接口就不能使用该地址。如图下图所示,PC1配置了地址2001::1(通过手工或无状态自动配置或通过DHCPv6自动获取),PC1在使用该地址前必须进行DAD,具体步骤如下:
在这里插入图片描述

  1. PC1配置了地址2001::1,该地址在进行DAD过程之前称为试验(tentative)地址。
  2. PC1发出NS消息以确定网络中是否还有其他设备使用该IPv6地址。如图所示,PC1发出 NS消息,目标IPv6地址是2001::1对应的请求组播地址。
  3. 如果这时 PC2的IPv6地址是2001::1,那么它在收到PC1的NS消息后会用NA消息进行响应,告诉PC1它也在使用该地址;否则不会响应。
  4. PC1在发送出NS消息后会设置一个定时器,如果在定时器内接收到了NA响应,说明该试验地址已经被其他设备占用,PC1会停止使用该地址;如果在定时器内,没有收到NA响应,说明该地址可以使用,那么该地址会从试验状态切换到已分配( assigned)状态。

五、NUD(邻居不可达性检测):

对于NDP来说,它会将已发现的邻居设备放在邻居缓存表,该表中包含了邻居IPv6地址及其对应的二层地址(通常是以太网MAC地址),相当于IPv4的ARP缓存表。NDP为维护邻居缓存表,会定期跟踪邻居的状态。NUD就是用来检测邻居状态的进程,通过定期发送NS以确定邻居的状态。RFC4861中定义了5种邻居状态,解释了这些状态以及在这些状态之间的事件。NUD利用这些状态以及状态之间的切换过程来检测和解析邻居的可达性问题。各状态的解析如下:
在这里插入图片描述

  1. INCOMPLETE(未完成状态):此状态表示地址解析还在进行,本机已经发送NS消息,但还没有收到NA消息。
  2. REACHABLE(可达状态):此状态表示已经收到了对方发送的NA消息,获得了对方的链路层地址。
  3. STALE(过期状态):邻居可达时间超时,表示未知是否可达。或者收到了邻居发送的非请求的NA消息,携带的链路层地址和本地表项中地址不符合,该邻居状态立刻变成STALE状态。
  4. DELAY(延迟状态):DELAY状态不是一个稳定的状态,而是一个延时等待状态。当向处于STALE状态的邻居发送报文时,该邻居状态变成DELAY状态,并发送NS消息。
  5. PROBE(探测状态):节点会向处于PROBE状态的邻居持续发送单播NS报文,如持续收不到NA回应,将删除表项,如收到NA回应,邻居状态变为REACHABLE。
  6. EMPTY (空闲状态):表示节点上没有相关邻接点的邻居缓存表项。

邻居状态跟踪与地址解析的区别:
地址解析的NS消息目的地址是被请求节点组播地址,而邻居状态跟踪的NS消息目标地址是单播。邻居状态跟踪的NS消息中S位必须置位。

可以使用命令display ipv6 neighbors(华为设备)来查看路由器的邻居表,如下例显示了路由器R1的邻居缓存表中其中一个邻居路由器的表项信息,该邻居的IPv6地址是2001:2,邻居状态是可达的。
在这里插入图片描述

六、重定向:

路由器发送重定向消息需要满足以下规则:

  1. 检查收到数据包的源地址,是本设备的邻居表中的邻居。
  2. 下一跳的接口等于收到数据包的接口。
  3. 数据包的目的地址不是一个组播地址。

主机接收到的重定向消息必须满足以下条件,否则将被丢弃:

  1. 报文的源地址必须是一个link local地址。路由器必须使用它们的 link local地址。
  2. 作为RA消息以及重定向消息的源地址,以便主机能唯一识别路由器。HOP LIMIT字段必须等于255,报文不可能被路由器转发。
  3. ICMP校验和有效。
  4. ICMP Code必须是0。
  5. ICMP报文的长度必须是40Byte或以上。
  6. 所有包含的选项长度必须大于0。

如下图所示,PC1要访问目标地址2001::3,查找路由表,下一跳地址是2000::2(R2),PC1会把数据包给到R2,当R2收到数据包后,发现去往2001:3的下一跳是fe80::3(R3),并且数据包的进接口等于出接口,则向原报文的源IP 2000::1发送单播的重定向报文,告诉PC1去往2001:3的最优下一跳是FE80::3。以后PC1访问2001::3报文直接发给R3,而不会再发给R2。
在这里插入图片描述

下图图是R2发送的重定向报文,其中,Destination Address表示需要被重定向的目的地址,Target Address表示去往目的地址的最优下一跳:
在这里插入图片描述

七、Path MTU:

在这里插入图片描述
在IPv6中,为了减少中间转发设备的处理压力,中间转发设备一般情况下不对IPv6报文进行分片(分片功能是在PC无法收到Path MTU报文时开启),报文的分片将在源节点进行。虽然这样可能第一次报文发送延迟比较高,但是后面的报文的效率大大的提升。

PMTU协议是通过ICMPv6的Packet Too Big报文来完成的。首先源节点假设PMTU就是其出接口的MTU,发出一个试探性的报文,当转发路径上存在一个小于当前假设的PMTU时,转发设备就会向源节点发送Packet Too Big报文,并且携带自己的MTU值,此后源节点将PMTU的假设值更改为新收到的MTU值继续发送报文。如此反复,直到报文到达目的地之后,源节点就能知道到达目的地的PMTU了。

Path MTU工作过程:
整条传输路径需要通过4条链路,每条链路的MTU分别是1500、1500、1400、1300,当源节点发送一个分片报文的时候,首先按照PMTU为1500进行分片并发送分片报文,当到达MTU为1400的出接口时,路由器返回Packet Too Big错误,同时携带MTU值为1400的信息。源节点接收到之后会将报文重新按照PMTU为1400进行分片并再次发送一个分片报文,当分片报文到达MTU值为1300的出接口时,同样返回Packet Too Big错误,携带MTU值为1300的信息。之后源节点重新按照PMTU为1300进行分片并发送分片报文,最终到达目的地,这样就找到了该路径的PMTU。

整理资料来源:《HCIE路由交换学习指南》

猜你喜欢

转载自blog.csdn.net/tushanpeipei/article/details/113107302