本文主要是介绍TCPIP卷一(10):EIGRP的DUAL算法和SIA解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说明
对于EIGRP来说,核心就是DUAL算法了,它决定EIGRP的很多参数和在网络中快速收敛起到决定性的作用。
DUAL的预备概念
1、一个EIGRP的路由器必须在有效时间内检查到邻居的存在或者丢失,也就是指的Hello包功能
2、当一个可靠的组播传送发送出去后,就必须在规定的时间内收到确认信息
3、当链路代价、链路down/up、和新的邻居发现后,都必须在规定的时间内一次一个的处理,并且是有序的。
4、邻接概念:EIGRP会通过Hello包来发现邻居的存在,当邻居存放在邻居表后,EIGRP试图将邻居关系形成一个邻接,也就是尝试着路由信息的交换,这些路由信息包括从它邻居那所知道的所有关于这些路由的度量值,计算出最优的放入进路由表中。
FD、FC、S、FS的详细分析
如图,地址信息如上,来研究DUAL算法中的FD、FC、S、FS的概念,其中A、B、C路由器以R1、R2、R3来命名
R1(config)#router eigrp 1
R1(config-router)#network 12.1.1.1 0.0.0.0
R1(config-router)#network 10.1.1.1 0.0.0.0
R2(config)#router eigrp 1
R2(config-router)#network 12.1.1.2 0.0.0.0
R2(config-router)#network 10.1.1.2 0.0.0.0
R2(config-router)#network 23.1.1.1 0.0.0.0
R3(config)#router eigrp 1
R3(config-router)#network 23.1.1.2 0.0.0.0
R3(config-router)#network 3.3.3.3 0.0.0.0
这次主要查看 关于3.0.0.0/8的路由信息。
一、FD(Feasible Distance,可行距离):到达每一个目的地的最小度量值将作为该目的的网络可行距离,出现在路由表中。(其余的放入拓扑表中作于备份),关于3.0.0.0/8这条路由,FD is 435200,可以发现它由两个下一条,一个为435200,一个为2323456,因为435200是最小的,所以,它出现在路由表中,而2323456则作为备份存在。
二、AD (Advertisement distance) :邻居到达该目的地的度量值,也就是指的邻居的FD
可以发现在R1上的关于3.0.0.0/8的度量值是435200,后面还有个409600,这就是AD,邻居到达3.0.0.0/8这条路由的最优度量值
可以看到关于R2上面到达3.0.0.0/8的度量值是409600,也就是R1的AD
三、S(Successor,后继路由器):抵达目的地最佳的下一跳,也就是FD最小的。
四、FS (Feasible Successor,可行后继路由器)和FC (Feasible Conditions,可行性条件):
FS的作用就是当有多条路径去往同一个目的地的时候,当满足了特定条件后(也就是FC),它就能成最佳路径的备份。
FC就是规定当什么情况下才能满足这个条件,只有当这条次优路径的AD值小于最佳路径的FD的时候,就相当于FC条件成立了。
还是查看3.0.0.0/8这条路由,它的最优路径是从12.1.1.2走,也就是FD为435200,次优路径为2323456走的是10.1.1.2,这时候它在拓扑表中,是因为次优路径的AD<最佳路径的FD,也就是409600<435200。如果这时候当409600变成436200的时候,那么它就不会出现在拓扑表中,其实是存在的,不过需要通过 show ip eigrp topology all-links才能看到,这在调整cost值的时候,是非常有帮助的。 总结:
1、在设计EIGRP的时候,成功的关键就在于是否有FS的存在,有了FS的存在,那么整个收敛的速度是非常之快的,就连OSPF也比拟不了。
2、可行性后继路由器和可行性条件的概念是避免环路的核心技术,也就是说可行性后继路由器到达目的的度量值比本地的更短
3、拓扑表中记录着:1、目的网络的可行距离 2、所有的可行后继路由器 3、每一个可行性后继路由器通告到目的的网络的通告距离,也就是AD。 (其实在拓扑表还记录着其他没有达到FC条件的链路,只是不显示正常的拓扑表中)
4、到达下一跳设备的链路fail或者到达目的地的cost增加,如果存在可行后继路由器,那么可行后继路由器将在次秒的时间内成为后继路由器,极其迅速的收敛
DUAL的有限状态机
当EIGRP不执行扩散计算时,每一条路由都处于稳定状态(passive state),当发生了某种变化的时候就会重新查找可行性后继路由器的存在。
{1、直连链路代价发生变化 2、直连链路的状态(up或down)发生变化 3、收到一个更新包 4、收到一个查询包 5、收到一个答复包 }
一、当路由器检查到这些变化后,会在本地路由器上执行一个本地计算,如果有FS存在的话,通知有备份路由器存在,不进行扩散更新。
二、如果不存在一台可行性后继路由器的话,那么就进行扩散更新算法,并且比较路由状态改变为活动状态(active state),那么这个路由在扩散更新完之前不能:1、改变路由的后继路由器 2、改变正在通告的路由距离 3、改变路由的FD 4、开始进行另外一个扩散更新算法。
三、当一条路由消失后,并且没有到达该目的可行性后继路由器时候, 就向所有邻居发送query查询包,如果该邻居有去往目的路由的可行性后继路由器,那么就回复一个reply,如果没有可行性后继路由器,那么直接把这条路由变为active状态,并进行扩散更新计算。
四:对于每一个收到查询的路由器邻居,本地路由器将设置一个答复状态标记 (reply status flag)来跟踪所有没有处理的查询,当本地路由器收到发送到所有邻居路由器的查询后,扩散更新完成。
五:在某些情况下,三分钟内没有收到reply,那么该设备将reset所有的邻居。这称之为SIA,cisco专门针对这个问题设计了新的报文:SIA Query和SiA Reply,它的意思是说当A的一条路由出现了问题的时候,它会发送query查询包给B,B收到以后,会把这条路由标记为active,B又没有FS的情况下,那么就会询问C, 假设C这时候链路出现了问题,或者链路带宽拥塞了,导致这个查询回不来,这样在A等待180s后,发现查询还没回来,就把A与B之间的邻居给down了,其实在对于B来说是无辜的,因为是来自C的回应不能正常被收到所导致的,这样是不合理的。在12.1的IOS后,引入了SIA的query和reply报文,当发送了查询包90s后,还没有收到来自邻居的reply信息的话,会发送一个SIA的query报文,如果直连邻居是正常的话,就会回复reply报文,那么就不会因为SIA状态影响无辜的邻居,只有回应不了SIAreply的邻居会被重置掉。
在一个良好的网络中,我们需要尽量避免SIA的出现,避免SIA的出现就是保证牧
这里以三种情况来介绍关于,SIA的情况,以及解决办法
案例分析一:有FS的情况下,关于DUAL的收敛和SIA状态
这是卷一给出的例子,其实很好理解,路由全部收敛完成后,该例子中,Cayley没有可行后继路由器,当和wright的链路失效,由于没有FS的存在,会向Lilienthal发送查询关于10.1.7.0/24的信息。这时候lilenthalL是拥有到达10.1.7.0的可行后继路由器的,也就是Wright,并且这时候lilenthall把Wright变成为后继路由器,紧接着L会发送reply给Cayley,Cayley将把10.1.7.0从active置为Passive状态这是一个被查询设备有可行后继路由器的情况,重新计算新的度量值。(在reply中是附带这个10.1.7.0/24的度量值的)
关于这个例子,完全可以用GNS3搭建,通过debug信息来观看 reply和query的包,主要注意的是,这个例子中是修改了K值的,也就是说只用了延迟作为度量值的参考,并且注意的时候接口延迟的单位是10us,所以需要注意才行。
案例分析二:在没有FS的情况下,但是reply回应不来。
SIA的状态不容易被看见,这时候需要人为的搭建一个SIA的状态出来,地址信息如拓扑,之前已经提到过SIA状态就是当一个路由丢失后,而没有FS的情况下,那么它就会发送查询,当这个查询在3分钟内没有回应的话就会重置邻居关系,但是,有时候直连邻居是无辜的,所以,后续加入了SIA的query和reply报文,在1.5分钟后的时候,就会发送SIA的query,如果邻居回应了reply那么就不会重置邻居,只会重置有问题的邻居。 在这个环境下,我们把C路由器的3.3.3.3给shutdown了,那么它会发送query包,这时候,我们需要做的就是把A和B的holdtime改成200,并且应用一个ACL在B上面,过滤掉来自A的reply回应,这时候SIA状态就会出现了,如果正常的话,那么A和B的EIGRP邻居会down掉,而B与C之间则不会。
A(config)#router eigrp 1
A(config-router)#network 12.1.1.1 0.0.0.0
B(config)#router eigrp 1
B(config-router)#network 12.1.1.2 0.0.0.0
B(config-router)#network 23.1.1.1 0.0.0.0
C(config)#router eigrp 1
C(config-router)#network 3.3.3.3 0.0.0.0
C(config-router)#network 23.1.1.2 0.0.0.0
A(config)#int f0/0
A(config-if)#ip hold-time eigrp 1 200
B(config)#int f0/1
B(config-if)#ip hold-time eigrp 1 200
可以看到关于hold时间已经为200了,这样更改是为了SIA状态的出现。
B(config)#access-list 100 deny eigrp any any
B(config)#access-list 100 permit ip any
B(config)#int f0/1
B(config-if)#ip access-group 100 in
C(config)#int lo 0
C(config-if)#shutdown
C#debug eigrp packets siAquery siAreply reply request
这时候,把ACL挂上以后,就把C的loopback口该down掉,同时开启EIGRP的SIA查询和应答。
在1分30s的时候,C发送了SIAquery的擦新,并且收到了来自B的reply,可以通过debug信息查看到。
这时候查看B的状态
这时候,B状态显示也为A,也就是active,并且对于状态是Qqr也就是是query状态(发给A路由器了),reply(回应C路由器),replay status(回应给C路由器的) ,这时候还在等待A的查询,但是,A回应了查询的,被B的ACL给拒绝掉了,所以,回应不来。
这时候,当B的拓扑表中关于3.0.0.0/8的Successor 到达2分58s后,他还没有收到来自A的回应,所以,当2s过后,从拓扑表中删除,并且提示是 邻居down,原因是stuck in ative。
这时候在B路由器上只有关于C路由器的信息了,而A则没有了。
这时候C也收到了来自B的回应,在2分59s的时候,3.0.0.0/8路由还是A状态,当到了3分钟后,就从拓扑表中消失了。
总结:可以看出来,当出现 SIA状态是非常麻烦的,并且在大型网络中,网络的范围很大的话,很有可能SIA状态出现,并且在3分钟内收不到回应,所以,我们在设计网络的时候,一定要保证目的路由有FS存在,这样收敛死非常快的,也不会出现SIA状态,另外就是stub的应用了。
案例分析三:stub区域的应用
这个环境是继续上个案例来分析的,不过这时候,我们把A路由器设置为stub区域,stub区域的作用就是B路由器不会发送reqer到stub区域的EIGRP邻居,同样的方法把loopback给shutdown了,A与B之间的邻居是否会出现问题。
环境的搭建参考案例分析二,一模一样的,唯一的区别就是在A上面定义为stbu区域
A(config)#router eigrp 1
A(config-router)#eigrp stub
可以通过show ip eigrp neighors detail来查看邻居是否为stub,可以看都关于12.1.1.1是stub区域。
这时候同样的把loopback给shutdwn,查看这个SIA状态是否会影响到A与B的邻居,注意B上面的ACL和hold时间都是与案例分析二一样的。
可以看到,当把loopback0 shutdown后,EIGRP发送那个了Request,立马收到了来自B的reply,这时候在查看top表,发现已经收敛完成了,从这点上可以看出来,B并没有发送给stub区域,直接回应了reply给C,这时候收敛是非常迅速的。
总结:这次主要介绍了DUAL算法和SIA状态在EIGRP的关键性,这是在设计EIGRP时候的必须明白的事情,一个EIGRP网络的好坏取决于是否都有FS的存在,现在EIGRP在银行和证卷行业还是应用的非常多的,如果不是私有协议的话,我相信不会比OSPF应用的少。这里还有stub区域还有许多参数,将在下篇进行介绍,这次主要介绍DUAL算法和SIA状态的解决方案。
如果大家有任何疑问或者文中有错误跟疏忽的地方,欢迎大家留言指出,博主看到后会第一时间修改,谢谢大家的支持,更多技术文章尽在网络之路Blog(其他平台同名),版权归网络之路Blog所有,原创不易,侵权必究,觉得有帮助的,关注、转发、点赞支持下!~。
这篇关于TCPIP卷一(10):EIGRP的DUAL算法和SIA解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!