网络学习:邻居发现协议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=133 | RS(Router Soliciation 路由器请求报文) |
| type=134 | RA(Router Advertisement 路由器公告报文) |
| type=135 | NS(Neighbor Solicitatio 邻居请求报文) |
| type=136 | NA(Neighbor Advertisement 邻居通告报文) |
| type=137 | Redirect(重定向报文) |

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地址,生成本地链路地址。

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

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

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

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

  5. 根据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地址处于同一网段。
  • 设备检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地址或链路本地地址的邻居存 在。
相关推荐
热爱跑步的恒川2 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面3 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
音徽编程5 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
幺零九零零6 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
23zhgjx-NanKon7 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon7 小时前
华为eNSP:mux-vlan
网络·安全·华为
点点滴滴的记录7 小时前
RPC核心实现原理
网络·网络协议·rpc
Lionhacker7 小时前
网络工程师这个行业可以一直干到退休吗?
网络·数据库·网络安全·黑客·黑客技术
程思扬8 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
ZachOn1y8 小时前
计算机网络:运输层 —— 运输层概述
网络·tcp/ip·计算机网络·运输层