当路由发生改变时,EIGRP需要重新收敛路由,这个过程由三个部分组成:输入事件、局部计算(包括查找可行的成功者路由)和使用动态查询来查找替代路由。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

与路由收敛相关的EIGRP特性:

EIGRP 收敛功能

描述

报告距离( RD

邻接路由器报告的路由 metric

可行距离( FD

到达特定子网的最小 metric 路径的 metric

可行性条件

当存在到达同一子网的多条路由时,有 RD FD 更小的情形

成功者路由

到达目的前缀 metric 最小的路由

可行成功者 FS

非成功者路由但满足可行性条件;可以在成功者路由失效后使用,这样可以避免环路

输入事件

任何可能改变路由 EIGRP 拓扑表的事件

局部计算

EIGRP 路由器对输入时间的响应,接下来可能使用可行成功者或进行路由动态查询

 

输入事件和局部计算

典型的输入事件是:路由器从新的更新中学习到新的路由;路由器接口失效;邻接路由器失效。

局部计算的原理:当输入事件发生时,看路由器是否能够在局部找到替代路由。其步骤如下:

1)如果存在FS路由,则将最小metricFS路由载入路由表,并发送更新到邻接路由器以通知新的路由。

2)如果没有FS路由,动态查询邻接路由器以获得新的路由。

要成为FS路由,首先需要满足可行性条件,其定义为:路由的RD值必须小于当前FD值。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

如上拓扑结构,在R4上,最初选出的到172.31.211.0/24的成功者路由是经由R1FD为(3+2+3*256 = 2048(这里计算metric仅考虑delay),来自R1RD = 3+2*256 = 1280R4到达172.31.211.0/24的另一条路由是通过R2,其RD = 3+4*256 = 1792。如果R1失效,R4会首先检查局部是否有满足可行性条件的路由,显然,通过R2的路由的RD值(1792)小于当前FD值(2048),所以这时就可以选择这条路由为FS,将其载入路由表,并对外发布包含新路由的更新。

 

动态查询路由

当通过局部计算无法找出FS路由时,EIGRP路由器就只能采用动态方式向邻接路由器查询新路由。首先路由器会改变其状态为active,此时EIGRP会多点传送查询(Query)消息到邻接路由器,邻接路由器接收到查询消息后,会返回单点EIGRP响应(Reply)包,在包中会标明是否它们存在到该子网的无环路由。路由器学习接收到的所有Reply消息,更新其拓扑表,并重新计算已知路由和选择新的成功者。如果仍然无法找到新的替代路由,路由器即认为到该子网无路由。

对邻接路由器而言,它们将任何接收到的Query消息看作输入事件,然后它们会采取如下步骤:

1)如果路由器在其拓扑表中没有到那个子网的记录,它会发送EIGRP Reply包以表示其无路由。

2)如果路由器到那个子网的成功者未改变,或者发现FS,邻接路由器会发送包含该路由详细信息(原成功者或FS)的EIGRP Reply包。

3)如果1)和2)条件均不满足,邻接路由器也进入active状态,并在其邻接路由器发送响应之后再传送EIGRP响应给源Query

注意到第3)条可能导致动态查询过程无限循环,停止在动态阶段过长的路由称为“stuck-in-active”路由。

举例:

仍然以上面的拓扑图为例,如果R1R4的接口失效,现在R4要查找到172.31.151.0/24的替代路由,R4172.31.151.0/24的当前FD = 3+3*256 = 1536,而发自R2的到172.31.151.0/24RD = 3+4*256 = 1792,由于RD大于当前FD,所以不满足可行性条件,R4进入active状态,发送Query消息到邻接路由器R2R2会将其到172.31.151.0/24的成功者路由作为响应发送回R4R4使用学习到的响应消息更新拓扑,并载入新的通过R2172.31.151.0/24的路由(此时FD = 3+4+3*256 = 2560),然后再发送更新到邻接路由器。

(注:Query消息是通过RTP可靠传输,多点传送;Reply消息也是可靠的,单点传送。它们都用Ack消息应答)

 

关于stuck-in-active

在某些特殊情形下,EIGRP的动态查询会一直进行下去,导致路由长时期无法收敛。对这类情况,EIGRP使用了一个Active定时器,它可以限制路由停留在active状态的时间。如果Active定时器超时,路由器就将该路由置为stuck-in-active状态。但是这样也会有副效应,因为在置stuck-in-active状态的同时,路由器也会认为未发送Reply消息的邻接路由器失效了。如果你希望避免这种局面发生,可以采用router eigrp下的timers active-time disabled子命令来屏蔽Active定时器。

 

限制查询范围

相比于Active定时器,另一种更有效的解决方案是将Query消息限制在一定范围内。你可以限制接收消息的邻接路由器个数,或者限制Query消息流的跳数,这些都能大大缩短等待时间。具体来说,两种方法可以用来限制查询范围:

1)路由汇总。当到达路由器的查询发现一条汇总路由,但没有找到精确匹配路由,那么路由器立即响应其没有该路由。例如,路由器的拓扑表中已有到172.31.0.0/16的路由,此时接收查询到172.31.151.0/24的路由,那么路由器立即回应Reply声明自己没有到172.31.151.0/24的路由。这样可以限制查询的跳数。

2)使用EIGRP的桩路由器(stub router)。桩路由器是非流量传输的路由器(如上图中的R5就是一个比较好的桩路由器选择)。非桩路由器不能发送Query消息到桩路由器,这样就可以限制接收Query消息的邻接路由器的个数。