参考文章:https://blog.csdn.net/Gina_wj/article/details/106708770
IPv6基础篇(四):邻居发现协议NDP
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协议定义了5种ICMPv6报文类型,如下表所示:
NS/NA报文主要用于地址解析
RS/RA报文主要用于无状态地址自动配置
Redirect报文用于路由器重定向。
IPv6邻居发现协议使用5种类型的ICMPv6消息类型,用来实现地址解析,重复地址检测,路由器发现以及路由重定向等功能。具体的ICMPv6的消息类型及具体作用如下:
其中各字段的含义如下:
1)Target Address:待解析的IPv6地址,16types。Target Address不能是组播地址,可以是链路本地地址、站点本地地址和全球单播地址。
2)Options:地址解析中只使用了链路层地址选项(Link-Layer Address Option),是发送NS报文节点的链路层地址。链路层地址选项的格式如下图所示:
其中各字段含义如下:
1)Type:选项类型,在链路层地址选项中包括如下两种:
2)Length:选项长度,以8bytes为单位。
3)Link-Layer Address:链路层地址。长度可变,对于以太网为6bytes。
邻居请求报文NS(Neighbor Solicitation)报文:Type字段值为135,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP请求报文。用来获取邻居的链路层地址,验证邻居是否可达,进行重复地址检测等。
其中各字段的含义如下:
1)Target Address:待解析的IPv6地址,16types。Target Address不能是组播地址,可以是链路本地地址、站点本地地址和全球单播地址。
2)Options: 地址解析中只使用了链路层地址选项(Link-Layer Address Option),是发送NS报文节点的链路层地址。链路层地址选项的格式如下图所示:
其中各字段含义如下:
1)Type:选项类型,在链路层地址选项中包括如下两种:
2)Length:选项长度,以8bytes为单位。
3)Link-Layer Address:链路层地址。长度可变,对于以太网为6bytes。
————————————————
邻居通告报文NA(Neighbor Adivertisment)报文:Type字段值为136,Code字段值为0,在地址解析中的作用类似于IPv4中的ARP应答报文。用来对NS消息进行响应。另外,当节点在链路层变化的时候主动发出NA消息,告知邻居本节点的变化。
其中字段含义如下:
Options(选项)字段:只能是源链路层地址选项,表明该报文发送者的链路层地址,不过如果IPv6报头的源地址为未指定地址,则不能包括该选项。
ICMPv6路由器请求(Router Solicitation)消息:Type字段值为133,节点启动后,通过RS消息向路由器发出请求,请求前缀和其他配置信息,用于节点的自动配置。
其中字段含义如下:
选项字段中个选项的含义如下:
1)源链路层地址选项:路由器发送RA报文的接口的链路层地址。
2)MTU选项:包含了在链路上运行的链路层协议所能支持的MTU最大值。
3)前缀信息选项(Prefix Information Option):用于地址自动配置的前缀信息,可包含多个。前缀信息选项在RFC2461中定义,用于表示地址前缀和有关地址自动配置的信息,值用于RA报文中;在其他的消息中,此选项应该被忽略。其格式如下图所示:
其各字段的含义如下所示:
4)路由信息选项(Route Information Option):用于主机生产默认路由。路由信息选项在RFC4191中定义,取代了原前缀信息选项的功能。接收RA报文的主机将选项中的信息添加到自己的贝蒂路由表中,以便在发送报文时做出更好地转发决定,其个数如下图所示:
其中各字段含义如下所示:
ICMPv6路由器通告(Router Advertisement)消息:Type字段值为134,对RS消息进行回应。在没有抑制RA消息发布的条件下,路由器会周期性地发布RA消息,其中包括前缀信息选项和一些标志位的信息。
ICMPv6重定向(Redirect)消息:Type字段值为137,当满足一定的条件时,缺省网关通过向源主机发送重定向消息,使主机重新选择正确的下一跳地址进行后续报文的发送。
在IPv6中,ND协议通过在节点间交互NS和NA报文完成IPv6地址到链路层地址的解析,解析后用得到的链路层地址和IPv6地址等信息来建立相应的邻居缓存表项。其解析过程如下图所示:
:::warning
通过交互,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(Neighbor Unreachability Detection,邻居不可达检测)是节点确定邻居可达性的过程,其检测过程如下图所示:
邻居可达性是单向的,如果需要达到“双向”可达,还需NodeB发送NS探测报文,NodeA给NodeB回应S标志置为的NA报文。
IPv6的地址解析过程包括两部分:一部分解析了目的IP地址所对应的链路层地址;另一部分是邻居可达性状态的维护过程,即邻居不可达检测。 IPv6地址解析相对于IPv4的ARP解析,有以下优点:
对每一种链路层协议都使用相同的地址解析协议,无须再为每一种链路层协议定义一个新的地址解析协议。
ARP攻击,ARP欺骗是IPv4中严重的安全问题。在第三层实现地址解析,可以利用三层标准的安全认证机制来防止这种ARP攻击和ARP欺骗。
在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(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报文后,有两种处理方法:
前缀重新编址(Prefix Renumbering)允许网络从以前的前缀平稳过渡到新的前缀,提供对用户的网络重新编址能力。路由器通告RA报文中的优先时间和有效时间参数来实现前缀重新编址。