NDP原理详解

article/2025/10/30 11:15:37

概述:

节点使用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路由交换学习指南》


http://chatgpt.dhexx.cn/article/yNIvYm0L.shtml

相关文章

NDP 协议介绍

邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。 邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器 发现(RouterDiscovery),它定义了…

一文解释NDP协议(IPv6邻居发现协议)ICMPv6

目录 目录 一、前言介绍: 1.1、NDP简单说明: 1.2、ICMPv6-Internet控制报文协议 1.3、IPv6和IPv4相比有哪些优势? 二、IPv6邻居发现协议--NDP详解 2.1、IPv6地址解析 2.1.1、邻居请求(Neighbor solicition)NS …

欧拉道路与欧拉回路

1. 相关的概念如下: ① 有向图G为欧拉回路:当且仅当G的基图连通,且所有顶点的入度等于出度 ② 有向图G为欧拉路:当且仅当G的基图连通,而且只存在一个顶点u的入度比出度大于1,只存在一个顶点v的出度比入度…

欧拉回路及例题

欧拉回路 几个定义性质与定理 定理1 推论1 定理2 推论2 性质1性质2 算法主体例题 uoj117求给定图的欧拉回路poj1041求字典序最小的欧拉回路poj1386Play on Wordspoj2230求无向图欧拉图要求每条边走两遍且方向不同poj2513字符串的欧拉图poj2337字典序poj1637Sightseeing tour求…

欧拉回路和Hanmilton回路

1、 一个是对点的,一个是对边的。 2、欧拉回路、欧拉图。有欧拉回路的,就做欧拉图?其实,还有欧拉通路的概念,一笔画完一个图的概念。理一理。 欧拉图:就是从起点出发,可以回到起点的图&#x…

欧拉回路,欧拉路径,欧拉图详解

欧拉回路定义: 欧拉回路:每条边恰好只走一次,并能回到出发点的路径 欧拉路径:经过每一条边一次,但是不要求回到起始点 首先看欧拉回路存在性的判定(这里先不说混合图): 一、无向图…

欧拉回路的基本概念

欧拉回路相关定义: || 如果图G(有向图或者无向图)中有一条通路,该通路上所有边一次且仅有一次行遍所有顶点,那么这条通路称为欧拉通路 || 如果图G中所有边一次且仅有一次行遍所有顶点,称图G有欧拉回路 |…

【算法】欧拉回路

欧拉路径 在一个图中,由i点出发,将每个边遍历一次最终到达j点的一条路径。 欧拉回路:ij时的欧拉路径。 一些概念 图中的度:就是指和该顶点相关联的边数 在有向图中,度又分为入度和出度。 入度 (in-degree) &#x…

欧拉回路问题

文章目录 欧拉回路程序设计程序分析欧拉回路 有一条名为Pregel的河流经过Konigsberg城。城中有7座桥,把河中的两个岛与河岸连接起来。当地居民热衷于一个难题:是否存在一条路线,可以不重复地走遍7座桥。这就是著名的七桥问题。它由大数学家欧拉首先提出,并给出了完美的解答…

欧拉回路/路径【总结】

作为广大OIer的朋(gong)友(di)的欧拉,在图论中也贡(zuo)献(e)良(duo)多(duan),尤其是萌新经常会遇到以下两个恶…

欧拉通路和欧拉回路

定义: 欧拉通路: 如果存在一条通路包含此图中所有的边,则该通路成为欧拉通路,也称欧拉路径(一笔画) 欧拉回路: 如果欧拉路径是一条回路,那么称它为欧拉回路 欧拉图 : 含…

实现求欧拉回路算法(C++)

一、算法介绍及实现过程: 程序的输入为对应图的结点数和图中与各结点相连的点的编号。(注:无向图中的多重边和自环需多次输入;有向图中的多重边需多次输入)程序的第一步是求出图的邻接矩阵。邻接矩阵反映了点与点之间…

欧拉回路,欧拉路

http://www.cnblogs.com/pandy/archive/2009/05/07/1452209.html 参考以上: 判断欧拉路,欧拉回路: 注意图联通,可以DFS或者并查集 一.无向图 欧拉回路:每个顶点度数都是偶数 欧拉路:所有点度数为…

欧拉回路讲解

今天我们专门来讲讲欧拉回路 欧拉回路是数学家欧拉在研究著名的德国哥尼斯堡(Koenigsberg)七桥问题时发现的。如图1所示,流经哥尼斯堡的普雷格尔河中有两个岛,两个岛与两岸共4处陆地通过7座杨 彼此相联。7桥问题就是如何能从任一处陆地出发,经过且经过每个桥一次后回到原出发…

欧拉回路

欧拉回路(Euler circuit) 如果图G中的一个路径包括每个边恰好一次,则该路径称为欧拉路径 如果一个回路是欧拉路径,则称为欧拉回路 具有欧拉回路的图称为欧拉图(简称图),具有欧拉路径但不具有…

【图论】欧拉回路

前言 你的qq密码是否在圆周率中出现? 一个有意思的编码问题:假设密码是固定位数,设有 n n n位,每位是数字0-9,那么这样最短的“圆周率”的长度是多少?或者说求一个最短的数字串定包含所有密码。 理论 一…

算法提高课——3.10 欧拉路径和欧拉回路

欧拉路径和欧拉回路 哥尼斯堡七桥问题 以下内容摘自《信息学奥赛一本通提高篇》. 欧拉回路问题是图论中最古老的问题之一。它诞生于18世纪的欧洲古城哥尼斯堡,普瑞格尔河流经这座城市,人们在两岸以及河中间的小岛之间建了7座桥,如下图所示&am…

嵌入式编程语言

嵌入式开发几乎离不开C/C,虽然在一些嵌入式linux的开发场景可以选python、java,不过也需要BSP和SDK的支持,像操作系统移植、驱动开发几乎就是C的天下,最近有传闻rust也能开发linux内核模块了,但距离大规模使用看上去还…

嵌入式开发语言-C语言编程

C语言编程 概述环境在Windows上构建C语言的环境安装在“MinGW”中运行C程序 在Mac上构建C语言的环境安装文本编辑器的工作在终端的操作结束语 概述 “C语言”被称为适合嵌入式系统开发的编程语言之一。 C语言在一般的编程中也是熟悉的开发语言,但实际上&#xff0c…

什么是嵌入式编程?如何入门和提高?

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。 转载请注明出处。 原文:http://www.jianshu.com/p/d59378613d15 内容简介 什么是嵌入式什么是交叉编译入门和提高嵌入式 1. 什么是嵌入式 嵌入式可以说是目前涵…