ipv6的NDP协议有哪些功能
NDP(neighbor Discovery protocol)是ICMPv6的子协议是IPV6协议体系中一个重要的基础协议,邻居发现协议替代了IPV4的ARP,ICMP路由器发现。它定义了使用ICMPv6报文实现地址解析,跟踪邻居状态,重复地址检测,路由器发现,以及重定向等功能。
- 地址解析:从IP地址解析到数据链路层,地址解析过程中使用了两种ICMPv6报文;邻居请求报文NS(neighbor solicitation)type=135,code=0类似IPV4中ARP请求报文。邻居通告报文NA(neighbor advertisemen type=136,code=0类似IPV4中ARP应答报文)。
- 跟踪邻居状态:通过邻居到达邻居的通信,会因为各种原因中断,如果目的地失效,则恢复是不可能的,通信失败,如果路径失效,则恢复是可能的。因此节点需要维护一张邻居表,每个邻居都有相应的状态,状态之间可以迁移。
RFC2461中定义了五种邻居状态,分别是:未完成(Incomplete)、可达(Reachable)、陈旧(stale)、延迟(Delay)、探查(Probe)。 - 重复地址检测:DAD(Duplicate Address Detect),是在接口使用某个IPV6单播地址之前进行的,主要是为了探测是否有其他节点使用了该地址。类似IPV4中的免费ARP。在通过DAD检测之前,该接口分配的单播地址不能用于单播通信,成为实验地址,但是仍然会加入两个组播组ALL-NODES组播组和试验地址所对应的Solicited-Node组播组。
- 路由器发现:用来发现与本地链路相连的路由器,并获取与地址自动配置相关的前缀和其他配置参数。依靠RA type=134(路由器通告),RS type=133(路由器请求)来实现。
- 重定向:当网关路由器发现报文从其他网关路由器转发更好,就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关路由器。type=137.报文中携带更好地路径下一跳地址和需要重定向转发的报文的目的地址等信息。
是如何进行工作的
地址解析:地址解析过程中主要使用了两种ICMPv6报文;邻居请求报文NS(neighbor solicitation)type=135,code=0,类似IPV4中ARP请求报文。邻居通告报文NA(neighbor advertisement )type=136,code=0类似IPV4中ARP应答报文。

下面通过实验抓取报文来看看。

我们配置好地址后,使用AR1pingAR2。
AR1要访问AR2直连接口,需要得到AR2的MAC地址。
在IPV4中ARP普遍认为是工作在2.5层中,但在IPV6中地址解析工作在第三层中
优点如下:
工作在网络层,抗攻击能力比ARP强
使用组播机制,提高工作效率。
地址解析在三层完成,可以使用不同的二层介质

第5,第6两个包分别是地址解析使用的NS,NA。
工作流程(1)
AR1会发送一个NS(邻居请求报文,type=135,code=0)。
该报文源IP为AR1的接口单播地址2012::1/64。
其目的IP为AR2IPV6单播地址对应的被请求节点地址(组播地址:由固定前缀FF02::1:FF/104,前104bit固定,后24bit为要解析的地址,也就是AR2接口IPV6单播地址后24bit)。
目的地址为FF02::1:FF00:2。
源MAC为AR1的MAC。目的MAC则为节点组播地址映射的IPV6组播MAC=3333-FF00-0002 (前16bit固定3333,后32bit为IPV6组播地址后32bit)

(2)AR2配置了IPV6单播地址2012::2/64后就默认加入了,该单播地址对应的节点组播组。所以只要向该组播组发送报文,AR2是可以接受到的。
当AR2收到AR1的NS(neighbor solicitation)后,通过查看该报文中标识的要解析的地址是不是自己接口的单播地址,
如果是,则回应NA(neighbor advertisement)type=136 code=0
.回应包中源IP为AR2接口IPV6单播地址,目的为AR1接口单播地址。源MAC为自己,目的MAC则是AR1。
同时会携带2012::2/64对应的MAC地址。
至此解析完成,总结一下。
NS(邻居请求报文 type=135,code=0)。
目的IP为对应节点组播地址(由前104bit的固定前缀FF02::1:FF,后24bit为要解析的IPV6单播地址后24bit组成)
目的MAC为组播地址映射的MAC(前16bit3333固定后32bit为要解析的地址后32bit组成)
同时NS报文中会携带需要解析的地址
NA(邻居通告报文 type=136 code=0)
源目MAC,IP已经知道了。
此时报文中携带,NS报文中请求解析地址对应的MAC。
跟踪邻居状态
RFC2461中定义了5种邻居状态,分别是:未完成(INCOMPLETE)、可达(REACHABLE)、陈旧(STALE)、延迟(DELAY)、探查(PROBE)。

按照产品手册上的来,拓扑图还是两台路由器
由于需要假设两台设备从未通信过,所以我们重启一下。

此时未通信,查看邻居
display ipv6 neighbors

无表项
1.R1先发送NS报文,并生成缓存条目,此时邻居状态为未完成(incomplete),收到B回复的NA报文则状态变成可达(reachable)由于某种原因,没能看到邻居状态变成未完成(incomplete)状态,而AR2回了NA报文后,直接变成了可达(reachable)


当然,此时B已经回复了NA,则则邻居状态由Incomplete变为Reachable,否则固定时间后邻居状态由Incomplete变为Empty,即删除表项。即没回复状态-未知变成空的(empty)
2.经过邻居可达时间,邻居状态由REACHABLE(可达)-》未知(stale),即未知是否可达

在stale状态下,如果AR1向AR2发送数据,则邻居状态变为由未知(stale)变为延时(Delay),并发送NS请求


3.经过一段时间后,Delay变为probe(多长时间咱也不知道,等了蛮久没出来)若有NA报文应答,则由Delay(延时)-reachable(可达)。

4.在probe状态,AR1每隔一段时间发送单播NS,发送固定次数后,有应答则变成reachable,否则邻居状态关系则变成Empty,即删除表项。
大致上如此,有的状态没显示出来,可能是太快了?
重复地址检测DAD(Duplicate Address Detect)在接口使用某个IPV6单播地址时进行的。
未进行DAD检测的地址,成为实验地址,不能用来进行单播通信。但是仍然会加入两个组播组。ALL-NODES组播组和试验地址所对应的Solicited-Node组播组。


我们自己抓包来看看内容

这里AR2,AR3地址重复。
.已经抓到包,我们来看一看过程。
当AR3配置了IPV6单播地址2012::2/64,此时AR2上有相同的地址。
1.当AR3配置IPV6单播地址时就会进行地址冲突检测,会发送一个NS报文,来询问网络中有没有人使用2012::2/64这个地址。
该NS报文
源IP为"::",表示AR3还未获取到地址
目的IP为要检测的单播IPV6地址2012::2对应的被请求节点组播地址。FF02::1:FF00:2。MAC地址为对应的3333-FF00-0002
报文中的target会对要检测的IPV6单播地址进行标记。

此时AR2上配置了2012::2/64这个单播地址,所以会默认监听该单播地址对应被请求节点组播组,FF02::1:FF00:2,AR2收到这个报文后,会检查里面target标记的是否是自己的IPv6单播地址。
- 如果这个为自己的实验地址,则放弃使用
- 如果是正常使用的地址,则AR2向该地址的Node-Solicited组播组发送NA报文。该报文中包含了2012::2/64这个地址
回应NA报文
源IP为2012::2/64 目的IP为FF02::1(IPV6所有节点组播地址)。
源MAC为自己,目的MAC为目的IP对应的组播MAC

所以此时AR3收到报文后,发现改地址已经被使用。则放弃使用该地址
路由发现:
ipv6无状态自动分配地址,是如何进行工作的。
IPV6无状态自动分配地址
主机或路由器从RA报文里获得64位前缀,然后通过EUI-64规范自动生成64bit的接口标识,然后得到IPV6单播地址。
默认情况下,路由器发布RA报文是处于抑制状态(也就是不发送),避免占用链路带宽
需要使用命令undo ipv6 nd ra halt,解除抑制RA报文发送。



分为两种情况:主动(RA),被动(RS)
路由器通告RA(router advertisement)报文:路由器周期组播发送RA报文,报文中会含有网络的前缀消息,以及其他标志位信息。RA报文type字段值=134.

1.在R1接口在配置了IPV6单播地址2012::/64,并且开启接口RA报文。type=134.路由器会周期发送RA报文,里面包含前缀2012::/64。
2.报文的源IP为AR1的G0/0/0的链路本地地址,目的IPV6地址为FF02::1所有节点组播地址;源MAC是AR1的MAC,目的MAC是,目的IP对应的组播MAC(3333-0000-0001)
RA报文中的Flags字段:其中的含义

M位:表示是否需要使用DHCPv6来获取IPV6单播地址
M=0(默认)表示使用非DHCPv6来获取IPV6单播地址
M=1,表示使用DHCPv6来获取IPV6单播地址
O位:表示是否需要使用DHCPv6来获取其他参数(DNS等等)
O=0(默认)表示不需要使用DHCPv6来获取其他参数
O=1表示使用DHCPv6获取其他参数
前缀字段里面的Flags

L位:表示该RA消息前缀是否分配给本地链路
L=1(默认)表示该RA消息中前缀是分配给本地链路
L=0表示…
A位:表示该前缀能不能用于无状态自动配置
A=1(默认)表示该前缀可以用于无状态自动配置
A=0表示该前缀不能被用于无状态自动配置
以上字段中值都可以通过命令修改。
测试Mbit位影响(Obit位=0)----摘自B站上学习素材
环境是在win7主机上
思科设备
M=0,RA消息会携带前缀,win7主机收到消息后,使用里面前缀构建地址,并且不发送DHCPv6 solicitation
M=1,RA消息会携带前缀,而win7主机收到消息后,使用里面前缀构建地址,同时发送DHCPv6 solicitation来请求地址
华为设备
M=0,RA消息会携带前缀,win7主机收到消息后,使用里面前缀构建地址,并且不发送DHCPv6 solicitation
M=1,RA消息不会携带前缀,win7主机收到消息后,发送DHCPv6 solicitation
总结:M=1,思科设备依然会携带前缀,华为设备不携带前缀。
摘自:B站红茶三杯的IPV6详解
路由器请求RS(router solicitation)报文:为了尽快获得前缀进行通信,主机可以发送RS报文来请求,路由器收到后会回复RA报文,RS报文中type字段=133.
没抓到RS的包,换成路由器也不行,去网上找一张图

RS报文,type=133.。源IP地址为发这个报文的主机链路本地地址(前提是通过DAD检测),目的地址为FF02::1(所以组播节点地址)。产品手册上为FF02::2。

这里按照网上找的RS报文抓包为准。源MAC为主机MAC。目的MAC为FF02::1对应的组播MAC:3333-0000-0001.通过RA报文获取的路由前缀,经过EUI-64后,会对该地址进行DAD检测,通过了就可以使用,没通过就需要手工配置。
重定向:
当网关路由器发现报文从其他网关路由器转发更好,就会发送重定向报文告知报文的发送者,让报文发送者选择另一个网关路由器。type=137.报文中携带更好地路径下一跳地址和需要重定向转发的报文的目的地址等信息。

没能营造出实验图,只能对着产品文档来说
HostA网关为,RA,主机A,RB,RA处在同一网段,此时主机A访问主机B,报文会先发送给RA,而RA查路由表发现去往主机B的路由,下一跳是RB。所以发现主机A可以选择更好地下一跳RB,访问主机B所以,此时会触发重定向。RA会向主机A发送redirect报文 type=137(我没抓到过)。在该重定向报文中携带主机B的IP,以及最好的下一跳RB的IP。当主机A收到报文后,会自动生成一条去往主机B的主机路由(128bit)。下一跳为RB。之后当主机A访问主机B,就会走RB。而访问其他网络还是把RA当做网关。
触发重定向的条件:
报文的目的地址不是一个组播地址。
经过路由计算后,路由的下一跳出接口是接受报文的接口。
设备发现报文最佳下一跳IP地址和报文的源IP处于同一网段。
设备检查报文源地址,发现自身的邻居表项中有用该地址作为全球单播地址或链路本地地址的邻居存在。
这就没了。
















