●当路由发生改变时,EIGRP需要重新收敛路由,这个过程由三个部分组成:输入事件、局部计算(包括查找可行的成功者路由)和使用动态查询来查找替代路由。
与路由收敛相关的EIGRP特性:
EIGRP收敛功能 |
描述 |
报告距离(RD) |
邻接路由器报告的路由metric |
可行距离(FD) |
到达特定子网的最小metric路径的metric值 |
可行性条件 |
当存在到达同一子网的多条路由时,有RD比FD更小的情形 |
成功者路由 |
到达目的前缀metric最小的路由 |
可行成功者(FS) |
非成功者路由但满足可行性条件;可以在成功者路由失效后使用,这样可以避免环路 |
输入事件 |
任何可能改变路由器EIGRP拓扑表的事件 |
局部计算 |
EIGRP路由器对输入时间的响应,接下来可能使用可行成功者或进行路由动态查询 |
●输入事件和局部计算
典型的输入事件是:路由器从新的更新中学习到新的路由;路由器接口失效;邻接路由器失效。
局部计算的原理:当输入事件发生时,看路由器是否能够在局部找到替代路由。其步骤如下:
1)如果存在FS路由,则将最小metric的FS路由载入路由表,并发送更新到邻接路由器以通知新的路由。
2)如果没有FS路由,动态查询邻接路由器以获得新的路由。
要成为FS路由,首先需要满足可行性条件,其定义为:路由的RD值必须小于当前FD值。
如上拓扑结构,在R4上,最初选出的到172.31.211.0/24的成功者路由是经由R1,FD为(3+2+3)*256 = 2048(这里计算metric仅考虑delay),来自R1的RD = (3+2)*256 = 1280。R4到达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”路由。
举例:
仍然以上面的拓扑图为例,如果R1到R4的接口失效,现在R4要查找到172.31.151.0/24的替代路由,R4到172.31.151.0/24的当前FD = (3+3)*256 = 1536,而发自R2的到172.31.151.0/24的RD = (3+4)*256 = 1792,由于RD大于当前FD,所以不满足可行性条件,R4进入active状态,发送Query消息到邻接路由器R2,R2会将其到172.31.151.0/24的成功者路由作为响应发送回R4。R4使用学习到的响应消息更新拓扑,并载入新的通过R2到172.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消息的邻接路由器的个数。