1. 介绍
所谓的 热备份路由协议(HSRP)主要是向我们提供了这样一种机制,它的设计目的主要在于支持IP传输失败情况下的不中断服务。具体说,就是本协议用于在源主机无法动态地学习到首跳路由器 IP地址的情况下防止首跳路由的失败。
它主要用于多接入, 多播和广播 局域网(例如 以太网)。当然HSRP并不是有意要取代现有的 动态路由发现机制,而这些现有的路由协议仍可以继续使用只不过不是在任何可能的情况下。以前的大部分主机都不支持动态路由发现协议,他们是通过配置 缺省路由来进行工作的。而HSRP却为它们提供了一种失败服务机制在HSRP中所涉及到的所有路由器都被假设为已经配好了合适的 IP路由协议,并且也已经存在了若干条路由。而讨论哪种协议更加合适并且这些路由在各种情况下是否一致就已经超出了我们这个声明的范围了。
在使用HSRP时,一组路由器的工作将一致的表现为局域网上通往主机的一个 虚拟路由器的工作。这组路由器就称为一个 HSRP组,或备份组。这个组中将选出一个路由器来负责转发由主机发给虚拟路由器的数据包。这个路由器就是所谓的活路由器。另一台路由器将被选为备份路由器。在活路由器失效的情况下,备份路由器将承担活路由器的包的转发功能。即使你可以任意制定运行HSRP的路由器的数量,但只有活路由器才能转发发送给虚拟路由器的数据包。
为了把网络阻塞降到最底限度,网络中只有活路由器和备份路由器可以在完成HSRP协议选择过程后发送一次HSRP消息包。如果活路由器失效,则备份路由器将取代它作为新的活路由器工作。而当备份路由器失效或者它变成了活路由器时,另外一个路由器将被选为备份路由器。
在某个局域网里,多个热备组可以共存和重叠。每个备份组都仿效一个虚拟路由器。对于每个备份组来说都有一个为别人所知的 MAC地址,以及一个IP地址。而这个IP地址应该是这个局域网中第一个子网中的地址,但必须不同于设置在所有路由器端口上的地址和局域网中主机的地址,甚至包括为其他HSRP组设的地址。
如果在一个局域网中设置了多个HSRP组,那么分配主机给不同的备份组就会使网络产生负载爆炸。
本说明下面要讨论的是对单个备份组的操作。在多备份组的例子中,每个组依照这个说明来在局域网中与其他组相互独立的工作。注意一个路由器有可能会加入到多个组中,这样这个路由器将需要为每个组维护不同的状态和时钟。
2 使用前提
Cisco系统公司已在美国为HSRP申请了专利号5,473,599[2].如果任何应用中需要使用专利5,473,599中的任何声明,需要cisco公司对标准的使用者一视同仁的依据给予许可证。另外这个许可证付费后只能使用一次。
3 范围
本文档描述的是关于包、信息、状态以及事件在本协议中的使用。本文档不讨论关于 网络管理或者互联网的应用问题
3.1 术语本文档将会使用到RFC2119[3]中的相关协议语言。
4 定义
活路由器 - 当前代表虚拟路由器转发数据包的路由器
备份路由器 - 第一备份路由器
备份组 - 参与到HSRP中,用已仿效虚拟路由器的一组路由器
Hellotime - 一个给定路由器成功地发 出两个HSRP hello消息包之间的间隔
Hold Time - 假定发送路由器失败的情况下,收到两个hello消息包之间的间隔
5 协议
在备份组里,路由器通过发送各种不同的消息周期性的广播状态信息
5.1 包格式
备份协议运行在UDP层上,使用1985端口号。包发送个 多播地址224.0.0.2,TTL为1
在包的格式里,路由器使用他们的真 IP地址做为源地址,而不使用虚拟地址。这对于使HSRP路由器们能够准确定义彼此是非常重要的。
下面是UDP帧格式的 数据 部分的格式
版本号:1个字节
HSRP信息的版本号,本文所描述的版本号为0
操作码:1个字节
操作码说明的是包含在这个包里的信息的类型,可能的值有:
0 - Hello 1 - Coup 2 - Resign
Hello类型消息是用来表明路由器正在 工作 ,并且有能力成为活路由器或者备份路由器。
Coup类型消息是在当一个路由器希望变成活路由器是才被发送的信息。
Resign类型消息则是当一个路由器不希望再做活路由器是才被发送的信息。
状态:1个字节
在备份组中的每个路由器都在运行着一个状态机制。这个状态域描述的是发送消息的路由器的当前状态。每种状态的具体描述将在后面说明。可能的状态值有:
0 - Initial
1 - Learn
2 - Listen
4 - Speak
8 - Standby
16 �C Active
Hellotime:1个字节
这个域在Hello消息中是非常有意义的。它包含了路由器发送Hello消息的大约的间隔时间。这个时间是用秒来表示的。
如果路由器上没有配置 Hellotime,那么它将会向活路由器发送的Hello消息 学习 。
而如果Hellotime没有被设置而且Hello消息已经被授权,则只能通过学习来获取Hellotime.发送Hello消息的路由器必须引入在Hello 消息中的Hellotime域中使用的Hellotime值。如果没有从活路由器发过来的Hello消息中学习到Hellotime并且也没有手工配置Hellotime,那么将把它的值缺省的定为3秒钟。
Holdtime: 1个字节
这个域只在Hello消息中 有效 。它标明了当前的Hello消息的有效期。这个时间也是用秒来表示的。
如果一个路由器发送Hello消息,那么接受者会认为在一个Holdtime时间内这个Hello消息是有效的。Holdtime的值必须要比Hellotime的值大而且至少是Hellotime值的3倍。如果一个路由器上没有配置Holdtime值,则它会向由活路由器发来的Hello消息学习到一个Holdtime值。如果Hello消息是被认证授权过的,则Holdtime值就只能通过学习来得到了。
同Hellotime一样,一个路由器必须引入那个在Hello消息中的Holdtime域所定义的Holdtime值。
一个状态为活的路由器不能向其他路由器学习Hellotime和Holdtime值,尽管它也许会继续使用从前一任活路由器那学到的Hellotime和Holdtime值。另外,它也许会使用手工配置的值。而活路由器也不能使用一个配置的时间或一个学习来的时间值。如果它没有学习到,而且也没有配置Holdtime,则它会使用10秒作为缺省值。
优先级: 1个字节
这个域用来选择活路由器和备份路由器。当把两个路由器的优先级进行比较时,优先级数值高的将获胜。如果两个路由器的优先级相同的话,则IP地址高的将获胜。
组: 1 个字节
这个域定义了备份组。在令牌环 网络 中,它的值为0到2,而在其他媒质中,它的值为0到255之间的数。
授权数据:8字节
这个域包含了8个用做password的文本字符如果授权数据没有被设置,则使用推荐的缺省值:0x63 0x69 0x73 0x63 0x6F 0x00 0x00 0x00.
虚拟IP地址:4字节
虚拟IP地址将在组中使用
如果一台路由器本身没有配置虚拟IP地址,那么他可以从活路由器那发来的Hello消息中学到。而如果路由器没有设置而且这个虚拟IP地址,而且Hello消息已经被授权,则只能通过学习来获取这个地址。
5.2 操作参数
在备份组里,每个路由器必须了解以下的信息。当然,讨论这些信息是如何决定的则超出了本文的范围。
备份组号
虚拟MAC地址
优先级
授权 数据
Hellotime
Holdtime
下面的信息则是每个备份组中必须至少有一台路由器要掌握的信息,当然,也有可能这个组中的每一台路由器都知道它。
虚拟IP地址
下面的信息可以在任何一台路由器上 配置 优先权 能力
如果一个路由器具有比活路由器高的优先级,而且也配置了优先权,则它就可以使用Coup消息来取代当前的活路由器。
5.3 状态
备份组中的每一台路由器都通过执行一个简单的状态机制来参与到这个 协议中来。下面我们就来描述一下这个状态机制在表面上我们所能看到的一些运行情况。运行时可能会根据状态机制对不同功能的规定而在内部产生不同的操作过程。
所有的路由器都从初试状态开始。这一段讨论每种状态的目的。为了详细说明每一种状态下所发生的动作,请看5,7节的状态转换表
1. Initial 初始状态
这是个开始的状态,它表明HSRP不在运行中。当配置改变或端口首次启动时就会进入这个状态。
2. Learn 学习
这是在路由器还没有确定虚拟IP地址,并且还没有收到一个从活路由器发送来的已经认证过的Hello消息时的状态。在这个状态中,路由器仍然在等待着从活路由器那里接受信息。
3. Listen 监听
路由器知道了虚拟IP地址,但它既不是活路由器也不是备份路由器。并且该路由器是在从活路由器或备份路由器那里监听Hello消息。
4. Speak 会话
路由器周期地发送Hello消息,并且积极地参与到活路由器或备份路由器的选拔中。
只有在它已经有了虚拟IP地址的前提下,它才能进入到这个状态。
5. Standby 备份
这个状态下的路由器作为下一个活路由器的侯选者,周期性地发送Hello消息。除了极短暂的情况外,每个组中最多只能有一个处于备份状态的路由器。
6. Active 激活
路由器的当前状态为把数据包转发到组的虚拟MAC地址。路由器周期地发送Hello消息。除了极短暂的情况外,每个组中最多只能有一个处于激活状态的路由器。
5.4 时钟
每台路由器都要维护3个时钟,一个激活时钟,一个备份时钟,和一个Hello时钟。
激活时钟是用来监视活路由器的,在任何时候,只要路由器发现了从活路由器发过来的被认证过的Hello消息,激活时钟就开始计时,直到到达Hello消息中所设定的Hold time值为止。
备份时钟用于监视备份路由器。该时钟也是在路由器发现了从活路由器发过来的被认证过的Hello消息,随时开始计时,直到到达Hello消息中所设定的Hold time值为止。
Hello时钟是在每一个Hellotime时间段终止一次。如果路由器是处于会话、备份或激活状态下,它会在Hello 时钟停止时产生一个Hello消息。Hello消息必须是不稳定的。
5.5 事件
下面是在HSRP有限的状态机制下所能发生的事件
a - 在一个使能的端口上配置HSRP
b - 在一个端口上禁用HSRP,或这个端口被禁用。
c - 活时钟期满。活时钟从路由器收到从活路由器发送来的最后一个Hello消息开始计时,时长为Hello消息中所设定的Holdtime值。
d - 备份时钟期满。备份时钟从路由器收到从活路由器发送来的最后一个Hello消息开始计时,时长为Hello消息中所设定的Holdtime值。
e - Hello时钟期满。用于发送Hello消息的周期性时钟期满。
f - 收到一个发自一台处于对话状态路由器的高优先级Hello消息。
g - 收到一个发自活路由器的高优先级的Hello消息。
h - 收到一个来自活路由器的低优先级的Hello消息。
i - 收到一个来自活路由器的Resign消息。
j - 收到一个来自一台高优先级路由器的Coup消息。
k - 收到一个来自备份路由器的高优先级的Hello消息。
l - 收到一个来自备份了路由器的低优先级的Hello消息。
5. 6 操作
本节说明了这种状态机制中所要采取的一系列操作
A、 启动活时钟
如果这个动作是作为从活路由器接受到认证过的Hello消息的结果来发生的话,那么活时钟要在Hello 消息中的Hold time域中设定。否则,活时钟将使用路由器当前的Hold time值启动。
B、 启动备份时钟
如果这个动作是由于从备份路由器接受到认证过的Hello消息而导致发生的话,那么备份时钟要在Hello 消息中的Hold time域中设定。否则,备份时钟将使用路由器当前的Hold time值启动。
C、 终止活时钟
活时钟被终止。
D、 终止备份时钟
备份时钟被终止。
E、 学习 参数
这个动作在接收到一个来自活路由器的一个已认证的消息时发生。如果这个组没有手工配置虚 IP地址,它就会从消息中学到一个虚IP地址。路由器也可能从消息中学习Hello time 和Hold time 值。
F、 发送Hello消息
路由器以它当前的状态、Hellotime 和Holdtime值来发送Hello消息。
G、 发送Coup消息路由器发送Coup消息包给活路由器,通知它发现了一个更高优先级的路由器。
H、 发送Resign 消息
路由器发送Resign消息来允许其他路由器成为活路由器。
I、 发送无偿 ARP消息
路由器通过广播ARP应答包来把组的虚 IP地址和虚 MAC地址广播出去。如同ARP包一样,这个包使用虚拟MAC地址作为链路层包头中的源MAC地址。
5,7 状态过渡
下面的表格说明了这种状态机制的各状态间的转换过程。对于每个时间以及路由器所处的每个状态来说,路由器必须执行前面已说明的一系列操作并转换为即定的状态。如果没有操作被事先声明,也就不会有任何操作发生,如果没有声明任何状态改变,也不会有任何的状态的改变。
下面表中所使用的符号是在5,6节的操作列表中所列出的一系列操作所对应的字母。状态则是用在5,3节中的状态列表中个状态所对应的 数字 来表示。斜线(‘/’)是操作和状态的分隔符。状态的转变可以是二选一的,这主要取决于外部状态。二选一的状态用‘|’来分隔。
详细情况请见附加说明
说明
+ 如果 配置 了虚IP地址,应设为状态3(监听),如果没有设置虚IP地址,应设为状态2( 学习 )。这两种情况都使用操作A和B
* 如果路由器被配置为优先占取,则采用操作B,G,F,和I,而且设为状态6(激活)。
如果路由器没有被设为优先占取,则采用操作A,并且没有状态变化。
6,对MAC地址的考虑
6. 1 概述
每个HSRP组都有一个众所周知的联合的虚拟MAC地址。在令牌环 网络 上,这些地址实际上属于功能地址。下面这三个地址:0xC0 0x00 0x00 0x01 0x00 0x00, 0xC0 0x00 0x00 0x02 0x00 0x00, 以及 0xC0 0x00 0x00 0x04 0x00 0x00分别与组0,1,2相 联系 。
在其他媒质上,虚MAC地址为0x00 0x00 0x0C 0x07 0xAC XX,其中 XX代表HSRP的组号。凡执行HSRP都要尽可能地使用这种公认的HSRP MAC地址作为该组的虚MAC地址。
活路由器必须接收和发送用于定义组的虚MAC地址的 数据 包。它在离开激活状态后则必须停止发送或接受这种包。
当且仅当路由器处于激活状态下时,路由器必须使用组虚拟MAC地址作为它的Hello消息包的源MAC地址。这对于处于学习状态的网桥来说是非常必要的,这样可以使网桥能够断定这个虚MAC地址是处于哪个网段的。
对于每个组来说,都要有一个虚拟IP地址和一个虚拟MAC地址。这是个非常理想的情况,因为这样使得ARP表处于一种最终状态,而不需要象HSRP活路由器那样随着活路由器人选的改变而随时改变表中的数据。
另外,对于HSRP在网桥环境下 工作 时,网桥必须能够在虚MAC地址改变时很快地进行自我刷新。虽然处于学习状态的网桥理论上能够作到这一点,但有些还是在这方面存在着 问题 的。因此推荐只有真正处于学习状态的网桥才能使用HSRP.虚MAC地址的改变可能会对那些与MAC地址捆绑的附加状态的环境产生负面的影响。
例如令牌环网络。如果源路由网桥正在使用的话,RIF将以虚MAC地址存在主机的RIF缓存里。RIF指出了用于到达MAC地址的路径和最后的环。在路由器转为活路由器时,它们将不会影响在带桥的环上的主机的RIF缓存。这也许会导致数据包被转发到上一级活路由器的环上。
在这种环境下,一台路由器也许会使用它标准的MAC地址作为虚MAC地址。这种做法是非常不被提倡的。在这种 模式 下,虚IP地址将会超时路由到不同的MAC地址,而最终会在路由的终点产生问题,因为ARP表是假设了一个在MAC地址和IP地址见相对静态的关系。而在这种情况下,只要当路由终点接受到一个进入激活状态的路由器所产生的毫无根据的ARP应答时,则ARP表就会进行更新。
6.2 地址过滤器
正如前面所提到的,路由器正在以它们的组的 MAC地址和 IP地址 仿效着一个虚路由器。MAC地址 理论 上是由路由器的端口控制器的一个地址过滤器或MAC地址列表来提供的。
这对于路由器来说,在维护它们的主MAC地址时增加一个或多个虚MAC地址到它们的控制器的MAC地址过滤器中是非常理想的。
不幸的是,有些端口控制器只支持一个unicastMAC地址的地址过滤器。或者说,在令牌环 网络 中,那些应由HSRP所使用的功能性地址已经被其他 协议所占用了。这种情况下,这些路由器仍旧能够执行HSRP,但当路由器假设或放弃作为活路由器进行控制时,HSRP必定改变端口的主MAC地址。
这就存在着一些潜在的 问题 ,因为有些传输可能会希望使用路由器的主MAC地址。但问题也许会因为路由器发送那些无端的 ARP包来回答它没有运行HSRP的IP地址来减轻。
尽管如此,其他网络实体也应该在使用IP时通过刷新ARP表来反映路由器当前正使用的是组的虚MAC地址,而不是它的主MAC地址。
有些协议也许因为端口主MAC地址的改变而不能与备份协议同时运行。举例说,DECnet IV和HSRP就不会同时运行在同一台设备上。
6.3 ICMP重定向
当运行HSRP时,防止主机发现备份组中路由器的主MAC地址是非常重要的。因此应该禁用任何可能把路由器的主MAC地址通知给主机的协议。所以,凡HSRP所涉及到的路由器,即使它只有一个端口运行了HSRP,都不能在运行HSRP的端口发送ICMP重定向包。
6.4 ARP 代理
一般地说,主机在通过它们 缺省路由的 配置 来 学习 HSRP的虚IP地址。这些主机把包发送给虚IP地址用以达到它在 局域网之外的目的地。在某些情况下,主机可能使用由ARP代理来路由到局域网之外。这时,主机使用由ARP代理应答提供的MAC地址。如果ARP代理应答说明了HSRP虚MAC地址,则HSRP功能将被保留。
如果一台HSRP路由器被配置为支持ARP代理的HSRP,那么这台路由器必须在它所产生的任何ARP代理应答中说明HSRP虚MAC地址。ARP代理应答一定不要受HSRP状态机制的约束。状态机制的约束可能会导致ARP代理应答的匮乏,因为这些ARP代理应答可能会受到其他一些因素的限制,如水平分割原则。
7. 安全 上的考虑
这种协议没有提供安全方面的保证。消息中的认证域对于防止错误配置是非常有用的。该协议很容易被局域网中的入侵者攻击,这可能会导致一个黑洞的产生和 拒绝服务。
但从局域网外面是很难对该协议进行攻击的,因为大多数路由器不会转发到 多播 地址(224.0.0.2)的 数据 包。
***************
译者:程静(chengjing [email protected])
译文发布时间:2001-5-24
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必
须保留本文档的翻译及版权信息。
Network Working Group T. Li
Request for Comments: 2281 Juniper Networks
Category: Informational B. Cole
Juniper Networks
P. Morton
Cisco Systems
D. Li
Cisco Systems
March 1998