IPv6 ND 协议
一、概述:
A、协议概述:
ND(NeighborDiscovery,邻居发现)协议是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、路由器重定向:当在本地链路上存在一个到达目的网络的更好地路由器时,路由器需要通过节点来进行相应配置改变。

B、协议报文:
ARP报文是直接封装在以太网报文中,以太网协议类型为0x0806,普遍观点认为ARP定位为第2.5层的协议。ND本身基于ICMPv6实现,以太网协议类型为0x86DD,即IPv6报文,IPv6下一个报头字段值为58,表示ICMPv6报文,由于ND协议使用的所有报文均封装在ICMPv6报文中,一般来说,ND被看作第3层的协议。在三层完成地址解析,主要带来以下几个好处:
地址解析在三层完成,不同的二层介质可以采用相同的地址解析协议。
可以使用三层的安全机制避免地址解析攻击
使用组播方式发送请求报文,减少了二层网络的性能压力。
ND协议定义了5种ICMPv6报文类型,包括 RS、RA、NS、NA 和 Redirect报文.如右图所示。
NS/NA报文主要用于地址解析,RS/RA报文主要用于无状态地址自动配置,Redirect报文用于路由器重定向。


C、地址解析:
1、解析过程:
IPv6中,ND协议通过在节点间交互 NS(邻居请求)和 NA(邻居公告) 报文完成IPv6地址到链路层地址的解析,解析后用得到的链路层地址和IPv6地址等信息来建立相应的邻居缓存表项.
如图3-3所示,NodeA 的链路层地址为00E0-FC00-0001,全局地址为1::1::A。NodeB 的链路层地址为00E0-FC00-0002,全局地址为1::2:B。
当 NodeA 要发送数据报文到 NodeB时,如果不知道NodeB的链路层地址,则需要 ND协议完成以下地址解析过程。
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报文,通知链路上的其他节点更新邻居缓存表项。

2、地址解析交互报文:
NS报文是ICMPv6中类型为135的报文,其结构如下图所示:
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报文:**NA报文是ICMPv6中类型为136的报文,其结构如图所示。其中各字段的含义如下:
1)R:路由器标记(Router Flag)位,表示NA报文发送者的角色,置为“1”表示发送者都是路由器,置为“0”表示发送者为主机。
2)S:请求标记(Solicited Flag)位,置为“1”表示该NA报文是对NS报文的响应。
3)O:覆盖标记(Override Flag)位,置为“1”表示节点可以用NA报文中携带的目标链路层地址选项中的链路层地址来覆盖原有的邻居缓存表项。置为“0”表示只有在链路层地址位置时,才能用目标链路层地址选项来更新邻居缓存表项。
4)Target Address:待地址重复检测或地址解析的IPv6地址。如果NA报文是响应NS报文的,则该字段直接复制NS报文中的Target Address。
5)Options:只能是Type值为2的Target Link-Layer Address,是被解析节点的链路层地址。

3、IPv6地址解析的优点
IPv6的地址解析过程包括两部分:一部分解析了目的IP地址所对应的链路层地址;另一部分是邻居可达性状态的维护过程,即邻居不可达检测。 IPv6地址解析相对于IPv4的ARP解析,有以下优点:
加强了地址解析协议与底层链路的独立性:对每一种链路层协议都使用相同的地址解析协议,无须再为每一种链路层协议定义一个新的地址解析协议。
增强了安全性:ARP攻击,ARP欺骗是IPv4中严重的安全问题。在第三层实现地址解析,可以利用三层标准的安全认证机制来防止这种ARP攻击和ARP欺骗。
减小了报文传播范围:在IPv4中,ARP广播必须泛滥到二层网络中每台主机。IPv6地址解析利用三层组播寻址限制了报文的传播范围,通过将地址解析请求仅发送到待解析地址所属的被请求节点组播组,减小了报文传播范围,节省了网络带宽。
D、跟踪邻居状态:
通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。如果目的地失效,则恢复是不可能的,通信失败;如果路径失效,则恢复是可能的。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。FC2461中定义了5种邻居状态,分别是:未完成(Incomplete)、可达(Reachable)、陈旧(Stale)、延迟(Delay)、探查(Probe)
邻居状态的具体迁移过程如右图所示:
下面以A、B两个邻居节点之间相互通信过程中A节点的邻居状态变化为例(假设A、B之前从未通信),说明邻居状态迁移的过程。
A先发送NS报文,并生成缓存条目,此时,邻居状态为Incomplete。
若B回复NA报文,则邻居状态由Incomplete变为Reachable,否则固定时间后邻居状态由Incomplete变为Empty,即删除表项。
经过邻居可达时间,邻居状态由Reachable(默认30s)变为Stale,即未知是否可达。
如果在Reachable状态,A收到B的非请求NA报文(MAC地址修改),且报文中携带的B的链路层地址和表项中不同,则邻居状态马上变为Stale。
在Stale状态若A要向B发送数据,则邻居状态由Stale变为Delay,并发送NS请求。
在经过一段固定时间后,邻居状态由Delay(默认5s)变为Probe(每隔1s发送一次NS报文,连续发送3次),其间若有NA应答,则邻居状态由Delay变为Reachable。
在Probe状态,A每隔一定时间间隔z(1s)发送单播NS,发送固定次数(3)后,有应答则邻居状态变为Reachable,否则邻居状态变为Empty,即删除表项。

E、无状态地址自动配置:
1、介绍和优点:
IPv6同时定义了无状态与有状态地址自动配置机制。有状态地址自动使用DHCPv6协议来给主机动态分配IPv6地址,无状态地址自动配置通过ND协议来实现。
无状态自动配置即自动生成链路本地地址,主机根据RA报文的前缀信息,自动配置全球单播地址等,并获得其他相关信息。
自动配置的IPv6地址在系统中有一个生存周期,在这个生存周期中,这个地址根据与优先时间和有效时间的关系,可以被划分为临时(Tentative),优先(Preferred),反对(Deprecated)和无效(Invalid)4种状态

去状态地址自动配置有以下优点:
1)真正的即插即用。节点连接到没有DHCP服务器的网络时,无须手动配置地址等参数便可访问网络。
2)网络迁移方便。当一个站点的网络前缀发生变化,主机能够方便地进行重新编址而不影响网络连接。
3)地址配置方式选择灵活。系统管理员可根据情况决定使用何种配置方式——有状态,无状态还是两者兼容。
无状态自动配置设计以下3种机制:路由器发现、DAD检测、前缀重新编址。
路由器发现可以使节点获得链路上可用的前缀及路由器信息;
DAD 检测保证了配置的每个IPv6地址在链路上的唯一性;
前缀重新编址则是在前面两个机制的基础上,重新通告前缀,完成网络前缀的切换。



2、路由器发现:
路由器发现是指主机怎样定位本地链路上的路由器和确定其配置信息的过程,主要包含以下三方面的内容。
路由器发现(RouterDiscovery):主机发现邻居路由器以及选择哪一个路由器作为默认网关的过程。
前缀发现(PrefixDiscovery):主机发现本地链路上的一组IPv6前缀,生成前缀列表。该列表用于主机的地址自动配置和 On-link判断。
参数发现(ParameterDiscovery):主机发现相关操作参数的过程,如链路最大传输单元(MTU)、报文的默认跳数限制(HopLimit)、地址配置方式等信息。
在路由器通告报文 RA 中承载着路由器的相关信息,ND协议通过 RS和 RA 的报文交互完成路由器发现、前缀发现和参数发现三大功能。协议交互主要有两种情况:主机请求触发路由器通告和路由器周期性发送路由器通告。
路由器通告RA(Router Advertisement)报文:每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送RA报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。RA报文的Type字段值为134。
路由器请求RS(Router Solicitation)报文:很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送RS报文,网络上的设备将回应RA报文。RS报文的Tpye字段值为133。为了避免链路上的 RS报文泛滥,启动时每个节点最多只能发送3个 RS报文
3、重复地址检测:
重复地址检测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的Solicited-Node组播组发送一个以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状态。

4、前缀重新编址:
前缀重新编址(Prefix Renumbering)允许网络从以前的前缀平稳过渡到新的前缀,提供对用户的网络重新编址能力。路由器通告RA报文中的优先时间和有效时间参数来实现前缀重新编址。
F、重定向:
当网关设备发现报文从其它网关设备转发更好,它就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关设备。重定向报文也承载在ICMPv6报文中,其Type字段值为137,报文中会携带更好的路径下一跳地址和需要重定向转发的报文的目的地址等信息。
Host A需要和Host B通信,Host A的默认网关设备是Router A,当Host A发送报文给Host B时报文会被送到Router A。Router A接收到Host A发送的报文以后会发现实际上Host A直接发送给Router B更好,它将发送一个重定向报文给主机A,其中报文中更好的路径下一跳地址为Router B,Destination Address为Host B。Host A接收到了重定向报文之后,会在默认路由表中添加一个主机路由,以后发往Host B的报文就直接发送给Router B。
当设备收到一个报文后,只有在如下情况下,设备会向报文发送者发送重定向报文:
报文的目的地址不是一个组播地址。
报文并非通过路由转发给设备。
经过路由计算后,路由的下一跳出接口是接收报文的接口。
设备发现报文的最佳下一跳IP地址和报文的源IP地址处于同一网段。
设备检查报文的源地址,发现自身的邻居表项中有用该地址作为全球单播地址或链路本地地址的邻居存在。
