我是靠谱客的博主 冷傲小懒猪,最近开发中收集的这篇文章主要介绍VRRP协议,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

VRRP协议


作者:林海枫

http://blog.csdn.net/linyt

[*]转载请完整转载并注明作者
,请匆用于商业用途。

 

VRRP协议简述:

在我们所熟悉的局域网中,通常采用下图的拓扑进行布线配置。



                         |
                 +-----+-----+ <-eth0 = 202.192.168.58
                 |               |
                 |       R      |
                 |               |
                 +-----+-----+ <-eth1(gw)=192.168.0.1
                         |
                         |
                         |
  ---+--------+-----+--+--------+------
      ^         ^           ^          ^
    (gw)  (gw)       (gw)     (gw)
       |        |          |           |
 +--+--+ +--+--+  +--+--+  +--+--+
 | H1 | | H2 |   | H3 |    | H4 |
 +-----+ +-----+   +--+--+  +--+--+
 图例:
 ---+---+---+-- = 以太网, 令牌网, 或 FDDI
 H = 主机
 R = 路由器
 (gw) = 主机的默认网关或下一路(192.168.0.1)


 

路由器R可以使用PC机充当,它的eth0和eth1分别是连接外网和内网的接口,IP地址设置如上图所示。因而eth1就成为下面主机(H)的网关,也即下一路的地址,故下面主机的网关都要手工配置为eth1的IP,192.168.0.1。

为主机配置网关,也即决定路由的下一跳路由,方法有很多,如运态路由算法,ICMP发现机制和上述这种手工配置方法等等。通常在一个局域网中,主机数多不会很多,如果采用动态路由算法的话,则会产生大量的数据包,并且如果有主机(路由器)出现中断时,由于协议收敛需要一定的时间,因而会出现网络所谓的“黑洞”。而采用静态配置方法而减少为维护协议而产生的数据包,但是会产生单点失效的现象,如果网送受到攻击或失效,那整个网络都不能与外界通信。

VRRP(Virtual Router Redundancy Protocol)协议正是解决静态网关出现单点失效现象的路由协议。VRRP在一个局域网中由多个路由器共同实现一个虚拟路由器,并指定一个竞选协议动态把该虚拟路由器分配到一个VRRP路由器中。在下文中把用于共同实现VRRP的路由器称为VRRP路由器。

VRRP通过指定竞选协议来提供一个虚拟路由器的功能,并且协议所有通信都采用IP多播报文。虚拟路由器由VRID(virtual router identifier)唯一标识,即一个标识标记一个虚拟路由器。在参与的VRRP路由器中,通过包装在IP多播报文中的VRRP报文中的ID值来标识该虚拟路由器,并且在局域网中每个VRID只能对应一个虚拟路由器。

所有的VRRP路由器,都有三种状态,分别是Initiation, Master和backup。第一种状态Initiation表明该VRRP路由器还没有进行竞选,所对应的接口没有正常工作。Master状态表示该VRRP路由器为主控状态,它肩负着虚拟路由器的重任,所有对虚拟路由器的请求它都要一一回复。backup状态表明该VRRP路由器处理备份状态,它不能处理任何对虚拟路由器的请求,相对主处于Master状态的VRRP而言,它充当备份的角色,如果Master状态的VRRP路由器突然失效或掉线,那么它有会从backup状态切换成master状态,处理对虚拟路由器的任何请求。

虚拟路由器通常由多个VRRP路由器至少两个组成,在稳定状态时只有一个为Master状态,多个为Backup状态。每个VRRP路由器通过预设的优先级(Priority)进行竞选进而成为主控路由器或备份路由器。既然由所有VRRP路由共同组成一个虚拟路由器,那么该虚拟路由器的工作方式与实现路由器应该是一样的,故虚拟路由器会一个或多个虚拟IP地址和一个虚拟MAC地址。同样处于Master状态的VRRP路由器称为主控路由器,而处于backup状态的称为备份路由器。

前面提过,每个VRID只能对应一个虚拟路由器,但是局域网内是可以有多个虚拟路由器。因为每个虚拟路由器表现为一真实的路由器,有自己的IP地址和MAC地址。同样,每个真实路由器是可参与到多个虚拟路由的。它会根据接收到的VRRP报文中的VRID值来识别虚拟路由器,并进行状态的切换。 

使用VRRP协议后,局域网的拓扑结构也变为如下图如所示:


 


            +-----------+      +-----------+
            |   Rtr1    |      |   Rtr2    |
            |(MR VRID=1)|      |(BR VRID=1)|
            |           |      |           |
    VRID=1  +-----------+      +-----------+
    IP A,vIP ---------->*            *<--------- IP B
                    |            |
                    |            |
  ------------------+------------+-----+--------+--------+--------+--
                                       ^        ^        ^        ^
                                       |        |        |        |
                                     (vIP)    (vIP)    (vIP)    (vIP)
                                       |        |        |        |
                                    +--+--+  +--+--+  +--+--+  +--+--+
                                    |  H1 |  |  H2 |  |  H3 |  |  H4 |
                                    +-----+  +-----+  +--+--+  +--+--+
     图例:
              ---+---+---+--  =  以太网,令牌网或FDDI
                           H  =  主机
                          MR  =  主控路由器
                          BR  =  备份路由器
                           *  =  IP Address
                        (IP)  =  主机的默认路由

 


在上图中,Rtr1和Rtr2运行VRRP协议,组成一个虚拟路由器,VRID值为1。根据设置的优先级,此时Rtr1为主控路由器,它除了具有自身的IP地址外,还有具有vIP(虚拟IP地址),即虚拟路由器的IP地址;而Rtr2为备份路由器,只具有自己的IP地址。下面的主机只需把虚拟IP作为自己的网关。如Rtr1丢线或失效,那么Rtr2会成为主控路由器,处理所有对虚拟路由器的请求,这样它除了本身的IP地址,还具有 vIP,可以及时地为下面的主机进行转发数据包。

从上面的例子可以看到,路由器Rtr1和Rtr2运行VRRP协议,共同组成一个虚拟路由器。此虚拟路由器由一个主控路由器和多个备份路由器组成。它们过能VRRP的竞选协议进行自已切换状态。无论VRRP路由的状态如何改变,对于下面的主机,它们组成的虚拟路由器是不会发生变化的,因为它的虚拟IP地址和MAC地址是不会发生改变的,即使主控路由器发生了变化,新的主控路由器会把虚拟路由器所对应虚拟IP地址和虚拟MAC地接管过来,处理对虚拟IP和MAC的请求。 

在上图中,只有当Rtr1失效或丢线时,Rtr2才充当主控路由器;否则所有从主机通向外网的流量都通过Rtr1,从而使得Rtr1和Rtr2负载不均衡。依此,可以使Rtr1和Rtr2参与到两个VRRP中去,对于每个路由器,在参与的两个虚拟路器中分别为主控路由器和备份路由,就可以实现负载均衡了,如下图所示:


 

            +-----------+      +-----------+
            |   Rtr1    |      |   Rtr2    |
            |(MR VRID=1)|      |(BR VRID=1)|
            |(BR VRID=2)|      |(MR VRID=2)|
    VRID=1  +-----------+      +-----------+  VRID=2
    IP A, vIP1 ---->*            *<-------- IP B,vIP2
                    |            |
                    |            |
  ------------------+------------+-----+--------+--------+--------+--
                                       ^        ^        ^        ^
                                       |        |        |        |
                                     (vIP1)   (vIP1)   (vIP2)   (vIP2)
                                       |        |        |        |
                                    +--+--+  +--+--+  +--+--+  +--+--+
                                    |  H1 |  |  H2 |  |  H3 |  |  H4 |
                                    +-----+  +-----+  +--+--+  +--+--+
     图例:
              ---+---+---+--  =  以太网,令牌网或FDDI
                           H  =  主机
                          MR  =  主控路由器
                          BR  =  备份路由器
                           *  =  IP Address
                        (IP)  =  主机的默认路由


在此图中,Rtr1和Rtr2参与两个VRRP, VRID分别是1和2。Rtr1在VRID=1的虚拟路由器中允当主控路由器,而在VRID=2的虚拟路由器中充当备份路由器;相反,Rtr2在VRID=1的虚拟路由器中充当备份路由器,在VRID=2的虚拟路由器充当主控路由器。两个虚拟路由器的虚拟IP分别是vIP1和vIP2。一部分主机使用vIP1为网关,而另一半部使用vIP2为网关。这样主机通往外面的流量由Rtr1和Rtr2平均分担。而当其中某一路由器失效时,另一个路由器会在VRID=1和2的两个虚拟路由器中成为主控路由,所有主机的通往外面的流量都由它来处理。因此,在VRRP协议中,某一路由器失效或掉线都不会影响下面主机的正常通信。故VRRP的使用路由的冗余来使得网络更加可靠。


 

VRRP协议分析

在本节中介绍VRRP协议的通信方式和报文,在下节将会介绍它的竞选机制。

VRRP协议的通信报文用于与其它的VRRP路由器进行通信,用于向其它VRRP路由器告知自己参与的VRID以及在此VRID对应虚拟路由器中的优先级和状态。VRRP报文封装在IP报文中,目标地址为分配给VRRP协议使用的IPv4的多播地址。

下面是VRRP协议通信的报文格式,它封装在IP报文中。


 
    0               1               2               3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version| Type  | Virtual Rtr ID|   Priority    | Count IP Addrs|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Auth Type   |   Adver Int   |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         IP Address (1)                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                            .                                  |
   |                            .                                  |
   |                            .                                  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         IP Address (n)                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Authentication Data (1)                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Authentication Data (2)                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

 

下面介绍VRRP报文中各字段的意义:

Version(4bit): 描述VRRP协议报文的版本,当前最新版本为2。

Type(4bit):表明VRRP报文的类,版本2的VRRP协议只定义唯一一种VRRP报文,值如下:

1          ADVERTISEMENT(广播)

如果报文中的Type不是为1,则该报文将被丢弃。

Virtaul Rtr ID(VRID)(1Byte):VRID用于标识它参与的虚拟路由器,大小为1到255。

Priorty:表示该VRRP路由器的优先级,数值越大则优先级越高,该字段为8位的无符号整数。

其中优先级为0表示主控路由器停止参与VRRP,用于让备份路由器迅速切换成主控路由器,而不用等到原来主控路由器信息超时才切换。

Count IP Addrs:表示虚拟IP地址的个数

Authentication Type:表示验证采用的方法。8位级成的无符号整数,当前的值如下:

 

0 - 不使验证方法

1 - 保留

2 - 保留

在早期的VRRP规范说明[RFC2338]中定义了几种验证方法,其中值为1和2是与早期的VRRP协议相互兼容,至现在为止,最新的规范[RFC3768]将它值限制为0,但同时对1和2不再作验证处理,只是与原来的协议相一致。

Advertisement Interval (Adver Int):表示两个ADVERTISEMENT报文的时间间隔(单位为秒),默认为1。如果VRRP路由器配置出错或状态不正确,通过竞选协议和该字段值可使VRRP路由切换到正确的状态。

Checksum:用于检测VRRP报文中的数据是否出错。

IP Address(es):虚拟路由器的IP地址列表,可为一个或多个IP地址。

Authentication Data:验证数据,在当前最新的VRRP规范说明中不使用该字段,只需设置为全0。它只是与早期的VRRP协议相互兼容。

 

刚才说过,VRRP报文封装在IP报文中,VRRP协议对它的承载体IP报文有严格的限制,要求如下:

Source Address(源地址):应为路由器的真实IP地址

Destionation Address(目标地址):使用由IANA分配给VRRP的IP多播地址:224.0.0.18。这是局域网内的多播地址,路由器不能转发目标地址为224.0.0.18的报文,不管它的TTL是否不为0。

TTL(生存周期):承载VRRP的IP报文中的TTL必须为255。如果VRRP路由器接收到任一个TTL不为255的IP报文将丢弃它。

Protocol(协议):VRRP协议在IP报文中的编号,值为112(由IANA分配)。


 

VRRP协议的竞选机制

    运行VRRP协议的VRRP路由器对外组成一个虚拟路由器,其中之一处于Master状,称为主控路由器,而其它的处于backup状态,称为备份路由。起初没有主控路由器,或者主控路由器丢线,再者主控路由器不参考VRRP协议,那么将选择一个优选级最高的备份路由器成为主控路由器,这需VRRP的竞选机制来维护各个VRRP路由器的状态。

为了方便描述,下面是每个VRRP路由器都具有的参数。

VRID     它所参与的虚拟路由器的ID,它决定发出的VRRP报文中的irtual Rtr ID (VRID)。

Priority  VRRP路由器的优先级,它决定发出的VRRP报文中的Priority。

IP_Address 虚拟路由器的虚拟IP地址,同样它决定发出的VRRP报文中IP地址的个数和IP地址值。

Advertisement_Interval:两个ADEVERTISEMENTS报文的时间间隔,默认为1,决定VRRP报文中的Adver Int。

Skew_Time 主控路由放弃参与VRRP时备份路由器切换成主控里面所需等待的时间,值用如下公试计算:

                       ( (256 - Priority) / 256 )

Master_Down_Interval:处于backup状态的VRRP路由器会用到此值,如果在一段长为Master_Down_Interval时间内没有收到主控中路由器的ADEVERTISEMENT报文将认为它失效或丢掉。该值计算机如下:

(3 * Advertisement_Interval) + ( (256 - Priority) / 256 )

Preempt_Mode:表明竞选机制是否可抢占的。当一个备份路由器的优先级比主控路由器的优先级还要高时,如果是可抢占,则备份路由器则把状态变为Master,原来的主控路由器状态变为backup;如果是不可抢占,则只有等主控路由器失效或掉线时,高优先级的备份路由器才能变为Master状态。

与上面定义的两个时间间隔对应,定义两个定时器,一个在主控路由器使用,另一个在备份路由器使用:

Master_Down_Timer     如果在时间段为Master_Down_Interval内没有收到主控路由器的ADVERTISEMENT报文,此定时间器激活。在备份路由器中使用。

Adver_Timer    此定时时用于主控路由器广播一个ADVERTISEMENT报文,时间间隔为Advertisement_Interval。在主控路由器中使用。

VRRP路由器在竞选机制中,将会在三种状态中相互转换。下介绍依次介绍处于三种状态向其它状态转换的条件和过程。


Initialize状态:

Initialize状态表明该路由器还没有正常工作,它不做任何事情,它只等待一个start up事件。如果一个start up事件到来(如ifup命令),它将完成如下事件:


--如果 Priority == 255 则

           发送一个ADVERTISEMENT报文

           广播一个免费的ARP请求,该请求包含虚拟器由器的IP地址和它所对应的MAC地址

           启动Adver_Timer定时器,时间间隔为Advertisement_Interval

           切换到Master状态成为主控路由器

--否则

            启动Master_Down_Timer定时器,时间间隔为Master_Down_Interval

           切换到Backup状态成为备份路由器


Backup状态:

处于Backup状态的备份路由器,用于monitor主控路由器的可达性和状态。如果VRRP路由器处于该状态时,必须:

     不能回复对于虚拟路由器中虚拟IP的ARP请求

      任何报文中数据连路层的目标MAC地址为虚拟路由器的MAC地址将被丢弃

      不能接受目标IP地址为虚拟路由器IP地址的报文

--如果收到Shutdown事件(如ifdown命令),则

        取消Master_Down_Timer定时器

        切换为Initialize状态

     

        --如果Master_Down_Timer定时器超时,则

                      发送一个ADVERTISEMENT报文

                       广播一个免费的ARP请求,包含虚拟路由器的IP地址及它对应的MAC地址。

                       启动Adver_Timer定时器,时间间隔设为Advertisement_Interval

                      切换到Master状态成为主控路由器

        ---如果收到ADVERTISEMENT报文,则

              如果报文的Priority字段值为0,则

                         重置Master_Down_Timer定时器,时间间隔为Skew_Time

               否则Priotiry不为0,那么

                       如果Preempt_Mode为False,或者ADVERTISEMENT报文中的Priority大于等于当前VRRP路由器的Priotiry,则

                                重置Master_Down_Timer定时器,时间间隔为Master_Down_Interval

           否则

                       丢弃此ADVERTISEMENT,不作任何处理


 

Master状态:

          处于Master状态的VRRP路由器,必须肩负虚拟路由器的任务,转发地址为虚拟路由器IP地址的所有报文。处于此状态的VRRP路由器,必须:

                  回复目标为虚拟路由器IP地址的ARP请求。

                 转发数据链路层目的MAC地址为虚拟路由器MAC地址的报文

                 如果报文的目的地址为虚拟路由器的IP地址,而不是路由器的真实地址,则不接受。

                如果报文的目的地址为虚拟路由器的IP地址,同时路由器的真实地址,则接受。


--如果接收到Shutdown事件,则

                  取消Adver_Timer定时器

                 发送一个ADVERTISEMENT报文,报文中的Priotiry为0

                 切换为Initialize状态

--如果Adver_Timer定时器超时,则

                 发送一个ADVERTISEMENT报文

                 重设Advertisement_Timer定时器,时间间隔为Adver_Timer

--如果收到ADVERTISEMENT报文,则

                如果ADVERTISEMENT报文中的Priority为0,则

                              发送一个ADVERTISEMENT报文

                              重设Adver_Timer定时器,时间间隔为Advertisement_Interval

                否则

                              如果报文中的Priority大于该VRRP路由器的Priority,或两者相等但发送方的真实IP地址比当前VRRP路由器的真实IP地址大,则

                                        取消Adver_Timer定时器

                                       重启Master_Down_Timer定时间,时间间隔为Master_Down_Interval

                                       切换为Backup状态成为备份路由器

                           否则

                                      丢弃此ADVERTISEMENT,不作任何处理 


状态变化分析:
         上面所描述的VRRP路由变化过程就是VRRP协议的竞选机制,如果每个VRRP的参数配置出错(主要是指优先级),VRRP会纠正这个过程。它不会因为有两个相同的优先级而出错两个主控路由器。
          无论是处于Master或Backup状态,只有收到Shutdown事件,VRRP路由器会把状态切换成Initialize状态。在VRRP协议中,虚拟路由器IP地址可以与某个VRRP路由器的IP地址相同,前提是这个VRRP路由器的优先级必须为255。对于竞选机制而言,它并不是任何时间都进行了,只有当某些条件触发了才产生了,经过一小段时间后,就会出错稳定的状态,只有一个主控路由器和多个备份路由器。它的结果表现为某些VRRP路由器状态进行了切换。下面重点分析VRRP路由器在Master和Backup两种状态的切换过程(上面的切换条件和过程是最好的参考)。

          如VRRP路由器处于Backup状态,它会保持沉默。直到Master_Down_Timer超时,也即是在一个时间段内没有收到VRRP的广播报文,那它会进入Master状态,成为主控路由器,并马上发出一个ADVERTISEMENT报文,让其它低优先级的备份路由器重置各自的 Master_Down_Timer。
         如果VRRP路由处于Backup状态,收到主控路由器发出一个优先级为0的ADVERTISEMENT,这意味着该主控路由器放弃参与VRRP,那么所有备份路由重设Master_Down_Timer定时器,时间间隔设置为各自的Skew_Time,优先级越高的备份路由则会越早触发 Master_Down_Timer定时器,成为主控路由器,并发出一个ADVERTISEMENT报文,让其它低优先级的备份路由器重设 Master_Down_Timer以续继保持它们的Backup状态。

       如果VRRP路由器处于Backup状态,但收到一个ADVERTISEMENT报文,报文的优先级比当前优先级小,就认为自己是很有可能要变成为 Master状态。但此时,它并没有马上变为Master状态,而是不对Master_Down_Timer进行任何的修改,即对该报文不作任何处理,至到一个时间段(Master_Down_Interval后,没有到任何优先级比自己还高的ADVERTISEMENT,那么它就切换到Master状态成为主控路由器。

       如果VRRP路由器处于Master状态,它会变成为Backup状态的唯一可能就是收到ADVERTISEMENT报文,并且报文中的优先级比自己的优先级还要大,或者相等但它的IP地址比对方小。
 
      如果一个虚拟路由器中出现没有主控路由器或多个主控路由器的情况,我们称为非稳定情况。在VRRP协议在运行过程中如果出现这种情况,将会快速进行调整成为稳定情况。据根上在的的转换过程,可以分析是如何从非稳定变为稳定的。

      如果虚拟路由器中没有主控路由器,那么任何一个备份路由器都不会产生ADVERTISEMENT报文,因为优先级最高的备份路由器的 Master_Down_Timer最先超时,自动切换成Master状态并发出ADVERTISEMENT报文,以使其它备份路由器保持Backup状态。

     如果虚拟路由器中出现多个主控路由器,那么每个主控中路由器都会在Adver_Interval时间段时发出ADVERTISEMENT报文,并且其它主控路由器都会收到。这样优先级低的主控路由器马上切换到Backup状态,成为备份路由器,最后只剩下一个主控路由器。

     无论非稳定情况是多个主控路由器还是没有主控路由器,VRRP协议都会很快将它转变为稳定情况。


虚拟路由器的MAC地址
    虚拟路由器的IP地址是通过配置设定的,但它的MAC是通过某一机制来分配的。VRRP协议采用如下的分配方式:
       虚拟路由器的MAC地址为:00-00-5E-00-01-{VRID}

      
      其中{VRID}是虚拟路由器的VRID,因此在一个LAN里面可以有255个虚拟路由器。

 


总结:
       VRRP解决的传统静态配置网关出现单点失效的现象,通过多个路由器组成一个虚拟路由器的技术,很好地解决了问题。本文介绍了VRRP协议出现的情况以及它所要解决的定问题,通过分析VRRP报文和竞选机制,清楚地表述了VRRP路由器通过状态转换而实现虚拟路由器的功能。

 

 参考资料
[RFC2338] http://www.faqs.org/rfcs/rfc2338.html
 [ RFC3768]http://www.faqs.org/rfcs/rfc3768.html
 [*]本文所有图来自http://www.faqs.org/rfcs/rfc3768.html

最后

以上就是冷傲小懒猪为你收集整理的VRRP协议的全部内容,希望文章能够帮你解决VRRP协议所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部