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

article/2025/10/30 11:27:45

目录

目录

一、前言介绍:

1.1、NDP简单说明:

1.2、ICMPv6-Internet控制报文协议

1.3、IPv6和IPv4相比有哪些优势?

二、IPv6邻居发现协议--NDP详解

2.1、IPv6地址解析

2.1.1、邻居请求(Neighbor solicition)NS

2.1.2、邻居通告(Neighbor Advertisement)NA

2.2、路由发现(地址解析使用的是NS与NA,路由发现使用RA与RS)

2.3、DAD重复地址检测

2.4、跟踪邻居状态

2.5、重定向过程(和IPv4机制相同)


一、前言介绍:

首先要说一下NDP协议是IPv6基础协议,例如IPv4中的ICMP ARP DHCP协议,在IPv6中使用NDP协议就可以都实现

1.1、NDP简单说明:

NDP(Neighbor Discovery Protocol,邻居发现协议) 这个协议靠ICMPv6协议发现,但是抓包抓不到NDP报文,可以抓icmpv6

是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。NDP利用的就是ICMPv6部分功能

1.2、ICMPv6-Internet控制报文协议

ICMPv6是IPV6的基础协议之一,用于向源节点传递报文转发的信息或错误

协议类型号(即:IPv6Next Header)为58

icmpv6可以提供icmpv4的的对应功能之外,还有其他一些功能的基础如邻居发现、无状态地址配置、重复地址检测、PMTU发现等。

消息类型:

1.3、IPv6和IPv4相比有哪些优势?

  1. v4是用arp广播试下地址解析和重复地址检测
  2. v6是用组播形式,减轻设备性能压力
  3. v6在三层完成地址解析,适用更多的链路层(介质独立性)
  4. v6在三层完成解析,可以使自身ipsec安全认证机制提高安全性,避免类似v4中的arp欺骗

二、IPv6邻居发现协议--NDP详解

在IPv4中,当主机需要和目标主机通信时,必须先通过ARP协议获得目的主机的链路层地址。在IPv6中,同样需要从IP地址解析到链路层地址的功能。邻居发现协议实现了这个功能。

ARP报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为ARP定位为第2.5层的协议。ND本身基于ICMPv6实现,以太网协议类型为0x86DD,即IPv6报文,IPv6下一个报头字段值为58,表示ICMPv6报文,由于ND协议使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第3层的协议。在三层完成地址解析,主要带来以下几个好处

  • 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
  • 可以使用三层的安全机制避免地址解析攻击。
  • 使用组播方式发送请求报文,减少了二层网络的性能压力。

(该协议使用icmpv6协议实现),wireshark抓不到NDP报文,只能抓到icmpv6报文

NDP使用的ICMPv6的相关报文                                    Type字段

  • RS(router solicitation)路由器请求                       type-133
  • RA(router Advertisment)路由器通告报文            type-134
  • NS(Neighbor solicition)邻居请求报文                 type-135
  • NA(Neighbor Advertisement):邻居通告报文) type-136

NDP功能点:

  1. 路由发现-----------发现链路上的路由器,获得路由器通告的信息                   RS RA报文
  2. 无状态自动配置--通知路由器通告的地址前缀,终端自动生成IPv6地址         NS NA报文
  3. DAD-----------------获得地址后,进行地址重复检测,确保地址不存在冲突     NS NA报文
  4. 地址解析-----------请求目的网络地址对应的数据链路层地址,类似IPv4的ARP     NS NA报文
  5. 邻居状态跟踪-----通过NDP发现链路上的邻居并跟踪邻居状态                              NS NA报文
  6. 前缀重编址--------路由器对所通告的地址前缀进行灵活设置实现网络重编址
  7. 路由重定向--------告知其他设备,到达目标网络的更优下一跳

被请求节点组播地址,都是以FF02::1:FF开头

2.1、IPv6地址解析

  1. IPv6的地址解析不在使用ARP,也不在使用广播方式,而是使用组播进行发送(原来IPv4是使用广播进行发送 who is XXX?)
  2. 地址解析在三层完成,针对不同的链路层协议可以采用相同的地址解析协议
  3. 通过ICMPv6(类型135的NS及类型136的NA报文)来实现地址解析
  4. NS报文发送使用组播方式,报文的目的IPv6地址为被请求的IPv6地址对应的“被请求节点组播地址”,报文的目的MAC为组播MAC
  5. 采用组播的方式发送NS消息相比于广播的方式更加的高效,也减少了对其他节点的影响和对二层网络的性能压力
  6. 可以使用三层的安全机制(例如IPSec)避免地址解析攻击
查看IPv6邻居表IPv6不像IPv4那样使用ARP表来缓存IP与MAC地址的映射,而是维护一个IPv6邻居表。display ipv6 neighbors 华为数通设备上查看IPv6邻居表。 
netsh interface ipv6 show neighbors window系统CMD查看IPv6邻居表

IPv6的地址解析:

地址解析过程中使用了两种ICMPv6报文:邻居请求报文NS(Neighbor Solicitation)和邻居通告报文NA(Neighbor Advertisement)。

  • NS报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。
  • NA报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。

流程解析:

① R1要去R2ping包,但是不知道对方地址(即R1想要知道R2的MAC地址),所以R1会发送NS邻居请求报文(源为R1的IPv6地址),目的地址是(R2的被请求节点组播地址)(想请求2001:2设备的MAC地址,即需要解析的目标是R2的IPv6地址),同时需要指出的是在NS报文的Options字段中还携带了一个R1的MAC地址

当R2收到了NS报文后,就会回应NA报文,其中源地址为R2的IPv6地址目的地址是R1的IPv6d地址(使用NS报文中的R1的MAC地址进行单播),R2的MAC地址被放在Options字段中,这样就完成了一个地址解析的过程

2.1.1、邻居请求(Neighbor solicition)NS

  • Type=135 ,code=0
  • Target Address 是需要解析的IPv6地址,因此该处不准出现组播地址。
  • Option 中携带了一个自己源的MAC地址

2.1.2、邻居通告(Neighbor Advertisement)NA

  • Type=136,Code=0
  • R标志(Router flag)表示发送者是否为路由器,如果1则表示是;
  • S标志(Solicited flag)表示发送邻居通告是否是响应某个邻居请求,如果1则表示是(0 例如路由器或PC重启后主动发送RA邻居通告,类似免费arp);
  • O标志(Overide flag)表示邻居通告中的消息是否覆盖已有的条目信息,如果1则表示可以覆盖,如果是0则表示不可覆盖;
  • Target Address表示所携带的链路层地址对应的IPv6地址。
  • Options 携带了自己作为源的MAC地址

2.2、路由发现(地址解析使用的是NS与NA,路由发现使用RA与RS)

路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数。

在IPv6中,IPv6地址可以支持无状态的自动配置,即主机通过机制获取网络前缀信息,然后主机自己生成地址的接口标识部分。路由器发现功能是IPv6地址自动配置功能的基础,主要通过以下两种报文实现:

  • 路由器通告RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送RA报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。RA报文的Type字段值为134。
  • 路由器请求RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送RS报文,网络上的设备将回应RA报文。RS报文的Tpye字段值为133。

地址自动配置:

IPv4使用DHCP实现自动配置,包括IP地址,缺省网关等信息,简化了网络管理。IPv6地址增长为128位,且终端节点多,对于自动配置的要求更为迫切,除保留了DHCP作为有状态自动配置外,还增加了无状态自动配置。无状态自动配置即自动生成链路本地地址,主机根据RA报文的前缀信息,自动配置全球单播地址等,并获得其他相关信息。

IPv6主机无状态自动配置过程:

  1. 根据接口标识产生链路本地地址。
  2. 发出邻居请求,进行重复地址检测。
  3. 如地址冲突,则停止自动配置,需要手工配置。
  4. 如不冲突,链路本地地址生效,节点具备本地链路通信能力。
  5. 主机会发送RS报文(或接收到设备定期发送的RA报文)。
  6. 根据RA报文中的前缀信息和接口标识得到IPv6地址。

2.3、DAD重复地址检测

重复地址检测DAD(Duplicate Address Detect)是在接口使用某个IPv6单播地址之前进行的,为了探测是否有其它的节点使用了该地址。

一个IPv6单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。

此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES组播组和试验地址所对应的Solicited-Node组播组。

IPv6重复地址检测和IPv4中的免费ARP类似:节点向试验地址所对应的Solicited-Node组播组发送NS邻居请求报文。NS报文中目标地址即为该试验地址。如果收到某个其他站点回应的NA报文,就证明该地址已被网络上使用,节点将不能使用该试验地址通讯。

2.4、跟踪邻居状态

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

RFC2461中定义了5种邻居状态:

  1. INCOMPLETE 未完成,邻居请求已经发送到目标节点的请求组播地址,但没有收到邻居的通告;
  2. REACHABLE 可达,收到确认,不续再发包确认;
  3. STALE 陈旧,从收到上一次可达性确认后过了超过30s;
  4. DELAY 延迟,在stale状态后发送过一个报文,并且5s内没有可达性确认;
  5. PROBE 探查,每隔1s重传邻居请求来主动请求可达性确认,直到收到确认。

邻居状态之间具体迁移过程:

  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,即删除表项。

从以上的机制可以看出IPv6的邻居关系优于IPv4的ARP,IPv6的邻居关系维护机制确保通讯发起之前邻居是可达的,而ARP本身是做不到的,仅仅通过老化机制来实现。

关于邻居状态的维护以及状态迁移可以参考RFC2461。

注意1:像ARP报文一样,业务报文并不能刷新邻居表项 ,邻居表项智能靠NDP(icmpv6报文)刷新

注意2:即使一直通信,状态仍然会变迁到stale-delay,只是这个过程是短暂的,因为发送NS请求后,一旦对方回复了NA则状态又被刷新到Reachable

注意3:如果一直通信,则双方链路正常,则会一直在Reachable--->stale------>Delay状态循环变迁,只是停留在Stale和Delay状态时间很短。

注意4:邻居状态是Reachable、Stale、Delay、Probe时,表项依然有效,依然可以按邻居表封包发包,Incomplete不可用

特点:IPv6的邻居关系维护机制确保通讯发起之前邻居是可达的,而ARP本身是做不到的,仅仅通过老化机制来实现。

2.5、重定向过程(和IPv4机制相同)

  • 当网关路由器知道更好的转发路径时,会以重定向报文的方式告知主机,添加主机路由,下次就会用更好的转发路由
  • 重定向报文的结构如下:

PMTU(就是整条路径上的最小接口MTU)

IPv6报文在转发过程中是不进行分片的,IPv6报文仅在源节点进行分片,在目的节点进行组装.

国际组织规定 PMTU最小为1280字节(IPv6要求链路层所支持的MTU最小为1280字节)

最大的PMTU由链路层决定,如隧道,可以支持很大的MTU

icmp error:包太大,请用MTU=1300发送


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

相关文章

欧拉道路与欧拉回路

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等语言也可以进行嵌入式开发。总的来说,这几门编程语言并不难学。 嵌入式开发是物联网开发领域的重要组成部分,物联网系统通常涉及到设备、网络、平台、分析和应用…

物联网的嵌入式编程

嵌入式编程在使设备满足人们的需求方面具有悠久的历史。但是,它在很大程度上仍然被应用程序编程所掩盖。当应用程序程序员采用相对高级的面向对象的语言(如C 或Java)或图形化应用程序开发环境(如MATLAB)时,…