清默网络——EIGRP
本帖最后由 霸王龙小分队 于 2018-4-22 22:35 编辑概述 EIGRP是思科私有协议,只能运行在思科的设备上。 EIGRP能够支持的协议有IP、AppleTalk和IPX。 EIGRP的流量使用IP协议号88。 EIGRP采用Diffused Update Algorithm (DUAL)算法来计算到目标网络的最短路径,EIGRP还是一个距离矢量路由协议,因为距离矢量路由协议的根本特征就是自己的路由表是完全从其它路由器学来的,并且将收到的路由条目一丝不变地放进自己的路由表,运行距离矢量路由协议的路由器之间交换的是路由表,距离矢量路由协议是没有大脑的,路由表从来不会自己计算,总是把别人的路由表拿来就用;但EIGRP协议并不是完全没有大脑,它在距离矢量路由协议的基础上却有着那么一点点的优化和提高,那就是从邻居那里收到路由表之后,会经过一些计算和比较,然后才放进路由表中使用,因此将EIGRP的身份提高到“增强的距离矢量路由协议”,虽然EIGRP是增强的距离矢量路由协议,但其根本核心还是交换路由表,EIGRP没有任何资格称为链路状态路由协议,因为EIGRP从邻居那里得到的路由表可能原本就是错的,那么自己将会一错再错,并且害人害己,EIGRP对于网络拓朴也许会有完整的认识,但不一定有正确的认识。因为EIGRP是距离矢量路由协议,所以EIGRP同样会受水平分割(Split Horizon)的影响。 EIGRP使用了Autonomous System(AS)的概念,即使是这样,EIGRP也算不上外部网关路由协议(Exterior Gateway Protocol 即EGP),因为不同AS之间,EIGRP无法传递路由信息,所以EIGRP依然是个内部网关路由协议(Interior Gateway Protocol,即IGP)。AS是基于接口定义的,一台EIGRP路由器可以属于多个AS。EIGRP扩展了对大型网络的支持,不再像RIP那样只支持最大跳数15跳,而是扩展到了最大支持255跳,但默认情况下最大跳数为100跳。 EIGRP支持Classless Interdomain Routing (CIDR)和Variable-Length Subnet Masks (VLSMs),但默认也会自动汇总,该功能可以手工关闭,EIGRP还支持手工汇总路由信息,并且手工汇总没有任何条件限制,可以汇总到任意掩码长度。自动汇总和手工汇总与RIP相似,汇总是针对发出的路由有效,也就是对其它路由器生效,是对其它路由器的路由表生效。EIGRP支持认证,并且只支持MD5认证;支持通过Offset list来增加路由的metric,只可以增加,不可以减少;EIGRP也支持Passive-Interface(被动接口),但EIGRP的被动接口与RIP不同,RIP的被动接口不向外发路由,但可以接收路由,而EIGRP的被动接口不接收也不发送路由。 EIGRP并不会周期性更新路由表,而采用增量更新,即只在路由有变化时,才会发送更新,并且只发送有变化的路由信息;有时EIGRP并不知道邻居的路径是否还依然有效,并且路由没有超时。EIGRP自己内部路由的管理距离(Ddministrative Distance)为90,而从外部重分布进EIGRP的管理距离为170。EIGRP支持非等价负载均衡,最多支持6条,默认为4条,但非等价负载均衡功能默认为关闭状态。EIGRP Metric EIGRP使用多种参数计算去往目标网络的Metric值,包括带宽(Bandwidth)、延迟(delay)、可靠性(reliability)、负载(loading)、最大传输单元(MTU),这5个参数分别使用K值来表示,即K1、K2、K3、K4、K5,所以如果两台EIGRP路由器之间的5个K值不同,则代表双方计算Metric值的方法不同;无论是EIGRP还是其它协议,在需要使用带宽计算Metric时,只计算接口出方向的带宽,而接口进方向的是不计算在内的,也就是一条链路上,只有一个出接口的带宽会被计算,而进接口的带宽是被忽略的,如下图中所示,http://www.qingm.net/uploads/allimg/150919/15423315H-0.png 从源路由器R1到目标R4所经过的三条链路中,带宽分别是100 Mbit/s、10 Mbit/s、1 Gbit/s、虽然有条链路的带宽可达1 Gbit/s,但我们都知道,从源到目标的带宽最快也始终不超过最低带宽10 Mbit/s,永远不可能达到1 Gbit/s,所以从源到目的的路径中,只有最低带宽最终决定传输时的带宽,而某条链路的高带宽是没有意义的,所以在EIGRP的Metric计算中,只需要计算从源到目标的最低带宽即可,但是经过各个接口的延迟却是要累加的。 EIGRP在计算Metric时,使用K值来控制整个计算公式,公式如下:http://www.qingm.net/uploads/allimg/150919/1542332158-1.png公式中的带宽为1000 0000除以链路中的最小带宽,带宽单位为Kbit,延迟为链路中的延迟之和除以10,延迟单位为 ms(毫秒);默认情况下,5个K值的取值分别为: K1 = 1, K2 = 0, K3 = 1, K4 = K5 =0,由于K5=0,由此一来,造成上面的公式算出来的最终结果为0,所以当K5=0时,必须将其简化,变成如下:http://www.qingm.net/uploads/allimg/150919/1542331500-2.png正因为默认5个K值的取值分别为: K1 = 1, K2 = 0, K3 = 1, K4 = K5 =0,所以默认EIGRP的计算公式为:http://www.qingm.net/uploads/allimg/150919/15423353U-3.png注:此公式为EIGRP默认计算公式,改变K值,将影响Metric值的计算公式。EIGRP邻居 EIGRP使用了邻居的概念,EIGRP的路由表并不会像RIP那样通过组播或广播向网络中发送,EIGRP只向邻居发送路由表,并且是使用单播向邻居发送路由表,如果要在EIGRP之间交换路由表,必须成为邻居,不同AS不能成为邻居,EIGRP只在直连网络中发现和建立邻居。 EIGRP路由器之间的邻居关系通过Hello包来发现和维护,EIGRP会将自己全部的路由表发给所有邻居;路由器上启动EIGRP之后,就会使用组播地址224.0.0.10在相应接口上发送Hello包,EIGRP会使用一张单独的表来记录哪些路由器是自己的邻居,称为邻居表,只要收到Hello包,便将对方列为自己的邻居,并且写入邻居表,EIGRP会将邻居的地址写在Hello包中,由此可见,EIGRP路由器双方可能一方认为另外一方是自己的邻居,而另外一方却不认为对方是邻居,例如自己收到了另一方的Hello包,认为对方是邻居,而对方没有收到或过滤了自己的Hello包,所以如果EIGRP要形成双向邻居,只有在双方都发现对方的Hello包中列出自己的地址才行,但思科却没有这样设计。 在EIGRP断开或进程关闭时,会发送Goodbye Message结束邻居关系。 EIGRP会定期向网络中发送Hello包,发送的间隔会因为链路带宽的不同而不同,间隔时间分为5秒和60秒:Hello间隔60秒 所有带宽低于或等于1544 Kbit/s的,如T1,Frame Relay multipoint接口,ATM multipoint接口,ISDN BRI接口等等。Hello间隔5秒 所有带宽大于1544 Kbit/s的,如以太网接口,Frame Relay point-to-point子接口,and ATM point-to-point子接口,ISDN PRI接口。 如果超过一定的时间没有收到邻居的Hello包,便认为邻居无效,称为EIGRP Hold-time,默认为Hello间隔的3倍,也就是分别为15秒和180秒,Hello间隔时间和Hold-time都可以手工调整,但是如果调整了Hello间隔时间,Hold-time并不会自动调整到相应的3倍,而是保持不变。 EIGRP的Hello间隔时间和Hold-time是无法通过命令直接查看的,只能通过现象来推断,如: router# show ip eigrp neighbor IP-EIGRP neighbors for process 1 H Address Interface Hold Uptime SRTT RTO Q Seq Type (sec) (ms) Cnt Num 1 10.1.1.2 Et1 11 12:00:56 12 300 0 620 0 10.1.2.2 S0 172 12:00:58 17 200 0 645 Hold栏的值永远不会超过Hold-time,也永远不会低于Hold-time减Hello间隔,否则就是不正常,或者Hello包有丢失。 如果Hold栏的值范围是10-15,则证明Hello间隔是5秒,Hold-time是15秒。 如果Hold栏的值范围是120-180,则证明Hello间隔是60秒,Hold-time是180秒。注: ★Hello间隔和Hold-time可以手工在接口上配置,如果发现不正常,请检查接口上是否手工配置了时间参数。 ★EIGRP双方Hello间隔和Hold-time不一致也可以建立邻居关系,接口上的Secondary地址不能建邻居,所有EIGRP的数据包源地址总是接口的Primary地址。 ★在Frame-Relay环境下,需要在命令frame-relay map 带broadcast关键字。EIGRP双方必须满足以下三个条件,才能建立邻居: ★1.双方在相同AS ★2.双方Hello包正常,即双方接口Primary地址在同网段。 ★3.双方计算Metric值方法相同,即双方K1 K2 K3 K4 K5值相同。 在一个稳定的EIGRP邻居之间,只有Hello包在传递,EIGRP支持的邻居数量,并没有限制,但要视内存大小,CPU能力,路由条目数量,拓朴复杂程度,网络稳定性而定。EIGRP数据包 在EIGRP协议中,总共会使用5种类型的数据包,分别为Hello、Update、Query、Reply、Ack,下面介绍各种数据包的功能与用途:Hello 是用来发现和维护EIGRP邻居关系的,目标地址为224.0.0.10,Hello包在邻居收到后不需要确认。Update 发给邻居的路由表,通过单播发送Update数据包,邻居收到后必须回复确认消息。Query 当路由信息丢失并没有备用路由时,使用Query数据包向邻居查询,邻居必须回复确认。Reply 是对邻居Query数据包的回复,也需要邻居回复确认。Ack 是对收到的数据包的确认,告诉邻居自己已经收到数据包了,收到Ack后,不需要再对Ack做回复,因为这是没有意义的,并且可能造成死循环。 由以上可以看出,5种数据包中,Update、Query、Reply在对方收到后,都需要回复确认,这些数据包是可靠的,回复是发送Ack;而Hello和Ack,是不需要回复的,因此被认为不可靠。EIGRP运行过程: 两台路由器A和B启动EIGRP 1.路由器A启动EIGRP后,在相应接口上向外发送Hello包。 2.B收到A发来的Hello包后,将A列入自己的邻居表,然后向A单播发送Update,也就是向A单播发送自己的路由表;EIGRP路由器在收到一个Hello包时,就直接向对方发送路由表了,B后面的Hello包就会写明路由器A已是自己的邻居。 3.A在收到B的Update之后,向B发送Ack通知对方已经收到Update,然后再向B单播发送自己的Update,在A收到B的Hello包后,会发现里面列出了自己的地址,双方都看见对方Hello中列出自己后,双向邻居关系便建立成功。 4.B在收到A的Update之后,向A发送Ack确认Update已收到。 5.A和B都将收到的Update放入拓朴数据库中,计算路由表。返回目录EIGRP拓朴 虽然EIGRP是距离矢量路由协议,但是当从邻居收到路由后,并不是不经过任何计算就直接放进路由表中使用,EIGRP会将从邻居收到的路由全部放入拓朴数据库(Topology Database)中,经过DUAL的无环算法计算之后,才将最优的路由放入路由表中;因为EIGRP可能有多个邻居,也可能从多个邻居收到相同的路由,所以需要从中选中最优路由放入路由表中使用,而不是最优的路由则放在拓朴数据库中备份,等路由表中的路由失效后,便从拓朴数据库中查找备用路由继续放入路由表中使用。 当EIGRP将从邻居收到的路由信息放入拓朴数据库之后,要经过DUAL算法选出最优路由,以下图为例介绍计算方法:http://www.qingm.net/uploads/allimg/150919/1542333192-4.png要了解EIGRP选路的具体计算过程,需要先了解以下几个术语:Reported Distance(RD) 因为EIGRP拓朴数据库中的信息就是从邻居收到的路由表,目的地对于邻居来说肯定是可达的,Reported Distance是表示邻居到达目的地的Metric值是多少。在上图中,R1从R2和R3收到去往目标网络的路由后,R2去往目标网络的Metric值对于R1来说就是RD,同样,R3去往目标网络的Metric值对于R1来说也是RD。Feasible distance(FD) 当从邻居收到路由信息后,RD只是邻居去往目的地的Metric,而自己去往目的地还得在RD的基础上,再加自己到邻居的这段距离,所以自己到目的地的真正Metric应该是自己到邻居这段距离的Metric加上RD,但是拓朴数据库中可能存在多条去往目的地的路径,而被放入路由表的最优的那条被称为Feasible distance(FD)。在上图中,如果R1选择从R2去往目的地,那么结果将如下图:http://www.qingm.net/uploads/allimg/150919/1542332536-5.png 如果R1选择从R2去往目的地,那么R2到达目的地的metric(RD)加上R1到R2的Metric,就是R1到达目的地的FD,R1将R2的路径放入路由表中,这时,R2也称为Successor;默认情况下,拓朴数据库中有多条路径可到目的地时,被放入路由表的那条就是FD,FD就一定会被放入路由表。Feasible Successor(FS) 因为拓朴数据库中可能存在多条路径可以到达目的地,但被选为FD的最优的那条被放入路由表中使用,而留在拓朴数据库中的备用路由称为Feasible Successor(FS),如下图:http://www.qingm.net/uploads/allimg/150919/1542335O7-6.pngR2被选为Successor,当R3继续存放于拓朴数据库时,R3就是FS。Feasibility Condition (FC) 拓朴数据库中的FS最多可以有6条,如果一个EIGRP有8个邻居可以去往目的地,选出一条FD放入路由表之后,并不是其它7条全部都可以存放于拓朴数据库,拓朴数据库最多只能有6条(其中已经包含FD),也并不是一定会有6条被放入拓朴数据库,因为要存放于拓朴数据库,是必须达到一定条件的,称为Feasibility Condition (FC),就是邻居通告的RD必须小于FD,这个邻居的路径才能存在于拓朴数据库,计算FC的过程如下:http://www.qingm.net/uploads/allimg/150919/1542334203-7.png 上图中,R1共有4个邻居,分别为R2、R3、R4、R5,当R1从每个邻居那里收到去往目标网络的路由后,结果如下:R2 通告的RD为8,R3 通告的RD为10,R4 通告的RD为25, 当R1要去目标网络时,必须加上自己到达邻居的Metric,计算结果为:从R2到达目的地的Metric为 20 + 8 = 28,从R3到达目的地的Metric为 10 +10 = 20,从R4到达目的地的Metric为 5 + 25 = 30, 由此可见,R1从R3去往目的地的Metric值最小,因此R3的路径被选为FD并放入路由表,R3这时就是Successor,R1去往目的地的FD为 20,其它邻居的路由要成为FS存放在拓朴数据库中,那么它们的RD必须小于FD,也就是必须小于20,等于也不行;下面继续计算FS,因为R2的RD为10,小于FD 20,所以R2就是FS并存放在拓朴数据库中备份,而R4的RD为28,大于FD,所以R4没有资格成为FS,不能放在拓朴数据库中,这是因为EIGRP要防止环路,虽然R4的路径并不是环路,但由于要防患于未然,所以R4被拒绝于拓朴数据库之外,理由如下: 因为R1也是R5的邻居,所以R1会将自己的路由表全部发给R5,由于R1到达目的地的Metric为20,R5到达R1的Metric值为3,所以最后R5到达目标网络的Metric值为20 + 3 = 23,R5在将自己的路由表通告给R1后,很明显,R5的Metric值23就是R1从R5到达目的地的RD,对于R1来说,因为R5要从自己去往目标网络,所以对方通告的RD才会比自己的FD还要大,以致于让EIGRP认为,所有邻居通告的RD比自己当前的FD大的话,都统一认为它们在自己后面,它们必须经过自己才能去往目的地,那么这就是一个环路,最终邻居通告的RD等于或大于FD的,都没有资格成为FS,所以最后造成上图中R4通告了RD 为25而没有资格成为FS。EIGRP负载均衡 EIGRP可以支持非等价负载均衡,最多支持6条,默认为4条,但非等价负载均衡功能默认为关闭状态。EIGRP只能将拓朴数据库中的备用链路放入路由表执行负载均衡,拓朴数据库中可能有多条备用链路,而且多条链路的Metric值也可能各不相同,当启用非等价负载均衡时,需要定义什么样的Metric范围可以用来负载均衡,这需要通过控制Metric的变量(Variance)值来控制,具体方法如下: 路由表中正在使用的最优路由的Metric值为FD,而拓朴数据库中备用路由的Metric值肯定是大于FD的,Variance值通过控制备用链路的Metric值与FD的倍数关系来控制,就是Variance值取多少,备用链路的Metric在FD的Variance值倍数范围内就有资格执行负载均衡,例如当前FD为20,3条备用链路Metric分别为30,50,55,如果Variance值取2,那么Metric值范围在20×2=40的链路都可以执行负载均衡,所以Metric值为30的链路可以执行负载均衡,而Metric值为50和55的却不可以,因为大于40,只有当Variance值取3时,Metric值范围在20×3=60的链路才可以执行负载均衡,所以Metric值为50和55只有在Variance值取3时才可以执行负载均衡。 注:Variance值默认取值为1,也就是不执行非等价负载均衡,但会执行等价负载均衡。并不是所有在Variance值所定义的Metric值范围内的链路一定会执行负载均衡,这需要根据设置的最大负载均衡条数来决定,最多为6条。 因为Metric值越大的路由,表示其链路况越低下,而Metric值越小的路由,其链路况越优秀,这是一个成反比的关系,所以在执行负载均衡时,我们更希望流量也能因Metric值的大小,成反比例传输,链路好的传递更多的数据包,而链路差的则传递更少的数据包,通过配置命令traffic-share balanced即可,该功能默认为开启状态。EIGRP Stuck In Active (SIA) 在EIGRP中,正常的路由称为Passive Route;因为EIGRP可能会从多个邻居处收到相同的路由,默认只有最优的路由会被放入路由表中使用,其它符合FC条件的会放入拓朴数据库中备份,当路由表中最优路由丢失时,EIGRP会从拓朴数据库中查询备用路由,如果当最优路由丢失后,拓朴数据库中又没有备用路由,在这种情况下,EIGRP会向所有邻居发送Query,试图查询邻居是否有到目的地的路由信息,并且发送Query后,该路由被标记为Active route ,该状态称为Stuck In Active (SIA);向邻居发送的Query是必须回复Ack确认的,当邻居收到Query之后,就会查询自己的路由表,如果有,就向邻居回复Reply,如果最终邻居的路由表和拓朴表中都没有相应路由条目,就会再向自己的所有邻居发出Query,虽然Query是向所有邻居发出的,但它不会发向原本最优路径的下一跳,也就是Query不会发向该路由的Successor,因为正是Successor路丢失了,才问自己要路由的,自己再反过去问对方要路由,是没有理由的。 不可思议的事情是,如果发送Query的路由器在3分钟内没有收到邻居的回复,就会清除与该邻居的EIGRP会话,可想而知,EIGRP路由丢失后,必须要求邻居提供路由,如果不提供,它就会六亲不认,3分钟就和你翻脸,反目成仇,和你断绝任何关系,很费解为什么思科会将EIGRP设计成这样子,EIGRP的优势分析来分析去,只有一个非等价负载均衡,和所谓的快速收敛,再无别的,至少本人是这么认为的。 造成EIGRP路由器无法回复邻居Query的原因有很多,如:CPU繁忙,内存错误,数据包丢失,或者是单向链路故障等等。 为了杜绝EIGRP在SIA状态时,由于邻居没有提供路由而误将与邻居的会话清除,思科推荐解决方法为调整SIA状态时等待回复的时间,默认为3分钟,其实这种改时间,不是解决总是的根本,这只是在拖延时间而已,会话总是要断开的,不知道这个是否会被高手利用而成为攻击EIGRP的漏洞。另外的解决方法就是将相应路由器配置为EIGRP末节(Stub)路由器,EIGRP在SIA状态是不会向Stub邻居发送Query的,但Stub邻居向外发送路由的功能有所限制,默认只能发送直连和汇总路由,但可以调整,也可以调整为不向外发送任何路由。
页:
[1]