IPv6知识概述 - ND协议

IPv6知识概述 - ND协议

参考文章:https://blog.csdn.net/Gina_wj/article/details/106708770

IPv6基础篇(四):邻居发现协议NDP

ND协议功能概述

ND(Neighbor Discovery,邻居发现)协议是IPv6的一个关键协议,它综合了IPv4中的ARP,ICMP路由发现和ICMP重定向等协议,并对他们做了改进。作为IPv6的基础性协议,ND协议还提供了前缀发现,邻居不可达检测,重复地址检测,地址自动配置等功能,具体如下所示:

1)地址解析
地址解析是一种确定目的节点的链路层地址的方法。ND中的地址解析功能不仅替代了原IPv4中的ARP协议,同时还用**邻居不可达检测(NUD)**方法来维护邻居节点之间的可达性状态信息。

2)无状态地址自动配置
ND协议中特有的地址自动配置机制,包括一系列相关功能,如路由器发现,接口ID自动生成,重复地址检测等。通过无状态自动配置机制,链路上的节点可以自动获得IPv6全球单播地址。

路由器发现
路由器在 与其相连的链路上发布网络参数等信息,主机捕获次信息后,可以获得全球单播IPv6地址前缀、默认路由、链路参数(链路MTU)等信息。

接口ID自动生成
主机根据EUI-64规范或其他方式为接口自动生成接口标识符。

重复地址检测
根据前缀信息生成IPv6地址或手动配置IPv6地址后,为保证地址的唯一性,在这个地址可以使用之前,主机需要检验此IPv6地址是否已经被链路上的其他节点所使用。

前缀重新编址
当网络前缀变化时,路由器再与其相连的链路上发布新的网络参数信息,主机捕获这些信息,重新配置前缀,链路MTU等地址相关信息。

3)路由器重定向
当在本地链路上存在一个到达目的网络的更好地路由器时,路由器需要通过节点来进行相应配置改变。

ND协议报文

ND协议定义了5种ICMPv6报文类型,如下表所示:
image.png
NS/NA报文主要用于地址解析
RS/RA报文主要用于无状态地址自动配置
Redirect报文用于路由器重定向。


IPv6邻居发现协议使用5种类型的ICMPv6消息类型,用来实现地址解析,重复地址检测,路由器发现以及路由重定向等功能。具体的ICMPv6的消息类型及具体作用如下:

1、ICMPv6邻居请求(Neighbor Solicitation)消息


其中各字段的含义如下:
1)Target Address:待解析的IPv6地址,16types。Target Address不能是组播地址,可以是链路本地地址、站点本地地址和全球单播地址。
2)Options:地址解析中只使用了链路层地址选项(Link-Layer Address Option),是发送NS报文节点的链路层地址。链路层地址选项的格式如下图所示:

其中各字段含义如下:
1)Type:选项类型,在链路层地址选项中包括如下两种:

  • Type=1,表明链路层地址为Source Link-Layer Address(源链路层地址),在NS,RS,Redirect报文中使用。
  • Type=2,表明链路层地址为Target Link-Layer Address(目标链路层地址),在NA,Redirect报文中使用。

2)Length:选项长度,以8bytes为单位。
3)Link-Layer Address:链路层地址。长度可变,对于以太网为6bytes。

邻居请求报文NS(Neighbor Solicitation)报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。用来获取邻居的链路层地址,验证邻居是否可达,进行重复地址检测等。

2、ICMPv6邻居通告(Neighbor Adivertisment)消息


其中各字段的含义如下:
1)Target Address:待解析的IPv6地址,16types。Target Address不能是组播地址,可以是链路本地地址、站点本地地址和全球单播地址。
2)Options: 地址解析中只使用了链路层地址选项(Link-Layer Address Option),是发送NS报文节点的链路层地址。链路层地址选项的格式如下图所示:

其中各字段含义如下:
1)Type:选项类型,在链路层地址选项中包括如下两种:

  • Type=1,表明链路层地址为Source Link-Layer Address(源链路层地址),在NS,RS,Redirect报文中使用。
  • Type=2,表明链路层地址为Target Link-Layer Address(目标链路层地址),在NA,Redirect报文中使用。

2)Length:选项长度,以8bytes为单位。
3)Link-Layer Address:链路层地址。长度可变,对于以太网为6bytes。
————————————————
邻居通告报文NA(Neighbor Adivertisment)报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。用来对NS消息进行响应。另外,当节点在链路层变化的时候主动发出NA消息,告知邻居本节点的变化。

3、ICMPv6路由器请求(Router Solicitation)消息


其中字段含义如下:
Options(选项)字段:只能是源链路层地址选项,表明该报文发送者的链路层地址,不过如果IPv6报头的源地址为未指定地址,则不能包括该选项。

ICMPv6路由器请求(Router Solicitation)消息:Type字段值为133,节点启动后,通过RS消息向路由器发出请求,请求前缀和其他配置信息,用于节点的自动配置。

4、ICMPv6路由器通告(Router Advertisement)消息


其中字段含义如下:
image.pngimage.png
选项字段中个选项的含义如下:
1)源链路层地址选项:路由器发送RA报文的接口的链路层地址。
2)MTU选项:包含了在链路上运行的链路层协议所能支持的MTU最大值。
3)前缀信息选项(Prefix Information Option):用于地址自动配置的前缀信息,可包含多个。前缀信息选项在RFC2461中定义,用于表示地址前缀和有关地址自动配置的信息,值用于RA报文中;在其他的消息中,此选项应该被忽略。其格式如下图所示:

其各字段的含义如下所示:
image.pngimage.png
4)路由信息选项(Route Information Option):用于主机生产默认路由。路由信息选项在RFC4191中定义,取代了原前缀信息选项的功能。接收RA报文的主机将选项中的信息添加到自己的贝蒂路由表中,以便在发送报文时做出更好地转发决定,其个数如下图所示:

其中各字段含义如下所示:
image.png

ICMPv6路由器通告(Router Advertisement)消息:Type字段值为134,对RS消息进行回应。在没有抑制RA消息发布的条件下,路由器会周期性地发布RA消息,其中包括前缀信息选项和一些标志位的信息。

5、ICMPv6重定向(Redirect)消息

ICMPv6重定向(Redirect)消息:Type字段值为137,当满足一定的条件时,缺省网关通过向源主机发送重定向消息,使主机重新选择正确的下一跳地址进行后续报文的发送。

IPv6地址解析过程

过程解析

在IPv6中,ND协议通过在节点间交互NS和NA报文完成IPv6地址到链路层地址的解析,解析后用得到的链路层地址和IPv6地址等信息来建立相应的邻居缓存表项。其解析过程如下图所示:

:::warning

  1. NodeA发送一个NS报文到链路上,目的IPv6地址为NodeB对应的被请求节点组播地址**(FF02::1:FF02:B),选项字段中携带了NodeA的链路层地址00E0-FC00-0001。**
  2. NodeB接收到该NS报文后,由于报文的目的地址FF02::1:FF01:B时NodeB的被请求节点组播地址,所以NodeB会处理该报文;同时,根据NS报文中的源地址和源链路层地址选项更新自己的邻居缓存表项。
  3. NodeB发送一个NA报文来应答NS,同时在消息的目标链路层地址选项中携带自己的链路层地址00E0-FC00-0002
  4. NodeA接收到NA报文后,根据报文中携带的NodeB链路层地址,创建一个到目标节点NodeB的邻居缓存表项。

通过交互,NodeA和NodeB就获得了对方的链路层地址,建立其到达对方的邻居缓存表项,从而可以互相通信。
当一个节点的链路层地址发生改变时,以所有节点组播地址FF02::1为目的地址发送NA报文,通知链路上的其他节点更新邻居缓存表项。
:::

抓包再具体看一下解析过程

获取同一链路上邻居节点的链路层地址(与IPv4的ARP功能相同),通过邻居请求消息NS和邻居通告消息NA实现。节点1要获取节点节点2的链路层地址。

节点1在向节点2发送报文之前要解析出节点2的链路层地址。地址解析的过程主要如下(我们使用HCL模拟器来模拟这个过程):

①节点1会发送一个NS报文,Type值为135,源地址为节点1的IPv6地址。目的地址为节点2的被请求节点组播地址,要请求的为节点2的链路层地址。同时NS的报文的Options字段中携带了节点1的链路层地址。如下图:

②节点2收到NS消息后,会回应NS消息,源地址为节点2的IPv6地址,目的地址为节点1的IPv6地址,节点2的链路层地址会被放在Option字段里。

③节点1获取到了节点2的链路层地址。

最后我们在路由器上可以查看到RouterA的IPv6地址信息和所有的邻居信息:


在Ping链路本地地址时,需要使用-i参数,来指定链路本地地址的接口。

邻居不可达检测(NUD)

NUD(Neighbor Unreachability Detection,邻居不可达检测)是节点确定邻居可达性的过程,其检测过程如下图所示:

邻居可达性是单向的,如果需要达到“双向”可达,还需NodeB发送NS探测报文,NodeA给NodeB回应S标志置为的NA报文。

IPv6地址解析的优点

IPv6的地址解析过程包括两部分:一部分解析了目的IP地址所对应的链路层地址;另一部分是邻居可达性状态的维护过程,即邻居不可达检测。 IPv6地址解析相对于IPv4的ARP解析,有以下优点:

  1. 加强了地址解析协议与底层链路的独立性

对每一种链路层协议都使用相同的地址解析协议,无须再为每一种链路层协议定义一个新的地址解析协议。

  1. 增强了安全性

ARP攻击,ARP欺骗是IPv4中严重的安全问题。在第三层实现地址解析,可以利用三层标准的安全认证机制来防止这种ARP攻击和ARP欺骗。

  1. 减小了报文传播范围

在IPv4中,ARP广播必须泛滥到二层网络中每台主机。IPv6地址解析利用三层组播寻址限制了报文的传播范围,通过将地址解析请求仅发送到待解析地址所属的被请求节点组播组,减小了报文传播范围,节省了网络带宽。

无状态地址自动配置

:::info
可阅读之前发表的文章:
无状态地址自动配置 (SLAAC)
:::
IPv6同时定义了无状态与有状态地址自动配置机制。有状态地址自动使用DHCPv6协议来给主机动态分配IPv6地址无状态地址自动配置通过ND协议来实现。在无状态自动配置中,主机通过接受链路上的路由器发出的RA消息,结合接口的标识符而生成一个全球单播地址。
无状态地址自动配置有以下优点:
1)真正的即插即用。节点连接到没有DHCP服务器的网络时,无须手动配置地址等参数便可访问网络。
2)网络迁移方便。当一个站点的网络前缀发生变化,主机能够方便地进行重新编址而不影响网络连接。
3)地址配置方式选择灵活。系统管理员可根据情况决定使用何种配置方式——有状态,无状态还是两者兼容。

无状态自动配置设计以下3种机制:路由器发现DAD检测前缀重新编址

路由器发现

在路由器通告报文RA中承载着路由器的相关信息,ND协议通告RS和RA的报文交互完成路由器发现,前缀发现和参数发现三大功能,协议交互主要有两种情况:主机请求触发路由器通告和路由器周期性发送路由器通告。

  • 主机请求触发路由器通告

当主机启动时,会向本地链路范围内所有的路由器发送RS报文,触发链路上的路由器相应RA报文。主机接收到路由器发出的RA报文后,自动配置默认路由器,建立默认路由列表,前缀列表和设置其他的配置参数。
为了避免链路上有过多的RS报文,启动时每个节点最多只能发送3个RS报文。

  • 路由器周期性发送路由器通告

重复地址检测DAD

**DAD(Duplicate address Detection,重复地址检测)**是节点确定即将使用的地址是否在链路上唯一存在的过程。所有的IPv6单播地址,包括自动配置或手动配置的单播地址,在节点使用之前必须要通过重复地址检测。

当节点获取到一个IPv6地址后,需要使用重复地址检测功能确定该地址是否已被其他节点使用(与IPv4的免费ARP功能相似)。**DAD监测通过NS和NA可以实现重复地址检测。**DAD过程如下所示:

需要注意的是,IPv6节点对任播地址不进行DAD检测,因为任播地址可以被分配给多个接口使用。

在进行DAD检测时,一个IPv6单播地址在分配给一个接口之后且通过重复地址检测之前称为试验地址(Tentative Address)。此时该接口不能使用这个试验地址进行单播通信,但是仍然会加入两个组播组:ALL-NODES组播组和实验地址所对应的Solicited-Node组播组。

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

DAD检测过程:

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

  1. 如果PC2发现2000::1是自身的一个实验地址,则PC2放弃使用这个地址作为接口地址,并且不会发送NA报文。
  2. 如果PC2发现2000::1是一个已经正常使用的地址,那么PC2会向该地址的ALL-NODES组播组发送一个NA报文,该消息中会包含2000::1。这样,PC1收到这个消息后就会发现自身的实验地址是重复的,从而弃用该地址。

前缀重新编址

前缀重新编址(Prefix Renumbering)允许网络从以前的前缀平稳过渡到新的前缀,提供对用户的网络重新编址能力。路由器通告RA报文中的优先时间和有效时间参数来实现前缀重新编址。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原创Python文件头注释块

""" File: encapsulate_into_a_test_class.py Description: 将同一个测试类的测试用例封装到那个类当中去,然后将一个project的所有类移动到对应的generated_by_chatgpt/下面 Author: 行步至春深 Date: 2023.10.16 Usage: 直接在图形界面运行 Input …

flutter开发实战-下拉刷新与上拉加载更多实现

flutter开发实战-下拉刷新与上拉加载更多实现 在开发中经常遇到列表需要下拉刷新与上拉加载更多,这里使用EasyRefresh,版本是3.3.21 一、什么是EasyRefresh EasyRefresh可以在Flutter应用程序上轻松实现下拉刷新和上拉加载。它几乎支持所有Flutter Sc…

ICMP协议(二)

一 ping工作原理 ① 为什么ping不通 "ping不通分为两类" 1) 请求没有到目标服务器细节: 要注意是ip不通还是域名不能解析导致ping不通2) 请求到了目标服务器,但是没有回包 "常见原因" 1、对方关机/ip不存在备注: ping同网段不…

SQL 多线程指南

​您是否厌倦了盯着屏幕等待 SQL 查询完成运行?查询时间延迟是数据库管理员和开发人员中的一个常见问题,但事实并非一定如此。优化性能对于任何应用程序的顺利运行都至关重要,而多线程可以改变游戏规则。想象一下能够瞬间提高数据库性能。您可…

java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter【解决办法】

在本地运行访问一点问题都没有(JDK1.8),但是部署在云服务器上(JDK11)后,访问救出了下面的报错。 遇到的问题: java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter 原因:jdk版本问题 解决方案 方案一&#xff…

记一次MySQL5初始化被kill的问题排查 | 京东云技术团队

写在前面 由于测试环境JED申请比较繁琐,所以Eone提供了单机版Mysql供用户使用,近期Eone搭建Mysql5的时候发现莫名被kill了,容器规格是4C8G,磁盘30G 这不科学,之前都是可以的,镜像没变,配置没变…

k8s-16 k8s调度

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分如果你真的希望或者有这方面…

信息学奥赛一本通-编程启蒙3219:练36.2 不定方程求解

3219:练36.2 不定方程求解 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 955 通过数: 687 【题目描述】 给定正整数a,b,c。求不定方程 axbyc关于未知数x和y的所有非负整数解组数。 【输入】 一行,包含三个正整数a&…

【超级简单】3步 安装conda + pytorch gpu版本

【超级简单】3步 安装conda pytorch gpu版本 1. 创建虚拟环境至于python 3.X和cuda对应 ? 2. 下载cuda 驱动,cuda toolkit (可选)3. 虚拟环境中输入以下指令至于 怎么查看自己电脑对应的cuda版本号 ? 4.测试是否安装成功有疑惑可以再看看这篇…

maven的坐标元素

maven的坐标&#xff1a;使用三个向量在Maven仓库中唯一的定位到一个jar包 * groupId&#xff1a;公司或组织的ID * artifactId&#xff1a;一个项目或者是项目中的一个模块的ID * version&#xff1a;版本号 <groupId>com.gz.maven</groupId> <artifactId&…

企业立案信息API的优势与应用场景

引言 随着科技的不断进步&#xff0c;创业者和企业家们在创办新企业时愈发依赖数字化工具。其中&#xff0c;企业立案信息API成为了一项重要的资源&#xff0c;它提供了有关企业立案的关键信息&#xff0c;为企业家们提供了许多优势和丰富的应用场景。本文将探讨企业立案信息A…

深度学习中需要固定的随机数种子

文章目录 前言random.seed()作用例子Reference np.random.seed()torch.manual_seed() 前言 主要是3个&#xff1a; random.seed()numpy.random.seed()torch.manual_seed() 三个的原理和作用都是相似的&#xff0c;所以接下来我只简单介绍random.seed()。 random.seed() 作…

Spark的数据输入、数据计算、数据输出

PySpark的编程&#xff0c;主要氛围三大步骤&#xff1a;1&#xff09;数据输入、2&#xff09;数据处理计算、3&#xff09;数据输出 1&#xff09;数据输入:通过SparkContext对象&#xff0c;晚上数据输入 2&#xff09;数据处理计算:输入数据后得到RDD对象&#xff0c;对RDD…

MybatisPlus多表关联分页返回结果异常

1. 按照该博客进行多表关联分页查询&#xff1a; https://blog.csdn.net/code_ang/article/details/116448694 2.在实际测试过程中&#xff0c;发现异常&#xff0c;分页返回的结果时而正确&#xff0c;时而错误。 count函数满足预期 count函数不满足预期 只是count了主表的…

竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

C++之基于Winsock2封装UDPServer与UDPClient

文章目录 Socket过程UDPServer.hUDPServer.cppUDPClient.hUDPClient.cppmain.cppCMakeLists.txt测试截图 Socket过程 UDPServer UDPClient UDPServer.h #ifndef UDPSERVER_H_INCLUDED #define UDPSERVER_H_INCLUDED#include <iostream> #include <string> #inclu…

Rust-是否使用Rc<T>

Rust的所有权机制&#xff0c;数据允许通过借用的方式&#xff0c;在函数的上下文中传递数据。如果离开数据作用的有效范围&#xff0c;这个借用就会失效&#xff0c;编译就会报错。这也是我们不会将借用(引用&#xff09;作为函数的返回值的原因。下面的代码编译失败。 fn cr…

SAP-FI模块 处理自动生成会计凭证增强

2、固定资产业务过渡科目摘要增强功能-MIGO ENHANCEMENT 2 ZEHENC_SAPMF05A. "active version * FI 20221215&#xff1a;固定资产业务过渡科目摘要增强功能 WAIT UP TO 1 SECONDS.READ TABLE xbseg WITH KEY hkont 1601990001. IF sy-subrc 0.DATA: lt_bkdf TYPE …

flink教程

文章目录 来自于尚硅谷教程1. Flink概述1.1 特点1.2 与SparkStreaming对比 2. Flink部署2.1 集群角色2.2 部署模式2.3 Standalone运行模式2.3.1 本地会话模式部署2.3.2 应用模式 2.4 YARN运行模式2.4.1 会话模式部署2.4.2 应用模式部署 2.5 历史服务 3. 系统架构3.1 并行度3.2 …

C# 与 C/C++ 的交互

什么是平台调用 (P/Invoke) P/Invoke 是可用于从托管代码访问非托管库中的结构、回调和函数的一种技术。 托管代码与非托管的区别 托管代码和非托管代码的主要区别是内存管理方式和对计算机资源的访问方式。托管代码通常运行在托管环境中&#xff0c;如 mono 或 java 虚拟机等…