IPv6邻居发现协议 - NDP概述

目录

IPv6邻居发现协议 - NDP概述

NDP使用ICMPv6的相关报文

地址解析

地址解析报文

地址解析过程(1)

地址解析过程(2)

邻居状态跟踪

邻居状态种类

邻居状态变化

重复地址检测DAD

DAD过程

路由器发现概述

路由器发现

路由器发现-路由器周期发送RA

IPv6地址无状态自动配置概述

RS报文

 RA报文

其他参数

重定向报文

重定向过程(和ipv4机制相同)



IPv6邻居发现协议 - NDP概述

NDP(Neighbor Discovery Protocol,邻居发现协议)在RFC2462及RFC4861中定义。NDP实现了IPv6中诸多重要机制

NDP使用ICMPv6的相关报文

  • RS(Router Solicitation):路由器请求报文
  • RA(Router Advertisement):路由器通告报文
  • NS(Neighbor Solicitaion):邻居请求报文
  • NA(Neighbor Advertisement):邻居通告报文

地址解析

在IPv4中,可以通过ARP由IP地址解析到链路层地址,ARP协议工作在OSI模型第二层,在IPv6邻居发现协议中使用了ICMPv6报文,在OSI第三层完成地址解析

  • IPv6地址解析不在使用ARP,也不再使用广播方式
  • 地址解析在OSI第三层完成,针对不同的链路层协议可采用相同的地址解析协议
  • 通过ICMPv6(类型135的NS以及类型136的NA报文)实现地址解析
  • NS报文发送使用组播方式发送,报文的目标IPv6地址为被请求IPv6地址对应的“被请求节点组播地址” 报文的目的MAC为组播MAC
  • 采用组播方式发送NS消息相比于广播的方式更加高效,也减少对其他节点的影响和对二层网络的性能压力

地址解析报文

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

邻居请求 (Neighbor Solicitation,NS)

  • Type=135,Code=0。
  • Target Address  是需要解析的IPv6地址,因此该处不准出现组播地址。

邻居通告 (Neighbor Advertisement,NA)

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

地址解析过程(1)

有了NS和NA两种报文,两台主机如何获取对方的链路层地址呢?

  • 在上图所示的场景中,PC1要请求PC2的2001::2222:2222地址对应的MAC地址,PC1会发送一个NS报文。这个报文的原地址是2001::1111:1111,目的地址是2001::2222:2222对应被请求节点组播地址FF02::1:FF22:2222
  • 然后IPv6数据包又被封装上数据帧头部,其中源MAC地址是PC1的MAC地址,目的MAC地址是2001::2222:2222对应的被请求节点组播地址映射得到的MAC

      上一篇文章中说到过被请求节点组播地址和组播MAC地址是如何得到的

IPv6协议报文、地址分类icon-default.png?t=N7T8https://blog.csdn.net/weixin_45059947/article/details/138585746?spm=1001.2014.3001.5502

地址解析过程(2)

  • 除PC2外的其他节点也会收到这个数据帧,在读取数据帧头的时候发现目的MAC地址是一个组播MAC地址,而该组播MAC地址在本地并不侦听,因此在网卡层面就将数据帧丢弃而不再往报文里看了。
  • PC2收到这个数据帧后,由于本地网卡接收目的MAC地址为3333-FF22-2222的数据帧,因此在对数据帧做校验之后从帧头的类型字段得知里头是个IPv6报文,于是将帧头拆掉,把IPv6报文上送IPv6协议栈处理。IPv6协议栈从报文的IPv6头部中的目的IPv6地址得知这个数据包是发往一个被请求节点组播地址FF02::1:FF22:2222,而本地网卡加入了这个组播组。接着,从IPv6包头的NextHeader字段得知IPv6包头后面封装着一个ICMPv6的报文,因此将IPv6包头拆除,将ICMPv6报文交给ICMPv6协议去处理。最后ICMPv6发现这是个NS报文,要请求自己2001::2222:2222对应的MAC地址,于是回送一个NA报文给PC1,在该报文中就包含着PC2的MAC地址

IPv6不想IPv4那样使用ARP表来缓存IP域MAC地址映射,而是维护一个IPv6邻居表

华为数通设备上则使用display ipv6 neighbors命令来查看IPv6邻居表

windows系统可用netsh interface ipv6 show neighbors查看缓存的IPv6邻居

邻居状态跟踪

邻居状态种类

实际通讯过程中,不仅仅是地址解析那么简单,而是维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移

邻居状态有五种

  • incomplete未完成,邻居请求已经发送到目标节点的请求组播地址,但没有收到邻居的通告
  • reachable可达,收到确认,不需在发包确认
  • stale陈旧,收到上一次可达性确认后超过了30s
  • delay延迟,在stale状态后发送过一个报文,并且在5s内美欧可达性确认
  • Probe探查,每个1s重传邻居请求来主动请求可达性确认

邻居状态变化

例子:节点A要访问节点B,A的缓存中无B的条目,下图是邻居状态机的变化

邻居状态的迁移是比较复杂的,下面以A、B两个节点之间相互通讯过程的A节点的邻居状态变化,假设A、B两个节点之前没有任何通讯

1、A先发送NS,并生成邻居缓存条目,状态变为Incomplete

2、若B回复NA,则incomplete->reachable,否则10s后incomplete->empty,既即删除条目

3、经过reachable time 30s,条目状态reachable->stale

4、或者在reachable状态,收到B的非请求NA,切链路层地址不同,则马上->stale

5、在Stale状态,若A要向B发送数据,则Stale->delay同时发送NS请求

6、在Delay_First_Probe_time(默认5s)后,delay->probe,若期间有NA应答,则刷新表项delay->reachable

7.在Probe状态,每隔RetransTimes(默认1s)发送单播NS,发送MAX_UNICAST_SOLICIT(默认3)个后再等RestransTimes,有应答则——>reachable,没有应答则进入empty,即删除表项

  • IPv6的邻居维护关系确保,再发起通讯之前,邻居是可达到,IPv4的ARP无法做到,ARP表项仅仅通过老化表项来实现

重复地址检测DAD

DAD机制

  • 重复地址检测确保网络中无两个相同的单播地址
  • 所有单播地址都需要做DAD
  • 使用NS(特殊NS)和NA(特殊NA)完成DAD交互过程
  • 一个地址在通过DAD地址重复检测之前称为“tentative地址试验性地址,接口还暂时不能使用这个实验性地址进行正常的IPv6单播通讯,但是会加入和该地址所对应的solicited-Node组播组。
  • DAD重复地址检测:节点向该Tentative地址所在的Solicited-Node(被请求节点组播地址)组播发送一个NS(特殊NS)原地址是::,如果收到某个其他站点回应的NA,就证明改地址已被网络使用。节点不能使用该tentative地址通讯。
  • 接口在启用任何一个单播IPv6地址前都需要进行DAD,包括link-local地址

DAD过程

在上图中,R2已经是在线的设备,该设备使用如图的地址,现在为R1新配置IPv6的地址2001::FFFF/64,改地址立即进入tentative状态,此时地址不可用,除非该地址通过DAD检测

1、R1向链路上以组播的方式发送一个NS报文,该IPv6的源地址为" : : ",目的地址为要进行DAD检测的2001::FFFF对应的被请求节点组播地址,也就是FF02::1:FF00:FFFF,这个NS里包含着要做DAD检测的目标地址2001::FFFF

2、链路上的节点都会收到这个组播NS的报文,没有配置2001::FFFF的节点由于没有加入该地址对应的被请求节点组播组,因此在收到这个NS的报文默默丢弃,R2接口配置了2001::FFFF地址,接口会加入到组播组FF02::1:FF00:FFFF,而此刻收到的报文是该地址为目的地址,因此他会解析该报文,他发现对方进行DAD的目标地址与自己本地接口地址想同,于是立即回送一个NA报文,该报文的目的地址是FF02::1,也就是组播地址,同时在报文内部写入原地址2001::FFFF,以及自己接口的mac地址

3、当R1收到这个NA后,他就知道2001::FFFF在链路上已经有人再使用了,会将改地址标记为Duplicate(重复的),该地址不能用于通信

路由器发现概述

路由器发现

路由器发现功能是IPv6地址自动配置功能的基础,主要通过两种报文实现

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

路由器发现功能用来发现与本地链路相连的设备,并获取与地址自动配置相关的前缀和其他配置参数 IPv6地址支持无状态自动配置,即主机通过路由器发送RA报文获取网络前缀信息,然后之际自己生成地址的接口标识部分,并自动配置IPv6地址。

路由器发现-路由器周期发送RA

链路上的路由器会定期约250s发送RA(Router Advertisement)消息

  • 收到RA的主机将加入默认路由器列表中
  • 收到RA的路由器将检测RA内容的一致性

主机接口初始化时发RS消息,路由器回应RA

IPv6地址无状态自动配置概述

  • IPv6地址无状态自动配置(StateLess Address AutoConfiguration,SLAAC)是IPv6的标准功能,在RFC2462中定义。
  • 在IPv6中,设备可以通过手工或者动态的方式获取地址。在动态获取地址的方式中,存在DHCPv6及无状态地址自动配置两种方式。
  • 相比于DHCPv6这种动态地址分配技术而言,SLAAC无需部署应用服务器,更加轻量。

  • 使用IPv6地址无状态自动配置后,设备的IPv6地址无需进行手工配置,即插即用,减轻网络管理的负担。
  • 大致的工作过程如下:
  • 主机根据本地接口ID自动产生网卡的链路本地地址。
  • 主机对链路本地地址进行DAD检测, 如果该地址不存在冲突则可以启用。
  • 主机发送RS报文尝试在链路上发现IPv6路由器,该报文的源地址为主机的链路本地地址。
  • 路由器回复RA报文(携带IPv6前缀信息,路由器在未收到RS时也能够配置主动发出RA报文)。
  • 主机根据路由器回应的RA报文,获得IPv6地址前缀信息,使用该地址前缀,加上本地产生的接口ID,形成单播IPv6地址。
  • 主机对生成的IPv6地址进行DAD检测,如果没有检测到冲突,那么该地址才能够启用。

AR1:
system-view
ipv6                                              
interface GigabitEthernet0/0/0
 ipv6 enable                                  
 ipv6 address 2002::1:1/64              
 undo ipv6 nd ra halt              #开启接收RA报文,默认是关闭的

AR2:
system-view
sysname Router2
ipv6
interface GigabitEthernet0/0/0
 ipv6 enable
 ipv6 address auto global          # AR2只需要接收AR1推送的前缀即可

RS报文

 RA报文

注:回复的RA可以直接单播给请求的主机,也可以选择多播到所有节点

其他参数

1、当存在以下情况时忽略RA发送的前缀:

  • RA报文选项中的“auto”未置位。//前缀里面的Auto位。
  • 前缀与已有地址前缀重复(包括link-local地址)。//RA前缀和本地地址前缀冲突。
  • RA报文选项中的“preferred lifetime”时间大于 “ valid lifetime ”//优先时间大于可用时间
  • 前缀长度与接口ID长度之和不等于128位。//一般要求接口ID64位,前缀64位(两者匹配)

2、除以上情况外,主机获得前缀同时也获得一些相关时间参数:

  • “preferred lifetime”=主动通信的有效时间。
  • “ valid lifetime ”=原有通讯的有效时间。

3、主机会周期性(约250s)的收到RA报文,并据此报文来更新自己的时间参数。

重定向报文

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

  • 经常网关路由器发现报文从其它网关路由器转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关路由器。
  • 报文格式中Type为137,Code为0;
  • Target Address是更好的路径下一跳地址;
  • Destination Address是需要重定向转发的报文的目的地址。

重定向过程(和ipv4机制相同)

  • 下面是一个具体的例子,假设主机A想与主机B通讯,主机A的默认网关路由器是RTA,那么当A发送报文给B时报文会被送到RTA。
  • RTA接收到A发送的报文以后会发现实际上主机A直接发送给路由器R2更好,它将发送一个ICMPv6重定向报文给主机A,其中Target Address为RTB,Destination Address为主机B。
  • 主机A接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往主机B的报文就直接给R2。
  • 这就是重定向的一个简单过程,其中会有个问题:RTA如何知道去往主机B的路径通过RTB更好呢?其实这个很简单,因为RTA会发现报文进入的接口就是报文路由得出接口,也就是说发往主机B的路由实际上只是在RTA上转了一圈出来了,然后转发到RTB,据此,RTA能判断出直接给RTB是更好的路径。

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IPv6邻居发现协议NDP)是IPv6网络中的一种重要协议,主要用于发现同一链路上的IPv6节点,以及维护IPv6邻居关系。以下是对NDP的详细解释: 1. NDP的作用 IPv6中的节点地址通常是由网络前缀和节点标识符组成的,其中节点标识符通常是由MAC地址派生而来。因此,当IPv6节点需要与同一链路上的其他节点通信时,需要知道这些节点的地址和MAC地址。NDP主要用于以下方面: - 发现同一链路上的IPv6节点和它们的MAC地址; - 维护IPv6邻居关系,检测邻居是否在线或不在线; - 为IPv6地址解析提供支持。 2. NDP消息类型 NDP使用以下几种消息类型: - 邻居请求消息:用于请求其他节点的MAC地址; - 邻居通告消息:用于通告自己的IPv6地址和MAC地址; - 重定向消息:用于告诉其他节点一个更优的路由。 3. NDP的操作过程 当一个IPv6节点需要向同一链路上的其他节点发送数据时,它首先需要通过NDP查找目标节点的MAC地址。具体操作过程如下: 1)发送邻居请求消息:源节点向目标节点发送一个邻居请求消息,请求目标节点的MAC地址。 2)接收邻居通告消息:如果目标节点在线并且收到了邻居请求消息,则向源节点发送一个邻居通告消息,包含自己的IPv6地址和MAC地址。 3)建立邻居关系:源节点收到邻居通告消息后,将目标节点的IPv6地址和MAC地址存储在邻居缓存中,同时建立邻居关系。 4)维护邻居关系:源节点会定期向邻居节点发送邻居通告消息以更新邻居缓存中的邻居信息。如果源节点长时间没有收到邻居通告消息,则认为邻居离线,将邻居缓存中的邻居状态设置为不在线。 4. NDP的安全性问题 由于NDP消息中未进行身份验证,因此可能存在一些安全性问题,如欺骗攻击、重放攻击等。为了避免这些攻击,可以采用以下措施: - 使用IPv6防火墙来限制NDP消息的流量; - 在NDP消息中使用加密技术保护消息的机密性和完整性; - 使用IPv6安全扩展协议IPsec)来保护NDP消息的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值