网络学习:邻居发现协议NDP

目录

前言:

一、报文内容

二、地址解析----NS/NA

目标的被请求组播IP地址

邻居不可达性检测:

重复地址检测

路由器发现

地址自动配置

默认路由器优先级和路由信息发现

重定向


前言:

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

一、报文内容

NDP协议中一共有五种ICMPv6报文类型,分别是RS,RA,NS,NA和Redirect报文

ICMPV6类型消息名称
type=133RS(Router Soliciation 路由器请求报文)
type=134RA(Router Advertisement 路由器公告报文)
type=135NS(Neighbor Solicitatio 邻居请求报文)
type=136NA(Neighbor Advertisement 邻居通告报文)
type=137Redirect(重定向报文)

NS和NA报文主要用于地址解析,RA和RS报文主要用于无状态地址自动配置,Redirect报文用于路由器重定向。

二、地址解析----NS/NA

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

ARP报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为ARP定位为第2.5层的协议。 NDP本身基于ICMPv6实现,以太网协议类型为0x86DD,即IPv6报文,IPv6下一个报头字段值为58,表示 ICMPv6报文,由于NDP协议使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第3层的协议, 在三层完成地址解析。与IPv4的ARP相比,IPv6地址解析技术工作在OSI参考模型的网络层,与链路层协议无 关。

主要带来以下几个好处:

  • 地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
  • 可以使用三层的安全认证机制避免地址解析攻击----ARP攻击、ARP欺骗。
  • 使用组播方式发送请求报文,减少了二层网络的性能压力-----二层网络会进行洪范,而使用组播可以圈 定目标主机,从而限定了报文传播范围,节省网络带宽。

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

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

Host A在向Host B发送报文之前它必须要解析出Host B的链路层地址,所以首先Host A会发送一个NS报文。

源IP地址为Host A的IPv6地址,目的IP地址为Host B的被请求节点组播地址,需要解析的目标IP为Host B的 IPv6地址,这就表示Host A想要知道Host B的链路层地址。源MAC地址为节点A的MAC地址,目标MAC是节点B的被请求节点组播MAC地址。同时需要指出的是,在NS报文的Options字段中还携带了Host A的链路层地址。

目标的被请求组播IP地址

在IPv6组播地址中,有一种特别的组播地址,称为被请求节点组播地址(Solicited-node Address)。 被请求节点组播地址是一种具有特殊用途的地址,主要用于重复地址检测和获取邻居节点的链路层地址时,代替IPv4中使用的广播地址。

该地址是通过计算得出: 被请求节点组播地址由前缀FF02::1:FF00::/104和单播地址的最后24位组成。对于节点或路由器的接口 上配置的每个单播和任播地址,都自动启用一个对应的被请求节点组播地址。被请求节点组播地址使 用范围为链路本地。这里使用2000::1/64举例:

最终2000::1的被请求组播IP地址为FF02::1:FF00::1/104。在例如:如4037::01:800:200E:8C6C对应 于FF02::1:FF0E:8C6C。

组播IPv6报文的目的IP地址是组播IPv6地址,而目的MAC地址则必须是组播MAC地址,并且该地址必 须与组播IPv6地址对应。33-33是专门为IPv6组播预留的MAC地址前缀,MAC地址的后32bit从对应的 组播IPv6地址的后32bit拷贝而来。

所以FF02::1:FF00::1/104的组播MAC地址为33-33-FF00-0001。

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

值得注意的是,因为IPV6地址这样的设定就导致可能出现IPV6网络中存在多个前缀不同但是后24位相同的 IPV6地址,从而产生多个主机使用了一个组播MAC地址,导致网络混乱,所以在ICMPV6数据包中会携带 Target Address字段2000::2,指示目标主机,只有对应的主机会接收该请求,其余主机会丢弃该数据包。

以上抓包,采用以下环境完成:

实际上这个过程大家也不用想的过于复杂,只不过涉及到了一些地址的计算。

类比IPV4的PING

路由器 AR1需要构造 ICMP echo request 报文,将PC1的IP地址 填入报文的目的 IP 地址字段。但在发送该 报文前, 路由器 A 需要确认它已经掌握了以下 4 个信息:

  • 目的 MAC 地址
  • 源 MAC 地址
  • 源 IP 地址
  • 目的 IP 地址

在这 4 个信息中,路由器 A 能轻松填上其中 3 个。

我们敲的命令是 “ping PC1” ,所以路由器 A 知道报文应该填写的目的 IP 地址为 PC1的地址,同时,路由器 R1自身已知自己的源MAC地址和源IP地址。

IPV6的PING

IPv6 中的 Ping 和 IPv4 非常类似,区别在于它使用的是 ICMPv6 echo request 报文。同样的,为了让报文 能顺利发到目的地址 2001:DB8::AB:2, 路由器 A 同样需要以下 4 个信息:

  • 目的 MAC 地址
  • 源 MAC 地址
  • 源 IPv6 地址
  • 目的 IPv6 地址

和 IPv4 情形类似,我们可以很轻松地得到上面 4 个信息中的 3 个。

  • 源 MAC 地址
  • 源 IPv6 地址
  • 目的 IPv6 地址

现在我们同样只差一项了:2000::2 对应的 MAC 地址。

那么现在轮到…额,等等。我们不能使用 IPv4 网络中的 ARP 了。为什么呢?因为 ARP 是广播,而 IPv6 压 根没有广播,那我们应该怎么做呢?

根据前面所学,我们知道了,如果一个接口上配置了 2000::2/64 这样一个全球单播地址,它会根据接口配置 的单播地址自己计算出一个对应的组播地址 FF02::1:FF00::2 并加入这个组播组。

那这个地址有什么作用呢?

类似IPV4协议,虽然R1并不知道PC1的MAC地址,但它至少知道PC1一定会侦听一个 MAC 地址:FF:FF-FFFF-FF-FF 这个广播地址。通过这个广播地址,路由器 R1就能与PC1 搭上话,询问 PC1对应的MAC 地址是多 少。事实上不止PC1会监听这个广播地址,所有位于这个广播域的设备都会监听,只不过只有PC1会回复。

而现在,尽管在 IPv6 没有广播了,但路由器 R1还是知道PC1 必然侦听的一个 MAC 地址:33-33-FF-FF-00- 02—这个MAC地址是根据2000::2的组播地址FF02::1:FF00::2计算得出。

这下子路由器R1就能和 PC1 通信了,它也就能获取到想要的单播地址对应的 MAC 地址了,这也被称为 IPv6 的邻居发现(Neighbor Discovery)

邻居不可达性检测:

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

邻居状态有5种,分别是:未完成(Incomplete)、可达(Reachable)、陈旧(Stale)、延迟(Delay)、 探查(Probe)。

display ipv6 neighbors —查看IPV6邻居表 

邻居状态迁移过程如下,其中Empty表示邻居表项为空,初始状态。

  1. 首先初始情况下Empty不是状态,只是代表没有发送NS报文之前,IPV6邻居为空
  2. 当A节点发送NS报文之后,自身会产生缓存消息,状态变为Incomplete—表示未完成
  3. 当A节点收到对方节点回复的NA报文,并且信息验证无误后,邻居状态由Incomplete变为Reachable (可达),否则固定时间后邻居状态由Incomplete变为Stale(陈旧)—默认时间为30S
  4. 经过30S邻居可达时间,状态由Incomplete变为Stale,意为未知目标是否可达 实际上stale状态是一个稳定状态,就是不会自己改变,因为正常情况下建立邻居后不会发送ICMP报 文,也就不会发送NS,所以实际上大部分的IPV6邻居都处于Stale状态。此时如果超过老化时间(缺省 情况下是20分钟),该表项没有被使用,也进入到DELAY状态。
  5. 如果在Reachable状态,A收到B的非请求NA报文,且报文中携带的B的链路层地址和表项中不同,则邻 居状态马上变为Stale。
  6. 在Stale状态若A要向B发送数据,则邻居状态由Stale变为Delay,并发送NS请求
  7. 向邻居发送NS报文,如果在指定时间内(缺省情况下是5秒)没有收到响应,则进入PROBE状态;若收 到NA应答,则变为REACH状态。其间若有NA应答,则邻居状态由Delay变为Reachable—,默认时 间5S
  8. 在Probe状态,按照RA报文发布的时间间隔Retrans Timer(或者主机配置值)发送单播邻居请求报文 NS,如果有应答,则进入REACH状态。如果无应答则邻居状态变为Empty,即删除表项。—时间间隔 默认3S。

重复地址检测

重复地址检测DAD(Duplicate Address Detect)是在接口使用某个IPv6单播地址之前进行的,主要是为了 探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行DAD检测是很必要的。 一个IPv6 单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。此时该接口 不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES组播组和试验地址所对应的 Solicited-Node组播组。

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

Host A的IPv6地址FC00::1为新配置地址,即FC00::1为Host A的试验地址。Host A向FC00::1的SolicitedNode组播组发送一个以FC00::1为请求的目标地址的NS报文进行重复地址检测,由于FC00::1并未正式指 定,所以NS报文的源地址为未指定地址。当Host B收到该NS报文后,有两种处理方法:

  • 如果Host B发现FC00::1是自身的一个试验地址,则Host B放弃使用这个地址作为接口地址,并且不会 发送NA报文。
  • 如果Host B发现FC00::1是一个已经正常使用的地址,Host B会向FF02::1发送一个NA报文,该消息中会 包含FC00::1。这样,Host A收到这个消息后就会发现自身的试验地址是重复的。Host A上该试验地址 不生效,被标识为duplicated状态。

从抓包结果来看,第一个NS包请求的是本地链路地址,R1路由器的0/0/0口除了自己配置的地址外,还存在 一个本地链路地址,这里R1上的本地链路地址为FE80::2E0:FCFF:FEF6:41EA,本地链路地址对应的组播地址 为 FF02::1:FFF6:41EA,这个数据包用来检测本地链路地址是否重复。也就是说实际上,IPV6地址检测会检测接口配置的IPV6地址是否冲突,同时也会检测本地链路地址是否会冲突。

https://support.huawei.com/enterprise/zh/doc/EDOC1100272823#ZH-CN_TOPIC_0000001467623457

路由器发现

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

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

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

地址自动配置

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

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

1. 根据接口标识产生链路本地地址。

接口激活IPV6服务后,将根据自身的接口MAC地址,生成本地链路地址。

2. 发出邻居请求,进行重复地址检测。

3. 如地址冲突,则停止自动配置,需要手工配置。

4. 如不冲突,链路本地地址生效,节点具备本地链路通信能力。

5. 主机会发送RS报文(或接收到设备定期发送的RA报文)。

6. 根据RA报文中的前缀信息和接口标识得到IPv6地址。

同时,值得注意的是上述所有报文均使用组播进行传递,NS—邻居发现报文使用被请求链路组播地址, RS/RA使用FF02::1用于在本地链路范围的所有节点的请求。

配置命令:

server端(R1)

[Huawei]ipv6 —全局启动IPV6服务

[Huawei-GigabitEthernet0/0/0]ipv6 enable —接口启动IPV6协议

[Huawei-GigabitEthernet0/0/0]ipv6 address 2000::1 64—接口配置IPV6地址

[Huawei-GigabitEthernet0/0/0]undo ipv6 nd ra halt —用来使能系统发布RA报文功能,重要配置 client端(R2)

[Huawei]ipv6 —全局启动IPV6 [Huawei-GigabitEthernet0/0/0]ipv6 enable —接口启动IPV6服务

[Huawei-GigabitEthernet0/0/0]ipv6 address auto global —接口无状态自动获取地址

默认路由器优先级和路由信息发现

当主机所在的链路中存在多个设备时,主机需要根据报文的目的地址选择转发设备。在这种情况下,设备通 过发布默认路由优先级和特定路由信息给主机,提高主机根据不同的目的地选择合适的转发设备的能力。

在RA报文中,定义了默认路由优先级和路由信息两个字段,帮助主机在发送报文时选择合适的转发设备。

主机收到包含路由信息的RA报文后,会更新自己的路由表。当主机向其他设备发送报文时,通过查询该列表 的路由信息,选择合适的路由发送报文。

主机收到包含默认设备优先级信息的RA报文后,会更新自己的默认路由列表。当主机向其他设备发送报文 时,如果没有路由可选,则首先查询该列表,然后选择本链路内优先级最高的设备发送报文;如果该设备故 障,主机根据优先级从高到低的顺序,依次选择其他设备。

重定向

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

Host A需要和Host B通信,Host A的默认网关设备是Switch A,当Host A发送报文给Host B时报文会被送到 Switch A。Switch A接收到Host A发送的报文以后会发现实际上Host A直接发送给Switch B更好,它将发送 一个重定向报文给主机A,其中报文中更好的路径下一跳地址为Switch B,Destination Address为Host B。 Host A接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往Host B的报文就直接发送 给Switch B。

当设备收到一个报文后,只有在如下情况下,设备会向报文发送者发送重定向报文:

  • 报文的目的地址不是一个组播地址。
  • 报文并非通过路由转发给设备。
  • 经过路由计算后,路由的下一跳出接口是接收报文的接口。
  • 设备发现报文的最佳下一跳IP地址和报文的源IP地址处于同一网段。
  • 设备检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地址或链路本地地址的邻居存 在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/464731.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库实现增删改查基础操作

准备工作 安装mysql8.0 (安装时一定要记住用户名和密码)安装数据库可视化视图工具Navicat 请注意⚠️⚠️⚠️⚠️ a. 编程类所有软件不要安装在中文目录下 b. Navicat破解版下载安装教程:(由于文章审核提示版权问题,链接不方便给出&#xff…

虚拟内存相关知识汇总(程序重定位)

前置知识: Windows的内存可以被分为两个层面:物理内存和虚拟内存。其中,物理内存非常复杂,需要进入到Windows内核级别ring0才能看到。通常在用户模式下,用调试器看到的内存地址都是虚拟地址。 1.虚拟内存的定义 虚拟…

PCIE问题定位000:PCIe需要的定位手段

1、PCIe debug环境说明 本文将以PCIe EP用户逻辑举例,描述PCIe可以添加哪些定位手段。 如图所示,PCIe IP作为endpoint与RC对接,用户实现了应用逻辑,与PCIe IP进行交互,交互信号中data格式为TLP报文格式,且…

Linux_基础指令(一)

目录 1、ls指令 1.1 ls -l 1.2 ls -a 1.3 ls -i 2、pwd指令 3、cd指令 3.1 路径的概念 3.1.1 绝对路径 3.1.2 相对路径 3.2 cd ~ 3.3 cd - 4、touch指令 5、mkdir指令 6、删除系列的指指令 6.1 rmdir 6.2 rm 7、man指令 8、cp指令 9、move指令 结…

【智能算法】斑鬣狗优化算法(SHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过。 3.代码实现4.参考文献 1.背景 2017年,Dhiman等人受到斑鬣狗自然狩猎行为启发,提出了斑鬣狗优化算法(Spotted Hyena Optimizer, SHO)。 2.算法原理 2.1算法思想 SHO将斑鬣狗狩猎行为分为围捕-狩猎-进攻三…

多线程JUC 第2季 wait和notify唤醒机制

一 wait和notify的区别与相同 1.1 wait和notify的作用 1) 使用wait()、notify()和notifyAII()时需要先对调用对象加锁。否则直接调用的话会抛出 IllegalMonitorStateExceptiona。 2) 调用wait()方法后,线程状态。由RUNNING变为WAITING,并将当前线程放置…

wordpress子比主题7.6美化插件及新手零基础搭建教程源码下载

版权申请:本文A5资源网原创,经原创作者允许转载许可声明。下载地址http://a5.org.cn/a5_ziyuan/39172.html 本源码由网友在某宝二十几元购买,现分享给大家。下图为源码文件及演示图,安装教程比较详细新手零基础就可搭建 子比主…

NeRF——基于神经辐射场的三维场景重建和理解

概述 三维重建是一种将物理世界中的实体转换为数字模型的计算机技术。其基本概念是通过对物理世界中的物体或场景进行扫描或拍摄,并使用计算机算法将其转换为三维数字模型。抽象意义上的三维模型指的是:形状和外观的组合,并且可以渲染成不同…

【Redis知识点总结】(四)——如何保证缓存与数据库中的数据一致性

Redis知识点总结(四)——如何保证缓存与数据库中的数据一致性 更新缓存删除缓存先删除缓存后更新数据库先更新数据库后删除缓存 使用canal总结 面试会经常遇到这种问题:你们如何保证缓存与数据库中的数据一致性?或者是&#xff1a…

小白必看的Python基础之函数篇

函数最重要的目的是方便我们重复使用相同的一段程序。 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句。 函数的定义 首先,我们要定义一个函数, 以说明这个函数的功能…

把软件加入开机自启动

注意这个方法最佳效果是适用于打开软件后,关闭窗口不会停止服务 例如 nginx 1.把nginx的快捷方式放到如图所示的文件夹下 C:\Users\KIA_27\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 注意KIA_27应改为你自己的用户名

从政府工作报告探计算机行业发展——探索计算机行业发展蓝图

目录 前言 一、政策导向与行业发展 (一)政策导向的影响 (二)企业如何把握政策机遇推动创新发展 二、技术创新与产业升级 三、数字经济与数字化转型 四、国际合作与竞争态势 五、行业人才培养与科技创新 (一&a…

KubeSphere集群安装-nfs分布式文件共享-对接Harbor-对接阿里云镜像仓库-遇到踩坑记录

KubeSphere安装和使用集群版 官网:https://www.kubesphere.io/zh/ 使用 KubeKey 内置 HAproxy 创建高可用集群:https://www.kubesphere.io/zh/docs/v3.3/installing-on-linux/high-availability-configurations/internal-ha-configuration/ 特别注意 安装前注意必须把当前使…

【十】【算法分析与设计】滑动窗口(1)

209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [nums(l), nums(l1), ..., nums(r-1), nums(r)] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 …

[嵌入式系统-40]:龙芯1B 开发学习套件 -10-PMON启动过程start.S详解

目录 一、龙芯向量表与启动程序的入口(复位向量) 1.1 复位向量: 1.2 代码执行流程 1.3 计算机的南桥 VS 北桥 二、PMON代码执行流程 三、Start.S详解 3.1 CPU初始化时所需要的宏定义 (1)与CPU相关的一些宏定义…

[游戏开发][UE5.3]GAS学习心得

GAS(GameplayAbilitySystem) UE提供的一套技能框架,这个框架也不是万能的,甚至各个部件你要进行封装开发,但这也比你从头写一套技能框架要容易很多。 GAS功能极其强大,所以它是一个庞大的系统,如果想运用得当&#x…

深度学习pytorch——基本运算(持续更新)

基本运算——加、减、乘、除 建议直接使用运算符,函数和运算符的效果相同 代码演示: #%% # 加减乘除 a torch.rand(3,4) b torch.rand(4) # 这里a、b可以相加,别忘了pytorch的broadcast机制 print(ab) print(torch.add(a,b)) print(torc…

MySQL中的索引失效情况介绍

MySQL中的索引是提高查询性能的重要工具。然而,在某些情况下,索引可能无法发挥作用,甚至导致查询性能下降。在本教程中,我们将探讨MySQL中常见的索引失效情况,以及它们的特点和简单的例子。 1. **索引失效的情况** …

代码算法训练营day9 | 28. 实现 strStr() 、459.重复的子字符串

day9: 28. 实现 strStr()KMP的主要应用:什么是前缀表:前缀表是如何记录的: 如何计算前缀表:构造next数组:1、初始化2、处理前后缀不相同的情况3、处理前后缀相同的情况 代码: 459.重复的子字符串…

Python入门(三)

序列 序列是有顺序的数据集合。序列包含的一个数据被称为元素,序列可以由一个或多个元素组成,也是可以没有任何元素的空序列。 序列的类型 元组(定值表):一旦建立,各个元素不可再更变,所以一…