IPv6重臣之ICMPv6

 

本章内容非常多哦~快来学习ICMPv6吧,包你充实!...





IPv6简单走两步


概述及消息类型

ICMPv6是IPv6非常重要的基础性协议。

在IPv6中许多基础机制都是由ICMPv6定义及完成,例如地址冲突检测、地址解析、无状态自动获取等等。ICMPv6定义了多种消息类型和机制来实现这些功能。

在IPv6包头中,NextHead=58则表示IPv6包头后封装着一个ICMPv6消息:

ICMPv6消息有两大类:差错消息及信息消息
还有一些其他报文,为NDP而定义,后续介绍。


NDP

1.   NDP概述

NeighborDiscovery Protocol 邻居发现协议,在RFC2462及RFC4861中定义。NDP实现了IPv6中诸多重要机制,如下图所示:
NDP实现了IPv6中的如下功能:

地址解析

在IPv6中,取消了原来在IPv4中扮演重要角色且又带来诸多问题的ARP,取而代之的是使用NDP所定义的邻居请求NS和邻居通告NA消息来实现地址解析功能。

邻居的状态跟踪

IPv6定义了节点之间邻居的状态机,同时还维护着邻居IPv6地址与二层地址,如MAC的映射关系。

无状态自动配置

无状态自动配置是IPv6的一个亮点功能,它使得IPv6主机能够非常便捷的连接到IPv6网络中,即插即用,无需手工配置繁冗的IPv6地址,无需部署应用服务器为主机分发地址。无状态自动配置机制使用到了ICMPv6消息中的路由器请求RS及路由器通告RA消息。

重复地址检测(DAD)

重复地址检测是一个非常重要的机制,一个IPv6地址必须经历DAD检测,通过检测之后才能够启用。DAD检测用于发现链路是否存在IPv6地址冲突。

前缀重编址

IPv6路由器能够通过ICMPv6的路由器公告消息RA向链路上通告IPv6前缀信息。通过这种方式,主机能够从RA消息中所包含的前缀信息自动构建自己的IPv6单播地址。当然这些自动获取的地址是有生存时间的。通过在RA消息中通告IPv6地址前缀,并且灵活的设定地址的生存时间,能够实现网络中IPv6新、老前缀的平滑过渡,无需在主机终端上消耗大量的手工劳动重新配置地址。

路由器重定向

路由器向一个IPv6节点发送ICMPv6的重定向消息,通知它在相同的本地链路上有一个能更好到达目的地的下一跳。IPv6中的重定向功能与IPv4中的是一样的。

NDP使用ICMPv6消息来实现其功能,其所定义的ICMPv6消息类型如下:
每种机制中使用到的ICMPv6消息如下:
2.   地址解析

两个节点之间要进行IP通信,除了需具备双方的IP地址,还需要IP地址对应的二层地址信息以便组装数据帧,在以太网环境中,这个二层地址就是MAC。IPv4中用ARP帮助节点获取目标IP地址对应的MAC。ARP使用广播的方式发送Request消息请求目标IP对应的MAC,这实际上造成了链路上其他节点的负担,因为他们不得不去分析这个广播数据帧,然后再丢弃。

NDP使用类型135(邻居请求消息NS)及类型136(邻居通告消息NA)这两个消息来替代ARP实现地址解析。具体的过程如下:
上图所示的场景中,PC1要请求PC2的2001::2这个地址对应的MAC,PC1使用一个ICMPv6类型135的消息,也就是邻居请求消息NS来请求2001::2对应的MAC。这个ICMPv6消息被封装上IPv6的包头,源地址是2001::1,目的地址则是2001::2对应的被请求节点组播地址。注意了,目标地址并非是广播地址,实际上IPv6中压根就没有广播或者广播地址的概念。

然后IPv6数据包又被封装上数据帧的头部,源MAC是PC1的MAC,目的MAC则是2001::2这个目标地址对应的被请求节点组播地址映射得到的MAC。
除R2外的其他节点收到这个数据帧,在读取数据帧头的时候发现,目的MAC是一个组播MAC,而该组播MAC本地并不侦听,因此在MAC层就将数据帧丢弃而不再往报文里看了。

PC2收到这个数据帧,由于本地网卡接收目的MAC为3333-FF00-0002的数据帧,因此在对数据帧做校验之后,从帧头的类型字段得知里头是个IPv6的报文,将帧头拆掉,把里头的IPv6报文上送IPv6协议栈处理。IPv6协议栈从报文的IPv6头部中的目的IPv6地址得知这个数据包是发往一个被请求节点组播组地址FF02::1:FF00:2。

而本地网卡加入了这个组播组,显然这个报文是发给自己的。接着,从IPv6包头的NextHeader字段得知IPv6包头后面封装着一个ICMPv6的报文,因此将IPv6包头拆除,将里头的IPv6报文交给ICMPv6进程去处理。最后ICMPv6进程发现这是个NS报文,需要请求自己2001::2对应的MAC,于是回送一个ICMPv6类型136的消息(邻居通告消息NA)给PC1,在该消息中就包含着PC2的MAC地址。

在windows7等操作系统上,可以使用netshinterface ipv6 show neighbors命令查看邻居缓存的内容。IPv6不像IPv4那样使用ARP表来缓存IP与MAC的映射,而是维护一个IPv6邻居表。在我司数通设备上则使用displayipv6 neighbors命令来查看。
3.   邻居状态跟踪
(1)A发送NS给B,在IPv6邻居表中创建缓存条目,状态为 Incomplete。

(2)收到B回复的NA,则 Incomplete->Reachable,否则Incomplete->Empty,即删除条目。

(3)闲置ReachableTime(默认30s)后,B的条目状态Reachable->Stale。或者在Reachable状态收到B的非请求NA,且链路层地址不同,则马上->Stale。

(4)在Stale状态下,若A要向B发送数据,则数据发出后,Stale->Delay,同时发送NS给B。

(5)在Delay_First_Probe_Time(默认5秒)内无应答则Delay->Probe,若有NA应答则Delay->Reachable。

(6)在Probe状态,每隔RetransTimer(默认1秒)发送单播NS,发送MAX_UNICAST_SOLICIT个后再等RestransTimer,有应答则->Reachable,否则进入Empty,即删除表项。4.   DAD

机制概述

  • Duplicate Address Detection,简称DAD,重复地址检测,确保IPv6单播地址在链路上不存在冲突(重复)。
  • 所有IPv6单播地址都需要通过DAD检测,才能够正式启用。
  • DAD使用NS(邻居请求)和NA(邻居通告)来完成其机制。
DAD原理

  • 一个地址在通过DAD检测之前称为“tentative地址”也就是试验性地址。接口暂时还不能使用这个试验性地址进行正常的IPv6单播通讯,但是会加入该地址所对应的Solicited-Node组播组。
  • DAD重复地址检测:节点向该tentative地址所在的Solicited-Node组播地址发送一个NS,如果收到NA,就证明该地址已被在链路上被使用了,节点将不能使用该tentative地址进行通讯。
  • 接口在启用任何一个单播IPv6地址前都需要先进行DAD,包括LinkLocal地址。
DAD示例
R2已是在线的设备,为R2的接口配置的IPv6地址如图所示,现在为R1新配置一个IPv6的地址2001::FFFF/64,观察一下会发生什么事情。
R1的接口在配置上2001::FFFF/64的单播地址,该地址立即进入tentative状态,此时仍然是不可用的,除非该地址通过DAD检测,下面我们分析以下DAD检测的过程。

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

(2)链路上的节点都会收到这个组播的NS消息,没有配置2001::FFFF的节点接口由于没有加入该地址对应的被请求节点组播组,因此在收到这个NS消息的时候默默丢弃。而R2在收到这个消息后,情况就不一样了,由于它的接口配置了2001::FFFF地址,因此接口会加入组播组FF02::1:FF00:FFFF,而此刻所收到的报文又是以该地址为目的地址,它会将报文上送到CPU进行处理,经过报文内容的查看,它发现对方进行DAD的目标地址与自己本地接口地址重复了,因此立即回送一个NA(ICMPv6,类型136)消息,该消息的目的地址是FF02::1,也就是所有节点组播地址,同时在报文内写入目标地址2001::FFFF,以及自己接口的MAC。

(3)当R1收到这个消息时,他就知道2001::FFFF这个地址在链路上已经有人在用了,因此将该地址标记为Duplicated(重复的),该地址将不能用于通信。
5.   无状态自动配置

5.1无状态自动配置(Stateless autoconfiguration)概述

是IPv6的标准功能,在RFC2462中定义。

  • 节点的IPv6地址无需进行手工配置,即插即用性,减轻网络管理的负担。对主机、路由器均可进行自动配置。
  • 可配置多个地址进行网络无缝迁移。
  • 使用ICMPv6的RS和RA消息完成该机制。
大致的工作过程如下:

(1)IPv6主机根据本地接口ID自动产生网卡的链路本地(link-local)地址。

(2)对链路本地地址进行DAD, 如果该地址不冲突则可以启用,节点就具备了IPv6单播连接能力。

(3)主机发送RS消息尝试在链路上发现IPv6路由器。

(4)路由器返回RA消息(携带准备分配给主机的IPv6前缀信息。路由器在没有收到RS消息时也能够主动发出RA消息)。

(5)主机根据路由器回应的RA消息,获得本链路IPv6地址前缀信息, 由前缀 + 接口ID 生成主机的IPv6单播。

(6)对生成的IPv6地址进行DAD,如果没有检测到冲突,该地址才能够启用。
5.2路由器通告RA

路由器通告消息解析

路由器周期性地向链路上发送组播的RA路由器通告消息。当然主机也能够主动发送RS消息去发现链路上的路由器。RA消息中包含路由器自身的一些信息以及几个重要的比特位,和IPv6前缀信息。

下面就是RA消息,几个重要的比特位先解释一下:


还有RA消息携带的几个时间值:
路由器通告消息RA中的前缀信息

RA消息中,包含多个ICMPv6 Option,路由器向链路通告的IPv6前缀就是以ICMPv6 Option的形式被RA消息携带的。一个RA消息可以包含0个、1个或者多个IPv6前缀,每个前缀都以一个Option携带。下面我们看看用于携带IPv6前缀的Option有什么进一步的内容:



从报文中我们可以看到,用于携带IPv6前缀的Option,除了有前缀信息,以及前缀长度,还有几个标志位,和两个lifetime。关于标志位上面已经有所介绍了,而这两个lifetime请看下文。

Lifetime
前面已经说了,路由器发送的RA消息中可以包含IPv6前缀信息,主机在收到RA消息后,就能够使用RA消息中所携带的IPv6前缀来构造自己的IPv6单播地址。在RA消息所携带的每个IPv6前缀信息中都各自捆绑了两个lifetime,其中一个是valid lifetime,另一个是preferredlifetime。

在主机使用RA消息中的前缀构造IPv6单播地址后,该地址需要先经过DAD,在DAD过程中的地址状态为tantative,还不能够启用。DAD通过后地址即可正式启用,地址启用后进入Preferred状态,同时启动计时器,当地址生存时间超过preferredlifetime时,地址进入deprecated状态,处于该状态的地址只能用于被动接收连接,而不能够用于主动发起的连接。当地址的生存时间超出validlifetime后,地址就变成了invalid,不再可用。5.3修改RA相关参数

RA相关参数的修改都是在接口上完成的。

1.  ipv6 nd ra halt

抑制接口的RA消息周期性发送,该命令默认开启,也就是说默认接口不会周期性发送RA消息,使用undo关键字可将该命令取消。

2.  ipv6 nd ra hop-limit

修改RA消息中hop-limit字段的值,该值作为主机发送出来的IPv6报文的hop-limit。

3.  ipv6 nd ra max-interval 及 ipv6 nd ra min-interval

周期性发送RA消息的最大及最小时间间隔 。

4.  ipv6 nd ra prefix

修改RA所携带的IPv6前缀及前缀所关联的参数,这条命令的相信内容请见下文。

5.  ipv6 nd ra router-lifetime

修改RA消息中router-lifetime的值,默认1800s。

使用ipv6 nd ra prefix命令,可以修改RA消息所携带的IPv6前缀及其所关联的参数。

6.  ipv6 nd ra prefix 2001::64  360000 180000

修改特定前缀的valid lifetime及preferred lifetime ,注意前者一定要比后者大。

7.  ipv6 nd ra prefix 2001:: 64360000 180000 no-autoconfig

将该前缀的A比特设置为0,该前缀将不能被用于无状态自动配置。

8.  ipv6 nd ra prefix 2001:: 64360000 180000 off-link。

将该前缀的L比特设置为0。



戳原文,更有料!


    关注 华为产品资料


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册