●
当路由发生改变时,
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
消息的邻接路由器的个数。