NDP 概述
Neighbor Discovery Protocol,邻居发现协议
节点使用 ND 可以确定连接在同一链路上的邻居的链路层地址,快速清除已经变成无效的缓存值。
主机使用 ND 发现能为其转发报文的路由器。
节点使用此协议主动跟踪哪一个邻居可达,哪一个邻居不可达,以及侦听邻居们改变的链路层地址。当路由器或到路由器的路径出现故障时,主机主动搜索正常运行的替代者。
IPv6 支持即插即用,主机除了可以使用传统的 DHCP 获取地址之外,还可以完成 IPv6 地址的自动配置等。
IPv6 的 NDP 可以解决以下问题:
-
路由器发现:主机如何找到连接在同一链路上的路由器。
-
前缀发现:主机如何发现前缀集合。
-
参数发现:节点如何发现链路上的参数(如链路 MTU),以及互联网参数(如 TTL 跳数)。
-
地址自动配置:一种新的机制,允许节点采用无状态方式自动配置接口所需要的 IP 地址。
-
地址解析:仅知道目的地 IP 地址时如何获得目的地的链路层地址,类似 ARP。
-
下一跳确定:映射目的地 IP 地址到邻居地址的算法,发送给该目的地的流量将会发送给该邻居地址(下一跳),下一跳可以是路由器或者目的地本身。
-
邻居不可达检测:节点如何确定邻居不再可达。如果邻居被用作路由器,其不可达时需要尝试替代默认路由器。
-
重复地址检测:用作节点确定将要使用的地址是否已经被另一个节点所使用。
-
重定向:路由器如何通知主机有到达目的地更好的下一跳。
NDP 整合了 IPv4 中的 ARP、ICMP 重定向 ICMP 路由器发现,并且进行了改进。
NDP 协议工作会使用如下几个地址:
-
未指定地址:表示发送者暂时无地址。
-
链路本地地址:只在链路范围内的单播地址。
-
FF02::1(所有节点组播地址): 到本链路范围内的所有节点地址。
-
FF02::2(所有路由器多播地址): 到本链路范围内的所有路由器地址。
-
被请求节点组播地址:由固定前缀 FF02::1:FF00:0/104 和单播地址的最后 24 位组成。
NDP 协议的工作主要通过以下 5 种 ICMPv6 的报文来实现:
-
路由器请求 (RS)消息。
-
路由器通告 (RA)消息。
-
邻居请求(NS)消息。
-
邻居通告 (NA)消息。
-
重定向消息。
一、无状态自动配置
IPv6 的 NDP 可以利用 RS 和 RA 消息完成以下两个功能:
- 无状态自动配置
- 路由器发现
二、路由器发现
RA 消息的格式中在 Flag 字段中有一个 Router preference 的标志位,该标记位用于主机选择默认网关,如图所示。
主机根据路由器在各自 RA 消息中通告的优先级选择默认网关,共有 3 个优先等级:low、medium、high。
华为路由器发出的 RA 消息中的默认级别为中级,主机最终会在所有路由器中间选择优先级最高的路由器作为默认网关。如果所有路由器的优先级都一样
,那么主机将这些路由器都用作默认网关
,也就是使用负载分担
的方式。
路由器每隔一段周期向网络中发送 RA 消息,华为路由器默认间隔是 200~600s 之间的一个随机值。以此通告 IPv6 的前缀,华为路由器默认不开启 RA 通告,使用命令: undo ipv6 nd ra halt 可以开启 IPv6RA 通告功能。
当一个 IPv6 地址刚被配置在接口上时,此时叫试验地址,该地址还不能立刻被用于通信,必须先进行 DAD(地址冲突检测); 如果通过地址冲突检测并且无冲突后,即可被视为优选地址。
RA 消息选项中的两个字段:
优选生存期 (PrefereredLifetime)和有效生存期 (Valid Lifetime)。
优选生存期就是指主机将以无状态自动配置方式生成的地址视为优选地址的时间 (以 s 为单位)。主机可以使用优选地址跟其他设备进行通信。如果优选生存期到期,设备不再使用该地址创建新的通信连接。
有效生存期是指主机收到的来自路由器 RA 消息中的前缀可以使用的时间 (以 s 为单位),有效生存期必须大于优选生存期,在优选生存期到期后,有效生存期到期前,主机通过该地址已建立的连接还是继续可以用的,直到该地址的有效生存期到期。
三、地址解析
IPv6 的 NDP 可以利用 NS 和 NA 消息完成以下三个功能:
- 地址解析
- DAD (重复地址检测)
- NUD (邻居不可达性检测)
四、DAD(重复地址检查)
网络中的设备可以使用 DAD 机制来确认自己用的 IPv6 地址是否被其他设备使用。如果一个接口配置了多个 IPv6 单播地址 (包括链路本地地址或全局单播地址),每个地址在使用之前,都需要执行 DAD 的过程
。如果通过 DAD 过程发现了重复地址,那么接口就不能使用该地址。
五、NUD (邻居不可达性检测)
对于 NDP 来说,它会将已发现的邻居设备放在邻居缓存表,该表中包含了邻居 IPv6 地址及其对应的二层地址 (通常是以太网 MAC 地址), 相当于 IPv4 的 ARP 缓存表。NDP 为维护邻居缓存表,会定期跟踪邻居的状态。
NUD 就是用来检测邻居状态的进程,通过定期发送 NS 以确定邻居的状态。RFC4861 中定义了 5 种邻居状态,解释了这些状态以及在这些状态之间的事件。NUD 利用这些状态以及状态之间的切换过程来检测和解析邻居的可达性问题。
各状态的解析图:
- INCOMPLETE(未完成状态): 此状态表示地址解析还在进行,本机已经发送 NS 消息,但还没有收到 NA 消息。
- REACHABLE (可达状态): 此状态表示已经收到了对方发送的 NA 消息,获得了对方的链路层地址。
- STALE(过期状态): 邻居可达时间超时,表示未知是否可达。或者收到了邻居发送的非请求的 NA 消息,携带的链路层地址和本地表项中地址不符合,该邻居状态立刻变成 STALE 状态。
- DELAY (延迟状态):DELAY 状态不是一个稳定的状态,而是一个延时等待状态。当向处于 STALE 状态的邻居发送报文时,该邻居状态变成 DELAY 状态,并发送 NS 消息。
- PROBE (探测状态): 节点会向处于 PROBE 状态的邻居持续发送单播 NS 报文,如持续收不到 NA 回应,将删除表项,如收到 NA 回应,邻居状态变为 REACHABLE。
- EMPTY (空闲状态): 表示节点上没有相关邻接点的邻居缓存表项。
邻居状态跟踪与地址解析的区别:
地址解析的 NS 消息目的地址是被请求节点组播地址,而邻居状态跟踪的 NS 消息目标地址是单播。邻居状态跟踪的 NA 消息中 S 位必须置位。
六、重定向
路由器发送重定向消息需要满足以下规则:
- 检查收到数据包的源地址,是本设备的邻居表中的邻居。
- 下一跳的接口等于收到数据包的接口。
- 数据包的目的地址不是一个组播地址。
主机接收到的重定向消息必须满足以下条件,否则将被丢弃:
- 报文的源地址必须是一个 link local 地址。路由器必须使用它们的 link local 地址。
- 作为 RA 消息以及重定向消息的源地址,以便主机能唯一识别路由器。HOP LIMIT 字段必须等于 255,报文不可被路由器转发。
- ICMP 校验和有效。
- ICMP Code 必须是 0。
- ICMP 报文的长度必须是 40Byte 或以上。
- 所有包含的选项长度必须大于 0。
Via: 路由交换学习