NDP 协议介绍

article/2025/10/30 11:17:36

邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议。
邻居发现协议替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器
发现(RouterDiscovery),它定义了使用ICMPv6报文实现地址解析,跟踪邻 居状态,重复地址检测,路由器发现以及重定向等功能。
 

1、地址解析
在 IPv4中,当主机需要和目标主机通信时,必须先通过 ARP 协议获得目的主机的链 路层地址。在 IPv6中,同样需要从 IP 地址解析到链路层地址的功能。邻居发现协议实 现了这个功能。
ARP 报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为 ARP 定位为第 2.5 层的协议。ND 本身基于 ICMPv6 实现,以太网协议类型为 0x86DD,即 IPv6 报文,IPv6下一个报头字段值为58,表示ICMPv6报文,由于 ND 协议使用的所有报文均封装在 ICMPv6报文中,一般来说,ND 被看作第3层的协议。在三层完成地址解析,主 要带来以下几个好处:
(1) 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
(2) 可以使用三层的安全机制避免地址解析攻击。
(3) 使用组播方式发送请求报文,减少了二层网络的性能压力。

Host A 在向 Host B 发送报文之前它必须要解析出 Host B 的链路层地址,所以首先Host A 会发送一个 NS 报文,其中源地址为 Host A 的 IPv6 地址,目的地址为 Host B 的被请求节点组播地址,需要解析的目标 IP 为 HostB 的 IPv6 地址,这就表示 Host A 想 要知道 Host B 的链路层地址。同时需要指出的是,在 NS 报文的 Options 字段中还携带
了 Host A 的链路层地址。 

当 Host B 接收到了 NS 报文之后,就会回应 NA 报文,其中源地址为 HostB 的 IPv6地址,目的地址为 Host A 的 IPv6 地址(使用 NS 报文中的 HostA 的链路层地址进行单 播),Host B 的链路层地址被放在 Options 字段中。这样就完成了一个地址解析的过程。

组播 MAC:3333+IPv6 后 32 位地址生成

2、重复地址检测
重复地址检测 DAD(Duplicate Address Detect)是在接口使用某个 IPv6 单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行 DAD 检测是很必要的。一个 IPv6单播地址在分配给一个接口之后且通过重复地址 检测之前称为试验地址(Tentative Address)。此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES 组播组和试验地址所对应的 Solicited-Node 组播组。
IPv6重复地址检测技术和 IPv4中的免费 ARP 类似:节点向试验地址所对应的 Solicited-Node 组播组发送 NS 报文。NS 报文中目标地址即为该试验地址。如果收到某个 其他站点回应的 NA 报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。

Host A 的 IPv6 地址 200::1 为新配置地址,即 200::1 为 Host A 的试验地址。Host A向 200::1 的被请求节点组播组发送一个以 200::1 为请求的目标地址的 NS 报文进行重复地址检测,由于 200::1 并未正式指定,所以NS 报文的源地址为未指定地址。当 Host B 收到该 NS 报文后,有两种处理方法:
(1) 如果 Host B 发现 200::1 是自身的一个试验地址,则 Host B 放弃使用这个地址作为接口地址,且不会发送 NA 报文。
(2) 如果 Host B 发现 200::1 是一个已经正常使用的地址,Host B 会向 FF02::1 发送一个 NA 报文,该消息中会包含 200::1。这样,Host A 收到这个消息后就会发现自身 的试验地址是重复的。Host A 上该试验地址不生效,被标识为 duplicated 状态。


3、路由器发现
路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。
在 IPv6中,IPv6地址可以支持无状态的自动配置,即主机通过某种机制获取网络前缀 信息,然后主机自己生成地址的接口标识部分。路由器发现功能是 IPv6地址自动配置功 能的基础,主要通过以下两种报文实现:

(1) 路由器通告 RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送 RA 报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。RA 报文的 Type字段值为134。 

(2) 路由器请求 RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽 快获取网络前缀进行通信,此时主机可以立刻发送 RS 报文,网络上的设备将回应 RA 报文。RS 报文的 Tpye 字段值为 133。

4、跟踪邻居状态
通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。

RFC2461 中定义了 5 种邻居状态,分别是:未完成(Incomplete)、可达(Reachable)、 陈旧(Stale)、延迟(Delay)、探查(Probe)。
下面以A、B两个邻居节点之间相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未通信),说明邻居状态迁移的过程。
1)A 先发送 NS 报文,并生成缓存条目,此时,邻居状态为 Incomplete。 

2)若 B 回复 NA 报文,则邻居状态由 Incomplete 变为 Reachable,否则固定时间后邻居状态由 Incomplete 变为 Empty,即删除表项。
3)经过邻居可达时间,邻居状态由 Reachable 变为 Stale,即未知是否可达。 

4)如果在 Reachable 状态,A 收到 B 的非请求 NA 报文,且报文中携带的 B的链路层 地址和表项中不同,则邻居状态马上变为Stale。 

5)在 Stale 状态若 A 要向 B 发送数据,则邻居状态由 Stale 变为 Delay,并发送 NS 请求。
6)在经过一段固定时间后,邻居状态由 Delay变为Probe,其间若有NA应答,则邻居状态由 Delay 变为 Reachable。
7)在Probe状态,A每隔一定时间间隔发送单播NS,发送固定次数后,有应答则邻 居状态变为 Reachable,否则邻居状态变为 Empty,即删除表项。

5、 ICMP 的重定向
当网关路由器发现报文从其它网关路由器转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关路由器。重定向报文也承载在 ICMPv6报文中, 其 Type 字段值为137,报文中会携带更好的路径下一跳地址和需要重定向转发的报文的 目的地址等信息。

PC1 需要和 PC2 通信,PC1 的默认网关路由器是 R1,那么当 PC1 发送报文给 PC2时报文会被送到 R1。R1 接收到 PC1 发送的报文以后会发现实际上 PC1 直接发送给 R2更好,它将发送一个重定向报文给 PC1,其中报文中更好的路径下一跳地址为 R2,Destination Address 为 PC2(该部分为 ICMPv6 重定向报文携带的目的地址)。PC1 接收到
了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往 PC2的报文就直接发送给 R2。当路由器收到一个报文后,只有在如下情况下,路由器会向报文发送者发送重定向报文:
(1) 报文的目的地址不是一个组播地址。
(2) 报文并非通过路由转发给路由器。
(3) 经过路由计算后,路由的下一跳出接口是接收报文的接口。
(4) 路由器发现报文的最佳下一跳 IP 地址和报文的源 IP 地址处于同一网段。
(5)路由器检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地
址或链路本地地址的邻居存在。

6、PMTU 的工作过程
在 IPv6中,为了减少中间转发设备的处理压力,中间转发设备不对 IPv6报文进行分 片,报文的分片将在源节点进行。

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。


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

相关文章

一文解释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. 什么是嵌入式 嵌入式可以说是目前涵…

嵌入式编程语言c++,嵌入式开发通常采用哪种编程语言

描述 目前在嵌入式开发领域比较常见的编程语言是C,另外C、Python、JavaScript等语言也可以进行嵌入式开发。总的来说,这几门编程语言并不难学。 嵌入式开发是物联网开发领域的重要组成部分,物联网系统通常涉及到设备、网络、平台、分析和应用…