转自:点击打开链接
摘要(Abstract):
EIGRP是Cisco发明的一个私有路由协议,由IGRP发展而来,但是算法做了很大的改动.EIGRP和IGRP,RIP一样是一个采用D-V算法的动态路由协议,在收敛速度,占用网络带宽和系统资源等方面有了很大的改进,且有收敛快,无环路由计算,可以应用于大规模网络的优点.本文深入描述了EIGRP协议机制细节.
缩略语清单(List of abbreviations):
1 EIGRP协议简介
EIGRP(Enhanced Inteior Gateway Routing Protocol),即增强型内部网关路由协议.它是Cisco发明的一种动态路由协议,由IGRP协议发展而来,号称是增强型的IGRP,但实际上除了Metric计算方式和IGRP类似之外,其他方面已经几乎看不到IGRP的影子.
EIGRP的算法做了很大的改动,虽然和IGRP,RIP一样是一个采用D-V算法的动态路由协议,但是在收敛速度,占用网络带宽和系统资源等方面有了很大的改进,具有收敛快,无环路由计算,可以应用于较大规模网络的优点.
1.1EIGRP协议特性简介
1.多进程机制.一台路由器上可以运行多个EIGRP协议的进程.各个进程之间用as号来区分.不同进程之间互不干扰,路由信息可以互相引入.和OSPF的多进程不一样,EIGRP的报文中携带有进程号,所以甚至可以在同一链路上运行EIGRP的多个进程.
2.使用Hello报文建立并维护邻居关系.EIGRP的邻居机制和大部分路由协议类似,邻居建立后将互相交换路由信息.当网络上某台路由器失效时,其他路由器可以快速察觉并响应变化.
3.触发更新和部分更新.仅在路由信息发生变化时,邻居路由器之间才进行路由信息的交换,并且只交换发生了变化的路由信息,这样可以占用较小的网络带宽.
4.适应较大范围的网络.EIGRP的路由度量距离(Metric)是根据网络延时,带宽,可靠性,负载等参数计算出来,是一个32bit的数.这样EIGRP可以较为准确地反映网络链路的情况,Metric的取值范围大也可以使EIGRP适应大范围的网络.EIGRP比RIP有了广阔得多的适应范围,但是一般来说也不应该越过几十台的规模,否则将引起效率问题.
5.快速收敛,无环路的DUAL计算.对收到的路由信息使用一种称为DUAL的算法进行处理,生成到达各个目标网络的最短路由信息.EIGRP的路由计算仅会波及到必要的路由和必要的路由器,而不会扩散到全网.DUAL算法的机制可以保证生成的路由是没有环路的,它的收敛时间也比较好,优于传统的D-V协议.
6.路由聚合.使用路由聚合以后,对于聚合范围内的多条路由信息只向外发送一条路由信息,这样可以减少占用的网络带宽,也减少了对处理器和内存资源的使用.EIGRP既支持自动聚合,又支持任意长度掩码的手工聚合.
7.路由引入.可以引入静态路由和其他路由协议(如RIP,OSPF)发现的路由.还可以引入其他EIGRP进程报告的路由.在引入IGRP和EIGRP的路由时,直接使用IGRP和EIGRP路由的度量距离metric.
8.路由策略.在接收,引入,发布路由时,EIGRP支持使用路由策略对路由进行过滤.
9.多种网络协议支持.支持IPv4,IPX,AppleTalk这三种网络层协议.
10.支持不等价负载分担.EIGRP是目前唯一支持不等价负载分担的协议,即支持不同metric路由之间的负载平衡.
1.2EIGRP协议的运行机制简介
EIGRP周期性的使用组播在各个接口上发送一种低开销的hello报文.收到Hello报文的路由器会把这个路由器加入到自己的"邻居表"中,于是这两个路由器会开始进行路由信息交换.以后每次收到Hello报文,路由器则认为路由器是"活着的",而且可以与之交换信息.当连续一段时间没有收到对端路由器的Hello报文,那么就会认为对端路由器已经失效,将之从邻居表中删除,其通告所有路由都随之变成不可达.
在两台已经建立了邻居关系的路由器第一次交换路由时,它们将交换所有的路由信息:但是在这之后,只有当网络结构或者路由发生了变化时才会向外更新变化了的那一部分路由.EIGRP并不象RIP一样,EIGRP没有定期更新路由的机制.EIGRP将所有的收到的路由信息存放在"拓扑表"中,包括路由的目的地址,掩码,下一跳,度量距离(metric)等信息.EIGRP按照DUAL算法从拓扑表中挑选出最佳的,没有环路的路由,加入到路由表中.
DUAL算法(Diffusing Update Algorithm),散播更新算法,是EIGRP核心内容,也正是DUAL算法保证了EIGRP的路由计算是没有环路的.DUAL算法使用一个有限状态自动机(FSM)来描述EIGRP的路由计算过程,这个有限状态机被称为"DUAL状态机",有限状态机的机制保证了DUAL算法可以收敛.在后面的描述中提到DUAL这个缩写时,根据上下文,可能表示DUAL状态机,也可能表示DUAL算法.
DUAL算法是一种D-V算法.D-V算法,即距离-矢量算法,它的基本思想是:要找一台路由器到目标网络的距离,那么把它到邻居的距离和邻居到目标网络的距离相加,得到经由某个邻居到目标网络的距离,然后对所有的邻居进行计算并从中取最小值,就得到了路由器到目标网络的最短距离.所有采用D-V算法的路由协议都必须考虑如何避免环路的生成.
所谓"距离",各个动态路由协议的定义是不一致的,例如RIP的定义是到目标网络所经过的路由器的数目--"跳数".EIGRP针对每条网络路径,根据传输延时,链路带宽,有效带宽等参数计算出一个的综合度量距离(metric),用它来衡量各条路由的优劣.在后文中,提到"距离"这个词,往往指的是综合度量距离metric.
就路由器A而言,对一个目标网络,"可靠后继"(Feasible Successor,简称FS)是指这样的邻居路由器B:通过B到达目标网络有一条路径,并且B到目标网络的距离小于A到目标网络的距离.
而"后继"指的是某条路由当前正在使用的下一跳
例如在如下的网络拓扑结构中:
假定:
B-N的距离是10,C-N的距离是100.
A到N的最短路径是A-B-N,最短距离是30.
那么对于目标N:
路由器A的可靠后继有B,但C却不是它的可靠后继,
路由器B的可靠后继有N,但A却不是它的可靠后继.
如果B是A的可靠后继,那么我们可以确信:路由器A通过路由器B到达目标网络不会有环路.也就是说,可靠后继是没有环路的充分条件.
当网络发生变化时,DUAL会首先检测对目标网络是否还存在可靠后继:
1.如果存在可靠后继,那么使用可靠后继中最优的一个作为到达目标网络的下一跳,没有必要重新计算路由.
2.没有可靠后继,拓扑中也没有关于此目的地址的路由项,这说明目标网络已经不可达.
3.没有可靠后继,但是拓扑表中还存在到达此目的地址的路由项,即还有相邻路由器宣称它可以通往此目的地.这种情况下,相邻路由器所报告的这条路由不能满足可靠后继条件,我们无法对这条路由作出没有环路的保证.此时不可以采用这个相邻路由器作为通往目的地址的下一跳,(因为不能确保没有环路),而必须启动DUAL进行路由重算,这也是一个重新确定可靠后继的过程.当计算结束时,或者可以找到新的可靠后继,找到新的可以确保无环路的路由;或者可以确信目标网络已经不可达.
DUAL算法被称为一种散播算法,是因为它采用一种"分布的","扩散的"计算方式.具体说来,当一台路由器对某条路由找不到可靠后继,开始进行路由重算时,它会向所有邻居路由器提出"查询"(Query),这时我们称这条路由进入了active状态;等到所有的邻居路由器都对查询做出"应答"(Reply)后,这台路由器才会根据这些应答计算出新的可靠后继和新的最佳路由,这时我们称这条路由回到了passive状态,这个过程称之为"收敛".
当邻居路由器收到查询时,它也会检查自己的可靠后继条件:若条件满足,可靠后继存在,那么它将马上对查询做出应答;若条件不满足,找不到可靠后继,那么它只好先将查询搁置起来.然后它也会启动路由重算的过程,会向它所有的邻居发出查询,直到它的所有邻居应答后,它才会收敛并计算出新的可靠后继,这时它才会对先前搁置的查询做出应答.
可以看出,DUAL是一个不断向外扩散的计算过程,看起来似乎会越来越多的路由器卷入到计算过程中.但是实际上,DUAL的机制可以保证计算不会被扩散到太远,计算一般只会波及到必须的路由器;DUAL也可以保证这些发出查询的路由器不会相互无休止地等待应答,它们都会在比较快的时间内收敛.计算的传播过程也伴随着路由信息的传播,这使EIGRP可以很快的感受到网络的变化并做出响应.
伴随着DUAL计算,有许多报文在相邻路由器之间传送,这些报文携带着EIGRP的路由信息.EIGRP使用Raw IP在相邻路由器之间传送报文,因为Raw IP是一种不可靠的传输,所以EIGRP必须建立自身的可靠传输体系.EIGRP使用的序号确认,超时重传等机制确保报文的可靠送达.
注:TCP/UDP类型的套接字只能够访问传输层以上的数据,因为当IP层把数据传递给传输层时,下层的数据包头已经被丢掉了.而原始套接字却可以访问传输层以下的数据,所以Raw套接字可以实现上至应用层的数据操作,也可以实现下至链路层的数据操作.
只需要简单了解的读者看看这些就够了,如果想深入了解EIGRP,请继续向下看.
2 EIGRP的多进程
EIGRP是支持多进程的,在同一台路由器上,可以运行多个EIGRP的进程,各个进程之间使用进程号(as-number)相区分.
EIGRP每个进程之间是完全独立的,就像有几个协议一样:它们具有独立的使能网段,独立的协议配置,独立的接口配置,独立的邻居表,独立的拓扑表,独立的报文传送.进程的运行不会互相干扰,一个进程的运行状态和其他进程无关.EIGRP甚至可以在同一接口,同一链路上运行多个进程.EIGRP的各个进程之间可以相互引入路由.
EIGRP报文头中包含有as number,EIGRP进程将会丢弃接收到的其他进程(as number)的报文.EIGRP只在具有同一as number的路由器之间建立邻居关系.
3 报文格式
3.1报文格式描述
EIGRP使用Raw IP来封装报文,IP头中协议字段为88.
EIGRP的报文共分为Hello,Query,Reply,Update,Request五种,但是其中Request报文目前并没有使用.EIGRP没有单独的确认(ACK)报文,确认消息包含在其他报文中.每种报文又是由一个报文头加上一个或多个TLV组成.
TLV指Type-Length-Value,指的是由类型,长度,值三部分组成的信息单位.EIGRP目前有8种TLV:Parameter TLV,Authentication TLV,Sequence TLV,Software Version TLV,Next Multicast seq TLV,IP Request TLV,IP Metric TLV,IP Exterior TLV.其中IP Request TLV只用于Request报文,目前并没有使用.(其实还有一些IPX和AppleTalk网络使用的TLV,这两种网络不常用,所以也不再叙述.)
3.2EIGRP报文头
所有EIGRP的报文都有如下一个头部:
字段说明:
Version:协议版本(目前为2)
Opcod:报文类型
其中Update(1)报文用来更新路由,Request(2)报文目前不再使用,Query(3)报文和Reqly(4)报文用于查询和应答,Hell0(5)报文用来维护邻居关系.
报文的具体内容在后续的TLV的描述中会讲到.Update(1),Query(3),Reply(4)三种报文的具体用法会在"DUAL算法和DUAL状态机"详细描述.
Checksum:校验和
Flags:标志(0x01表示INIT,0x02表示CR).INIT标志表示发送给新邻居的第一个初始化Update报文,这个报文将携带所有的路由信息,而以后的普通的Update报文将只携带变化了的路由信息,关于CR(Conditional Receive)标志,将在"Sequence TLV"部分中讲述.
Sequence Number:报文的序列号,用于确认机制,不需要确认的报文,如Hello报文,这个域为0.
Ack Number:报文携带的确认信息.表示已经收到了此序列号的报文.
Autonomous-System Number:自治系统号,一般来说就是进程号.
3.3 EIGRP的TLV基本结构
根据报文的不同类型,在报文头后面有一个或者多个TLV(Type-Length_value组).每个TLV的基本结构如下图所示.
字段说明:
TLV Type:表示TLV的类型.其中的高字节为0表示与网络层协议无关的TLV类型;为1表示IP网络的TLV类型;2表示AppleTalk网络;3表示IPX网络.
TLV length:这个TLV的长度,由此来界定各个TLV.这个长度是指整个TLV的长度,包括TLV Length和TLV Length部分.
TLV Value:TLV的内容,具体依据不同的TLV不同.
3.4 Parameter TLV
Parameter TLV被携带在Hello报文中,用来指定建立邻居所需要的一些参数.它的TLV Type为0x0001,长度为12字节.格式如下:
字段说明:
K1-K5:计算度量距离的系数K值.
Hold-Time:这个Hello报文的有效时间,若超出这段时间还没有收到新的Hello报文,则认为此路由器已经失效,邻居关系终止.
3.5 Authentication TLV
Authentication TLV用来携带认证信息,它的TLV Type为0x0002,它可能出现在任何报文中.按照Cisco的想法,对一份报文采用多种认证方式,但是目前只采用了MD5认证.
字段说明:
Auth Type:认证类型,目前只有MD5一种类型---0x02.
Auth Length:认证的长度,对MD5来说,认证长度为0x10.
Auth Data:认证信息.对于MD5来说,又包括Auth KeyID(4字节),Auth Pad(12字节),Auth Digest(16字节)三部分.Auth KeyID默认为0x00000001,可以在接口上配置;而Auth Pad没有意义,永远为0;Auth Digest包含MD5认证的信息.
3.6 Sequense TLV
Sequense TLV可能出现在Hello报文中,它的TLV Type为0x0003,它的作用让某些邻居路由器进入到CR(Conditional Receive)状态.
字段说明:
Address Length:地址的长度,对于IPv4地址族,取4
Protocol Independent Address:网络层地址,对于IPv4地址,它长4字节.
每一组Address Length和Protocols Independent Address,表示了一个邻居路由器的IP地址,Sequense TLV可以携带多个IP地址的列表.凡是接收到这个TLV的邻居路由器将检查自己是否在这个列表中,如果不在这个列表中,则把自己置为CR状态.只有处于CR状态的路由器,才能接收带有CR标志的报文.(EIGRP报文头部分中关于Flags字段的说明).
让我们通过一个例子来了解CR状态的作用,某路由器R在一个接口上有A,B,C三个邻居.它向这个接口发送了一个Update报文,然后收到了A,C的确认,但是因为某种原因没有收到B的确认,这样无法知道B是否收到了这份Update报文.此时,路由器R既不想继续等B的确认;也不希望B在没有收到第一份Update报文的情况下接收第二份Update报文,因为这种失序有可能引起混乱.于是,路由器R发了一个带有Sequense TLV的Hello报文,里面列出了B的IP地址,这样A,C就会将自己置于CR状态,B则会保持正常态.R发出的后续Update报文将在报文头中打上CR标志,这样只有A,C才会接收到这些报文,而B因为不是CR状态,将会忽略带有CR标志的报文,这样就保证了B不会接收到失序的报文.路由器R将在稍后向B依次发送B所错过的报文.
3.7 Software Version TLV
出现在Hello报文中,它的TLV Type为0x0004,用来指定EIGRP协议软件的版本.
字段说明
Sys Major和Sys Minor:系统的主版本号和从版本号.目前分别取1和0.
EIGRP Major和EIGRP Minor:EIGRP的主版本号和从版本号.目前分别取1和0.
3.8 Next Multicast seq TLV
Next Multicast Seq TLV可以出现在Hello报文中,它的TLV Type为0x0005.它需要和与Sequense TLV配合使用,单独的Next Multicast Seq TLV没有意义.
在有Sequense TLV,但没有Next Multicast Seq TLV时,表示处于CR状态的邻居路由器可以接收以后所有带CR标志的报文.
在有Sequense TLV和Next Multicast Seq TLV都有时,则Next Multicast Seq TLV指定了一个序列号,处于CR状态的邻居路由器只可以接收带CR标志,并且序列号为这个指定序列号的报文.
字段说明:
Seq Number:下一个可以接收的多播报文的序列号.
3.9 IP Request TLV
Request TLV是专用于Request报文,它的TLV Type为0x0101,表示向对端路由器请求关于某几个IP网络地址路由信息.但是现在的EIGRP协议版本没有使用Request报文.
字段说明:
使用Mask Bit Count和IP Address表示一个网络地址,这是一种"紧缩"的表示方式.如果表示10.0.0.0/255.0.0.0,那么Mask Bit Count取8,IP Address长一个字节,置10;如果表示192.2.0.0/255.255.0.0,那么Mask Bit Count取16,IP Address 长两个字节,分别置192和2.
3.10 Metric TLV
IP Metric TLV可以出现在Query,Reply,Update报文中,它的TLV Type为0x0102,用来表示到某个目的地址的EIGRP内部路由及其度量距离.(EIGRP内部路由是指由EIGRP发现,非引入的路由)
字段说明:
Next Hop Forwarding Address:路由的下一跳的IP地址.
灰色标记的部分表示计算一个综合度量距离Metric的各个要素.
Delay,Bandwidth,MTU,Hop Count,Reliability,Load:依次是总延时,最小带宽,MTU值,跳数,可信度,负载.
Mask Bit Count和IP Address:目标网络的IP地址.用"紧缩"的方式(见IP Request TLV中的说明).一个IP Metric TLV中可以有多个目标网络,表示多条路由信息,它们的下一跳和Metric相同.
3.11 IP Exterior TLV
IP Exterior TLV可以出现在Query,Reply,Update报文中,它的TLV Type为0x0103,用来表示到某个目的地址的EIGRP外部路由及其度量距离.(EIGRP外部路由是指由EIGRP引入的路由)
字段说明:
Next Hop Forwarding Address:路由的下一跳的IP地址.
上方浅灰色的部分表示EIGRP外部路由信息.
Router ID:引入这条路由的路由器的IP地址
AS Number:引入这条路由的路由器所在的自治系统.
Administrator Tag:可以用来携带一组路由映射的标记.
External Protocol Metric:所引入路由在原协议中的Metric值
External Protocol:所引入路由的原协议号.(IGRP为1;EIGRP为2;静态路由为3;RIP为4,OSPF为6;BGP为9;直连网段为11)
Flags Field:标志位(0x01表示EXTERNAL;0x02为CD).EXTERNAL标志表示外部路由;CD标志表示Candidate Default路由.
下方深灰色标记的部分表示计算一个综合度量距离Metric的各个要素.
Delay,Bandwidth,MTU,Hop Count,Reliability,Load;依次是总延时,最小带宽,MTU值,跳数,可信度,负载.
Mask Bit Count和IP Address:紧缩格式的目标网络IP地址,可以有多个,表示多条路由信息.
4 邻居的发现和维护
首选需要指出的是,EIGRP只会在使能的接口上工作.即启动EIGRP之后,需要使用Network命令打开相应的接口,这个接口所连网段的路由才会被EIGRP发布,同时EIGRP也会向这个接口发送报文并接收来自这个接口的报文.当一个接口被指定为passive-interface.那么,这个接口上将既不发送也不接收EIGRP报文(包括Hello报文),但是这个接口所连网段的路由仍然会被其他接口发布.
邻居是通过定期发送的Hello报文实现的,相邻路由器之间通过Hello报文建立邻居关系,在一段时间内没有收到报文将清除邻居关系,路由信息报文的连续发送失败和一些配置命令也会导致邻居关系的清除.
4.1 发送Hello报文
EIGRP定期将向开启的各个接口发送Hello报文,默认每隔5秒钟发送一次,发送间隔可以根据需要在接口模式下配置.发送采用一个定时器控制.发送使用组播地址224.0.0.10,所有运行EIGRP的路由器将加入这个多播组.
Hello报文不携带路由信息,只有as number,系数K值,保持有效时间(Hold-Time)等一些参数,这样报文比较短小,占用很少的带宽资源.Hello报文是不需要确认的,也就是说Hello报文采用不可靠传输.
4.2 邻居的发现
当一台路由器接收到来自其他路由器的Hello报文时,而且这台路由器还不在它的邻居表中,那么EIGRP将检查Hello报文中携带的as number,系数K值是否与自己的一致,如果一致,将和这台路由器建立邻居关系,将其添加到自己的邻居表中.接收到Hello报文也将刷新一个Hold Time定时器,这个定时器控制邻居是否超时.
具体来说,邻居建立的条件有如下:
1.自治系统号相同
2.系数常量相同(K1,K2,K3,K4,K5)
3.在同一个网段上(地址借用除外)
4.3 邻居建立的握手过程
在收到对端路由器发送过来的Hello报文后,并满足邻居建立条件,EIGRP就会与其建立邻居关系.但是,必须经过三次握手后,才可以正常的发送和接收路由信息.
如下图所示:
三次握手示意图(1)的说明:
1.A发送一个带INIT标记的UPDATE报文给B.
2.B收到邻居A发送过来的带INIT标志的UPDATE报文后会接着发一个带INIT标记的UPDATE报文给A,同时这个UPDATE报文中带有ACK号,应答邻居A的INIT标记报文.
3.A收到B的带有INIT标志的UPDATE报文(有ACK号)以后,会发送一个ACK报文给B.
这时,邻居关系才算真正建立起来,可以正常交换剩下的路由信息.
同时,还可以通过如下方式来完成三次握手(如下图):
三次握手示意图(2)的说明:
1.A与B同时(或者在没有收到对方带INIT标志的报文前)向对方发送带INIT标志的UPDATE报文.
2.A和B在收到对方发送过来的带INIT标志的UPDATE报文后,分别向对方发送一个ACK报文,对收到的报文进行确认.
在三次握手过程中,可能会出现一端没有准备好的情况(例如还没有从这个路由器收到Hello报文),如下图所示:
在一方没有准备好的情况下的三次握手的具体说明:
1.A收到B的Hello报文,与B建立邻居关系,立即发送一个INIT标志设置为1的UPDATE报文,想与B交换拓扑表.
2.但是,B没有收到A的Hello报文,故无法与A建立邻居关系,所以收到的带有INIT标志的UPDATE报文是来自于未知邻居,丢弃这个UPDATE报文,不作处理.
3.A重发这个UPDATE报文(注意是超时重发),但是,B在没有收到A的Hello报文与A建立邻居关系之前,就不会处理这个UPDATE报文.
4.B收到A的Hello报文,与A建立邻居关系,立即发送一个INIT标志设置为1的UPDATE报文,想与A交换拓扑表.
5.B是A的有效邻居,所以A收到B的带INIT标志的UPDATE报文后,应答和处理这个报文,并且重发自己的初始化UPDATE报文.(超时重发)
6.B再收到A的带INIT的UPDATE报文后,由于与A正常建立了邻居关系,能够正常应答和处理该UPDATE报文.
7.A与B正常交换剩余的路由信息.
实际上,Cisco的设备在在邻居建立的三次握手过程中,并不是严格按照以上步骤来进行的,如下图所示:
此过程的说明如下:
1.A发送一个带INIT标记的UPDATE报文给B.
2.B收到邻居A发送来的带INIT标志的UPDATE报文后,直接发送一个ACK报文给A,对收到的报文进行确认.
3.A三次握手成功,可以正常接收B发送过来的路由信息.
(实际中一般不会出现这种情况,但是可以通过测试程序模拟)
4.4 邻居的删除
有下面这几种情况会导致邻居的删除:
1.Hold Time定时器超时,说明在这段时间一直没有接到这个邻居的报文;
2.路由信息报文连续重发16次,一直没有接到对方的确认报文.
3.邻居对我方发出的查询在SIA时限内没有应答;
4.一些配置命令会导致邻居的清除和重新建立,具体说来如下.
以下命令将清除相应接口上的所有邻居:
passive-interface
ip authentication key-id eigrp (Csico上无次命令.ip authentication key-chain eigrp)
ip authentication key-string eigrp (Csico上无次命令)
ip authentication mode eigrp
offset-list(配置接口参数) (Csico上无次命令)
ip split-horizon eigrp
ip summary eigrp
以下命令将清除本进程下的所有邻居:
metric weights
network
distribute-list
offset-list(全局)
auto-summary
5.接口失效时将删除接口上所有的邻居.
6.用户还可以通过命令clear ip eigrp neighbor来手工删除一个邻居.
5 EIGRP报文的MD5认证
EIGRP可以配置MD5认证来保证报文的合法性和完整性.如果配置了MD5认证,EIGRP在发送报文时将使用MD5算法对报文生成摘要;在收到报文后,EIGRP将校验MD5摘要,EIGRP将丢弃认证失败的报文.
MD5认证是保证报文完整性,合法性的一种重要手段.一般说来,MD5认证按照如下方式进行.
1.双方协商好一个密码.
2.报文发送端将密码填入到报文的某一个字段中,然后按照MD5算法对包含密码的整个报文进行运算,得到MD5摘要,将生成的摘要填回到同一字段,覆盖密码.
3.报文接收端收到报文后,先将摘要字段保存起来,然后也将密码填入到报文的这个字段中,再按照MD5算法计算,得到摘要.比较这个摘要与先前保存的摘要,如果一样,就说明报文是合法的.
EIGRP的MD5认证的密码和摘要是放在Authentication TLV的Auth Digest字段中.和一般报文的MD5认证相比,EIGRP有一点不同:EIGRP进行MD5计算时,只计算一部分的报文内容,报文的最后的20字节(相当于报文头的长度)不参加计算.如图
进行MD5认证时,EIGRP将16字节密码填入到Auth Digest字段中,然后对灰色部分(不包含最后20字节)进行MD5计算,得出16字节的摘要,再将这16字节的摘要填回到Auth Digest字段中.得到经过认证的报文.(以上MD5验证过程适用于密码长度小于等于15的情况,密码长度大于等于16的验证过程还不详.)
Cisco在接口上配置认证时给出的是Key-chain的名称,然后在Key-chain模式下配置Key-id和Key-string.一个Key-chain下面可以配置多组Key-id和Key-string,对于每组Key-id和Key-string,还可以设置各自的有效时段.Cisco在发送认证报文时,使用在有效时段内并且Key-id最小的Key-String作为密码字符串;Cisco在接收认证报文时,将使用报文中Auth KeyID字段中指定的值作为Key-id,查找相对应的Key-string作为密码字符串.
6 拓扑表的维护
拓扑表是EIGRP存放路由信息的重要数据结构,DUAL算法,组织报文都是以拓扑表做为依据的.EIGRP从路由报文,路由聚合,路由引入等不同来源中提取路由信息,并根据这些路由信息进行对拓扑表进行维护.拓扑表的变化将触发DUAL有限状态机,以得到新的可靠后继.
6.1 拓扑表的结构
拓扑表中包含了如下信息:
1.目标网络地址
2.下一跳(邻居路由器)的地址,所在接口
3.到目标网络的最优度量距离(Feasible Distance)
4.邻居路由器报告的它到目标网络的度量距离(Report Distance)
5.EIGRP外部路由信息(包括外部路由的来源等)
对于一个目标网络,拓扑表中可能会有多个下一跳的纪录,即多条路由纪录.
度量距离的计算,Feasible Distance和Report Distance的含义将在"FD,RD以及可靠后继条件"中介绍.
6.2 EIGRP的Metric计算
任何动态路由协议都有自己的尺度来衡量路由的优劣,这就是多次提到的度量距离Metric.在EIGRP中的度量距离Metric是按照如下公式计算得到的:
其中:
K1-K5:系数K值,分别表示带宽系数,有效带宽系数,延时系数,可信度系数.默认情况下,K1=K3=1,K2=K4=K5=0.
bandwidth:带宽衡量值,由路径上的最小带宽(Min BandWidth)计算得到.
bandwidth:(10000000/最小带宽)*256......最小带宽单位为kbps
delay:延时衡量值,由路径上的总延时(Sum of Delay)计算得到.
delay=总延时*256.......................总延时单位为10微秒
load:链路负载,0-255.255表示最大负载.
reliability:可信度,值越大路由越可信.
可以看出在默认情况下:
下面是一个简单的例子,用来说明Metric的计算:
假设:
A-B网络的带宽为56(kbps),延时为2000(10微秒)
B-N网络的带宽为10000(kpbs),延时为100(10微秒)
那么:
A-B的Metric为(10000000/56+2000)*256=46226285
B-N的Metric为(10000000/10000+100)*256=281600
A-B-N的Metric为(10000000/56+(2000+100))*256=46251885
注意,A-B-N的Metric并不等于A-B和B-N两段路径的Metric相加.即在这个算法中"整体"并不等于"部分"的算术相加,但是可以保证"整体"大于任一个"部分"."整体"大于任一个"部分"是D-V算法的基本数学前提.
对接口上的直连网络,它们的可信度和负载默认是255和1,它们的延时和带宽根据接口类型的不同分别有一个默认值.
接口上的带宽和延时可以通过接口模式下的配置命令bandwidth和delay进行修改.
6.3 FD(Feasible Distance),RD(Report Distance)以及可靠后继条件(Feasible Condition)
拓扑表中每条路由纪录的都有可靠距离(Feasible Distance)和上报距离(Report Distance)两项,简称FD和RD,分别表示到目标网络的是优距离和邻居路由器报告的距离.
继续上小节中的例子:
很显然,A到目标网络N,只有A-B-N这样一条路由.那么,A到目标网络的最短距离,即FD,为A-B-N的Metric---46251885;而B向A报告的距离,即RD,为B-N的Metric---281600.
让我们使用FD和RD再简单描述一下可靠后继条件(Feasible Cndition--FC):对给定目标网络,路由器A的可靠后继是这样的邻居路由器,它向A报告的RD小于A的FD.(对于可靠后继条件的详细描述可以参见"可靠后继条件")
满足FC条件的邻居路由器就是可靠后继(Feasible Succssor).比如说,如果这时有一个路由器C和A也建立了邻居关系,并且C向A通告:C到达目标网络N的距离为20000000.从A的角度,C报告的RD为20000000,小于自己的FD 46251885,所以C是到目标网络的可靠后继.这也说明:通过C到达目标网络的路径也许不是最佳的,但是一定没有环路.如果A-B之间的网络发生故障,那么A可以马上采用C作为到达目标网络的下一跳.
如果C向A报告到目标网络的距离为50000000,大于A的FD 46251885,那么C无法满足可靠后继条件,也就无法保证A经过C到达目标网络会没有环路.那么,如果A-B发生故障,尽管此时拓扑表中关于还有C到N的路由项,A也不能采纳,而是向各个邻居路由器发出查询,启动路由重算的过程.当这个过程结束后,也许会使用C作为下一跳通向目标网络(A将相应的更新FD);也许会发现目标网络已经不可达(这时A的FD为无穷大).
6.4 拓扑表的变化将触发状态机
收到路由信息报文(Update,Query,Reply),接口上的直连网段发生变化,引入其他路由协议的路由,执行路由聚合,这些事件都会产生路由变化信息.路由变化信息将包括:目标网络地址,下一跳,新的Metric(FD和RD),新的外部路由信息.
EIGRP会根据这些路由变化信息更新拓扑表,保持拓扑表和实际情况的同步.更新拓扑表完成后将触发DUAL算法,以根据拓扑表的变化计算出新的最佳路由.下面的章节将继续讲述DUAL算法是如何计算得到最佳路由的.
7 DUAL算法和DUA状态机
7.1 D-V算法和Metric计算
总体上来说,EIGRP采用的DUAL算法仍然是一种D-V算法.也就是说,对于某个目标网络,路由器是根据邻居上报的结果,再"加上"本路由器到各个邻居的"距离",从中比较出最小值,得到本路由器到目标网络的最短距离和最优路径.这里"加上"和"距离"被加上引号是因为在EIGRP中,它们有特殊的涵义.
在EIGRP中,"距离"指的是综合度量距离Metric,"加上"也并不代表算术相加.因为从"EIGRP的Metric计算"中我们可以知道A-B-N的Metrice并不等于A-B的Metric简单加上B-N Metric,而是根据Metric的各个分量重新计算的结果.这也是为什么报文中使用IP Metric TLV和IP Exterior TLV传递路由信息时必须传递延时,最小带宽,负载等各个Metric分量,而不只是传递一个计算后的Metric值.
事实上,DUAL算法对如何计算Metric,如何衡量路由优劣没有做出规定.DUAL算法也并不关心Metric是如何计算的,它只要求计算方式可以保证整体大于部分就可,即A-B-N的Metric一定会大于B-N的Metric.所以在后文对DUAL算法的描述中,为了简洁起见,我们常采用简单相加的方式来计算度量距离Metric,这对叙述DUAL算法完全没有影响.但是在具体描述EIGRP协议时,我们必须明确,Metric值不可以算术相加.
7.2 触发更新,部分更新机制.
EIGRP的路由更新是通过Update报文实现的.Update报文有单播和多播两种方式.
1.在两台路由器首次建立邻居关系时,它们会向对方发出带有"INIT"标志的Update报文进行初始化(参见"EIGRP报文头").初始化的Update报文中包含所有的路由信息,即整个数据库.这个Update报文采用单播的方式传送.
2.以后,每当路由器的路由发生变化时,路由器将以多播的方式向所有的邻居路由器发送Update报文,报文中只包含更新的路由信息,即变化了的数据库.
7.3 可靠后继条件(FC)
前面已经描述了EIGRP使用的可靠后继条件:邻居报告的RD小于自己的FD.用反证法不难证明,这个条件是没有路由环路的充分条件.
可靠后继条件是DUAL的重要内容之一,但是事实上,DUAL算法提出的可靠后继条件并不是唯一的.在参考资料"Loop-Free Routing Using Diffusing COmputaion"这篇论文中,作者J.JGarcia-Lunes_Aceves一共描述了三个可靠后继条件:
1.DIC(Distance Increase Condition)
这个条件称为距离增加条件.也就是说如果在任何时候,如果路由器A发现链路的COST减少,或者邻居上报到目标的距离减少,这时A可以随意在当前所有邻居中选择具有最优路由的邻居作为下一跳,这时可以保证没有环路发生.否则则不能保证.
DIC还有一个不那么严格的版本.也就是说,如果A发现到链路或邻居的Metric增加,只要A还能找到一个邻居路由,经过个邻居路由器到达目标网络的距离最小,并且小于等于原来的最优距离(A到目标网络在这段时间的最小值),那么A仍然可以将这个邻居作为自己的下一跳路由器,这时可以保证没有环路的发生.如果找不到这样的邻居路由器,那么A就无法保证无环路条件.
这个条件的充分性是很显然的,如果发生路由变化后,本路由器到目标网络的最优距离和原来相比没有增大,而一定不会有环路的发生.
DIC条件可简单概括为:新的最优距离小行等于原来的最优距离.(FD<=old_FD)
2.CSC(Current Successor Condition)
这个条件称为当前后继条件.具体来说,假设路由器A原来的后继是路由器B,如果当路由发生变化时,假设这段时间内B到目标网络的最小值是S.如果路由器A可以找到这样一台路由器X,首先A经过X到目标网络是最近的,并且X到目标网络的距离小于等于S(原来的后继B到目标网络距离的最小值).那么A就可以将X作为自己的新的后继,这个时候是可以保证没有环路的.如果找不到这样的路由器X,那么就不能保证找到无环路的路由.
这个条件显然也是充分的.新的后继X到目标网络比原来的后继B更近,说明X到目标网络是不可能绕回路由器A形成环路的,A到X是直连,所以综合起来也不会形成环路.
CSC条件可以简单概括为:新的后继到目标网络的距离小于等于原来后继到目标网络的距离.(RD<=old_RD)
3.SNC(Source Node Condition)
SNC就是我们所叙述的条件,也是目前Cisco EIGRP所采用的.
这个条件称为源节点条件.也就是说,如果路由器A到目标网络可以找到这样一台路由器X,首先A经过X到目标网络是最近的,并且X到目标网络的距离小于原来的最优距离(A到目标网络在这段时间的最小值).
这个条件也是充分的,因为新的后继X到目标网络的距离小于A到目标网络的距离,那么X就不可能是绕回A到目标网络的,所以A经过X到目标网络不会形成环路.
注意到这个条件是三个条件中唯一判断"小于"的条件,DIC和CSC都是判断"小于等于".这是因为SNC在等于的情况下不能确保无环路的发生.
这个条件比前2个条件相比更加宽松一些,因为它毕竟是RD和FD的比较,并不加上原来A到邻居的距离.也正是因为这样的原因,这个条件更加具有实用性,被Cisco用来作为EIGRP协议DUAL算法的基本判断条件.实际上,前2个条件在前人的论文中都进行过阐述,J.J.Garcia-Lunes_Aceves的这篇论文着重阐述并证明了SNC.
SNC条件可以简单的概括为:新的后继到目标网络的距离小于原来的最优距离.(RD
7.4 可靠后继条件中必须判断最优后继
在Cisco的很多资料中,一般都只强调了RD
简单说,在判断路由器是否可以收敛时,只有同时满足2个条件才能认为满足可靠后继条件:1)有邻居路由器RD
如下图:
在初始时,A选择B到达目标网络N,FD是4.如果仅根据RD 此时:B到目标网络的链路突然中断,B会向A发出Query.A需要判断是否可以收敛,假设A仅检查RD 但是:这时如果选择C作为下一跳,不符合路由协议的优选原则,毕竟经过C更加远.如果选择D作为下一跳,则不清楚D到目标网络是否会有路由环.(因为D并不满足RD 所以说:判断是否可以收敛时,可靠后继条件中必须保证先满足最优后继条件,在这种条件下此时应该认为所有路由器都不满足可靠后继条件,此时A不能收敛,将发起查询. 7.5 使用查询应答机制进行DUAL计算. 实际上,无论使用三个可靠后继条件中的哪一个,都只能保证路由无环路.DUAL算法就是一种利用这种无环路条件,结合了有限状态机机制,计算得到网络的最佳路由的算法. DUAL算法被称为扩散更新算法,是因为它采用了一种扩散更新机制.也就是说一个结点开始计算时,路由器就向外发出查询(Query),计算可能会不断向外扩展,然后通过收到应答(Reply)而结束计算. 扩散更新机制的实质就是通过这种查询进行路由计算的扩散,然后通过应答实现计算结果的收敛. 7.5.1 被动态(Passive)和主动态(Active) 一条路由在稳定时称为"被动态(Passive)";发出查询后这条路由就进入到了"主动态(Active)";收到所有答复,路由重新找到了可靠后继,计算收敛,那么它又回到了"被动态". 7.5.2 DUAL算法的启动 当路由器的数据库因为某种原因发生了变化,那么路由器将针对变化了的路由进行可靠后继条件(FC)的检查,如果还存在可靠后继,那么使用可靠后继中最好的一个做为目标网络的下一跳;如果没有可靠后继,那么则向所有的邻居发出查询(Query),并等待所有邻居的应答(Reply). 7.5.3 查询(Query) 7.5.4 应答(Reply) 路由器接到查询后并不是马上应答,它会首先根据查询报文更新自己的数据库. 更新数据库后,如果被查询的路由处于Passive态,那么EIGRP将检查这条路由的FC条件:FC条件满足,选择出最优的可靠后继,并马上对查询者发送Reply报文;FC条件不满足,将查询搁置起来,同时路由也进入到Active状态,并向所有的邻居路由器发出查询.直到路由收敛,才会对搁置的查询进行应答,向查询者发送Reply报文. 更新数据库后,如果被查询的路由正处于Active态,那么将检查查询者是否为这条路由目前正在使用的后继:若查询者不是后继,那么直接按照数据库中的FD向查询者发送Reply报文;若查询者是后继,那么搁置查询,等待这条路由收敛,回到Passive态时,再对查询者发送Reply报文. 7.5.5 收敛 路由器的某条路由在发起查询后,必须等待所有邻居路由器的Reply报文,在此期间此路由的FD值保持不变.当收到了一份Reply报文,EIGRP会按照Reply报文中的路由信息更新数据库.当收到了所有邻居的Reply报文后,DUAL将从数据库中找到最佳的后继,将它作为到目标网络的下一跳,并触发对路由表的修改.(在某些情况下,收到所有的Reply后,DUAL将重新检查FC条件,若FC条件不满足,仍然无法保证找到无环路的路由,此时DUAL将对这条路由再次发起查询,重新开始计算.这种情况将在下面"DUAL状态机描述"中说明.) 让我们看一下简单的例子.为了简洁,例子中的Metric计算采用简单算术相加的方式. 如下面的网络拓扑结构: 已知: B-C的Metric为30;B-A的Metric为10;C-A的Metric为15;A-N的Metric为6. 那么对于目标网络N: B-N的最短路径是B-A-N,Metric为16,A是B的可靠后继(6<16),C不是B的可靠后继(21>16); C-N的最短路径是C-A-N,Metric为21,Aj是C的可靠后继(6<21),B也是C的可靠后继(16<21); 假定一:在某个时刻:C-A之间的链路中断,即C-A的Metric变成不可达. 那么: 1.C发现自己还有可靠后继B,B是C唯一的(当然也是最优的)可靠后继,C直接使用B作为到达目标网络的下一跳,C更新了自己的路由表. 2.B,A没有收到任何影响. 假定二:在某个时刻,B-A之间的链路中断,即B-A的Metric变成不可达. 那么: 1.B发现失去了唯一的可靠后继A,B找不到可靠后继了,B进入Active态,向C发出了Query. 2.C收到了B的Query,发现自己还有可靠后继A,C没有进入到Avtive状态,C马上向B发送Reply,告诉B这条路由. 3.B收到C的Reply,也就是收到全部的Reply,B收敛,回到Passive态.B从当前的数据库中找到了最优项(即C)作为下一跳并更新路由表,B也将C确定为新的可靠后继. 假设三:在某个时刻,A-N之间的链路中断,即A-N的Metric变成不可达. 那么 1.首先,对于目标网络N,A没有可靠后继,A在数据库中将N标记为不可达,进入到Active状态,向C,B发出Query,Query中说明自己对N已经不可达. 2.C收到A的Query,发现自己还有可靠后继B,于是将路由改为C-B-N,Metric为46(16+30),然后按照46的向A发送Reply.A收到了C的Reply,知道C-N有一条Metric为46的路由,但是A没有使用这条路由,也没有改变自己的FD,A还在等B的Reply. 3.B收到了A的Query,发现自己没有可靠后继了,于是B搁置A的查询,在数据库中将目标网络标为不可达,然后进入到Active状态,按照不可达向C,A发出Query. 4.A收到了B的Query,因为A处于Active状态并且B不是A的后继,所以A马上向B发送Reply,说明到目标网络N不可达.但是B还在等待C的Reply. 5.C收到了自己的后继发来的Query,发现自己没有其他可靠后继了(A,B都用Query报文通告到目标网络不可达),于是C搁置B的查询,然后将N标记为不可达,进入到Active状态,并向A,B发出了Query报文. 6.B,A都收到了C发来的Query,因为B和A都处于Active状态,并且C不是他们的后继,所以它们马上向C发送Reply,表示到N不可达.特别对于A,A曾经收到过C的一份Reply报文,说C到N有一条Metric为46的路由,这份Query报文使A的数据库中进行了更新,将"C-N(46)"改成了"C-N(不可达)". 7.C收到了A,B的Reply,这时所有的邻居都应答了.C收敛,回到了Passive状态,根据目前C的数据库,C知道到N已经不可达(因为没有邻居还可以通向N).于是C更新路由表,将到N的路由删除.最后,因为C还搁置了B的查询,所以C向B发出了"N不可达"的Reply. 8.B收到了C的Reply,这时B的所有邻居也都应答了.B收敛,回到了Passive状态,根据目前B的数据库,B知道到N已经不可达(因为没有邻居还可以通向N).于是B更新路由表,将到N的路由删除.最后,因为B还搁置了A的查询,所以B向A发送了"N不可达"的Reply. 9.A终于等到所有的邻居应答了,A收敛,回到了Passive状态.同样的,A知道到N已经不可达,于是A更新路由表,将到N的路由删除. 注1:以上是没有采用"水平分割"时的情况,如果采用"水平分割",情况会少许简单一些.(具体可以参考"水平分割") 注2:当DUAL计算收敛(完成后),更新路由表时,EIGRP会使用Update报文来向各个邻居路由器通告路由更新信息.在这个例子中,因为收到Update报文不会再对数据库进行修改,所以DUAL算法不会被再次触发. 上面的叙述只是对DUAL算法的一个大体描述,散播计算的具体过程要更加复杂.下面我们通过DUAL状态机对散播计算的过程进行详细的,完整的描述. 7.6.1 DUAL状态机的状态 对于某一条路由,DUAL状态机一共有5种状态,其中1种是被动态(Passive),另外4种是不同的主动态(Active).下面是这五种状态的说明: Passive:路由处于稳定状态下,没有进入查询,或者再查询后收到了所有邻居的应答而收敛. ACT0:本路由器是查询的最初发起者,并且再发起查询后,至少经历的一次"距离增加",但没有收到过后继发来的查询. ACT1:本路由器是查询的最初发起者,并且再发起查询后,没有经历过的"距离增加",也没有收到过后继发来的查询. ACT2:情况一,本路由器因为收到了后继的查询而发起查询(原ACT3),进入了主动态,在发起查询后,至少经历过一次"距离增加";情况二,本路由器是查询的最初发起者,发起查询后,又收到了后继发来的查询(原ACT1). ACT3:本路由器因为收到了后继的查询而发起查询,进入了主动态,在发起查询后,没有经历过"距离增加". 所谓"距离增加"是指收到后继发出的Update报文,后继上报的Metric(即RD)比以前增加了,显然本路由到目标网络的Metric也将随之增加.这种情况下,有可能本路由器将找到其他更优的路径,从而改换后继;也有可能后继上报的路由已经不可靠,发生了环路. 可以看出ACT0和ACT2两种状态,是经历了"距离增加"的.在这种情况下,等收到了所有邻居应答时,不可以直接从数据库中挑出最佳,而必须再进行一次FC条件测试.条件满足,收敛,找到最佳后继;条件失败,重新发起查询. 7.6.2 DUAL状态机的状态转换 下面将就DUAL状态机状态转换图的各个状态转换过程做一个详细的说明: 7.7 Stuck In Active(SIA)功能 在正常情况下,按照DUAL算法和DUAL状态机,一条路由进入到Active状态后,能够在较快的时间内收敛,回到Passive状态,但是,因为某种原因,某条路由可能会长时间滞留在Active状态,没有收敛,这种情况我们称之为Stuck In Active,简称SIA. 引起SIA的可能原因有: 1.网络不畅通,路由器可以收到Hello报文,但是较大的Query,Reply报文传输总是失败. 2.某些路由器处理速度慢,吞吐量小或者内存不够,在大量路由发生变化时成为了瓶颈,来不及处理或来不及发出报文. 3.报文错误.可能是因为某台路由器实现EIGRP协议及DUAL算法时存在错误,也可能是存在恶意的错误报文. EIGRP提供了SIA时限的机制.也就是说,一条路由在进入到Active状态后,如果在规定时间内没有收敛(默认的时限是3分钟),那么EIGRP将强制它收敛.即不再等待剩下的没有应答的邻居,而是按照目前已经收到的应答来计算路由,那些没有应答的邻居将被从邻居表中清除.(当然,可以通过Hello报文来再次建立邻居关系) 7.8 DUAL算法的性能. J.J.Garcia-Lunes_Aceves在论文中将DUAL算法和L-S算法(Link State Routing链接-状态路由算法),传统D-V算法在性能上进行了综合比较,比较中考虑了节点失效,节点恢复,链路失效,链路恢复这四种网络中常见的动荡,考察了这4种情况下三种算法收敛速度,消息数目待方面的性能. 他的分析结果显示,L-S算法在计算量上远远超过其他2种算法,这是L-S算法的原理决定的.在其他方面,DUAL一般都优于传统D-V算法.在节点恢复,链路恢复时,DUAL算法和L-S算法的差距不大,但是在节点失效,链路失效这2种情况时,DUAL要逊于L-S算法.实际上,L-S算法在各种情况下的表现基本一致,在各种失效的情况下具有优势. 综合来看,DUAL算法达到的指标超过传统D-V算法,稍逊于L-S算法. 在实际应用中,DUAL算法在大规模的网络中性能比L-S算法要有明显差距,这主要是因为DUAL算法需要在一个较大范围内进行查询扩散并依次向回收敛;而L-S算法在完成路由信息扩散之后,各节点分别在本地计算路由,在大规模网络中更加具有优势. 8 报文发送和可靠传输 EIGRP使用Raw IP发送报文,IP头的协议字段为88.由于IP协议是不能够保证可靠传输的,故EIGRP需要建立自己的可靠传输机制. 并非所有EIGRP报文都要保证可靠传输,Hello报文就不需要,而Query,Reply,和Update报文则必需要保证可靠传输.EIGRP使用了序号确认和超时和重传机制保证报文传输的可靠性.同时为了充分利用多播以保证发送效率,EIGRP还采用了流控,链路带宽限制等技术.这些使得EIGRP的报文发送过程变的十分复杂. 8.1 单播报文和多播报文 EIGRP发送的报文即有单播报文也有多播报文,EIGRP使用多播报文以尽量减少报文数据,在不能使用多播的情况下使用单播报文. EIGRP发送的单播报文有: 1.Reply报文.当收到一个Query报文后,EIGRP要向查询者发送一个Reply应答报文.这个应答报文采用单播发送. 2.初始化的Update报文.两台路由器刚建立起邻居关系,便要互相交换路由信息,这些交换的路由信息是通过单播发送Update报文来实现的. 3.重传报文.当一台路由器向邻居发送多播Update或者Query报文而未收到邻居的确认信息时,EIGRP会向未确认的邻居发送重传报文,和重传报文总是采用单播发送. 4.Ack信息:Ack信息可以携带在其他单播报文中发送,也可以单独使用单播发送. EIGRP发送的多播报文包括: 2.Update报文.除了初始化的Update报文以外,其他路由信息变化时的Update报文都是采用多播的方式发送的. 3.Query报文.Query报文总是采用多播方式来发送. 对于多播报文,发送后不会进行重传,多播报文的序号确认和可靠重传被分解成各个单播报文进行.也就是说,EIGRP在发送完多播报文后,将分别等待各个邻居的确认,分别给超时的邻居进行重传,重传总是采用单播的方式进行.为了保证重传过程的效率,以及保证每一个邻居都可以按照正确的顺序接收报文,EIGRP采用了"流控"和"选择接收(CR)"等处理方式,具体可以参见"流控"和"Sequense TLV"等章节的说明. 8.2 报文发送策略过滤 在生成EIGRP报文的过程中,EIGRP可能会对路由信息进行过滤或改变: 1.EIGRP可以根据distribute-list的配置对发送报文进行过滤,可以禁止某些路由的发送. 2.EIGRP可以根据offset-list out的设置改变向外发布路由的Metric值,可以给某些路由的Metric中的延时分量加上一个偏移量. 3.EIGRP如果在接口上采用了"水平分割(Horizon Split)",将会按照水平分割的要求过滤一些路由信息.(详见"水平分割") 4.EIGRP如果在接口上配置了路由聚合(包括自动聚合和手工聚合),那么将只发送生成的那条聚合路由,其他在聚合范围内的路由不会再被发送.(详见"路由聚合") EIGRP中,只有可靠传输的报文需要对方在接收报文后确认,不可靠传输则不需要. 采用可靠传输的报文,在EIGRP报文头中的Sequense Number字段中将填入一个顺序递增的序列号,不可靠传输的Sequense Number字段为0(参见"EIGRP报文头"部分).当对端收到报文后,会对该序号进行确认,以通知发送方接收方已经收到报文,不需要再进行重传.确认时将被确认的序号填写在EIGRP报文头中的ACK Number字段中. EIGRP没有单独的确认报文类型,确认信息是携带在其它报文类型中(所有的报文类型都可以携带ACK信息).当报文不携带确认信息时,ACK Number字段为0. 如果Ack报文采用Hello报文类型单独发送,这种Hello报文被称为Ack报文.Ack报文是一种特殊的Hello报文,它与前面所述的建立并维护邻居关系的Hello报文是有一些区别的: 8.4 超时重传 可靠传输的报文在发送出去一段时间后,如果没有得到邻居的应答,那么就会重传该报文.重传16次后如果还没有应答,就将该邻居复位. 报文发送后到重传该报文之间的这段时间称为超时重传时限(Retransmit Time Out,RTO),RTO的计算参照TCP的方法确定(参见RFC793).按照< 1.每次发送报文成功,则根据报文的往返时间来计算RTO,计算方法如下(单位毫秒): SRTT(Smoothed Round Trip Time平滑往返时间,对往返时间的平均估算),每收到一次ACK报文: SRTT(new)=0.8*SRTT(old)+0.2*RTT 那么: RTO(Initial)=6*max(SRTT,PacingInterval) 即一般来说,RTO为SRTT的6倍. 2.在每一次因为RTO超时而重发报文后,重传时间将越来越长,下一次的重传时间为: RTO(New)=RTO(Old)*1.5 RTO(Final)=min(5000,Max(200,RTO(Computed))) 即每次RTO乘以1.5,但是最小200毫秒,最大5秒. 8.5 水平分割(Horizon Split) 水平分割(Horizon Split)是在很多D-V算法的路由协议中都有的一个概念,指的是:"从某个接口上收到的路由信息不再向这个接口发送". 在前面"使用查询应答机制进行DUAL计算"的例子中,如果所有的路由器的所有接口都配置了水平分割,那么当A-N链路中断时: A-N的Metric变为不可达,并且没有可靠后继,A进入Active状态,向B,C发送Query. B没有可靠后继,进入Active状态,向A,C发送Query.这时水平分割发生作用,向A发送的Query报文不会发出,B只向C发送了Query,并且只会等待C的应答.(如果水平分割不发生作用,B向A发出了Query,A也会马上应答,在结果上没有区别) 可以看出,水平分割可以减少报文人,减少对网络带宽的,减少等待收敛的时间. 水平分割可以减小产生路由环的可能性,但是在某些NBMA网络上可能会造成路由信息的丢失,这种情况下应该在接口上禁用水平分割. 8.6 流控(Flow Control) EIGRP对多播传送采用了一种多播的流控技术,主要目的是协调同一接口上不同响应速度的各个邻居. 具体地说是这样,EIGRP在发送了多播报文后,等待一小段时间.如果在这段时间内没有收到任何邻居的确认,EIGRP不会在这个接口上发送下一份多播报文,而会继续等待.只有当至少收到了一个邻居的确认时,EIGRP才会发送下一份多播报文. 在发送下一份多播报文之前,为了避免那些还没有收到前一份报文的邻居产生接收失序,EIGRP会先发送一个Hello报文.在这个Hello报文中携带有Sequense TLV和Next Multicast Seq TLV,这2个TLV会将那些收到了前一份报文的邻居置为CR状态.而且,发出的下一份多播报文会在报文头上作CR标记,只有在CR状态的邻居才会收到后续带有CR标记的报文.而那些没有收到前一份多播报文的邻居因为不在CR状态,也会丢弃后一份多播报文(因为后一份多播报文带有CR标记).EIGRP将采用单播方式对这些邻居依次重发他们错过的报文. 这样做的好处是:即可以利用多播传送来节省网络带宽,又可以避免速度快的路由器等待速度慢的路由器而影响效率. 8.7 EIGRP对链路带宽的限制 为了有效地防止网络拥塞,EIGRP只使用固定百分比的链路带宽.缺省情况下,EIGRP最多使用链路带宽的50%来发送各种报文,可以使用ip bandwidth-percent eigrp命令来调整这个百分比.这个百分比数值表示的是EIGRP在发送报文时最多使用的链路带宽比例,而不是EIGRP一直对链路带宽有如此高的使用率. 为了达到链路带宽限制的目的,EIGRP在发送一个报文之前,将先等待一段时间,这个时间是根据报文长度,接口带宽,可以占用的比例计算出来的.这样就确保了路由器不会因为发送EIGRP报文而造成网络拥塞. 实际上,相对于EIGRP的路由报文流量来说,现在一般的链路带宽都足可以满足要求,这个功能的实际意义并不大,一般也不需要修改这个配置. 9 引入路由 EIGRP可以引入静态路由,直连网段的路由,其他动态路由协议生成的路由.相对于EIGRP协议直接得到的路由,这些引入的路由称为EIGRP的外部路由. 引入路由的Metric按照如下计算: 1.引入的直连网段的路由,根据直连网段所在的接口属性来计算引入路由的Metric. 2.引入IGRP路由,直接使用IGRP的各个Metric分量.(IGRP的Metric也是根据带宽,延时,负载,可信度等各个分量计算得来,计算公式和EIGRP类似) 3.引入其他自治系统EIGRP的路由,直接采用EIGRP的Metric. 4.引入其他路由(包括静态路由,OSPF,RIP,BGP等),在引入命令中可以指定Metric的各个分量(延时,带宽等),如果命令中指定了Metric,按照命令中指定的值进行计算;如果命令没有指定,则采用Default-metric. 为了防止各个路由协议之间循环引入路由从而造成路由环,EIGRP提供了Administrative tag来防止路由被循环引入. Cisco的EIGRP在路由引入还提供如下特性: 1.自动引入自治系统号相同的IGRP路由,而不用使用命令指定,引入后路由的Metric由原IGRP路由的各个metric分量转换而来(乘以256) router eigrp 100 network 10.0.0.0 network 129.1.0.0 no auto-summary 虽然没有使用redistribute命令将这条静态路由引入,但是EIGRP自动把这条静态路由做为EIGRP的内部路由向外发布. 3.当存在EIGRP的直连路由时,如果再引入直连路由,则引入无效.例如: ip address 192.168.1.1 255.255.255.0 router eigrp 100 network 192.168.1.0 redistribute connect 则EIGRP拓扑表中只存在一条192.168.1.0/24的路由,引入的直连路由不成功.当执行no network 192.1.1.0时,直连路由才会被引入. 10 路由聚合 EIGRP支持两种路由聚合:自动聚合和任意长度掩码的手工聚合.EIGRP的自动聚合开关默认是打开的,自动聚合的聚合范围是由配置的network命令决定,并针对主网(按照A,B,C类地址掩码划分的自然网段)进行的.手工聚合可以根据需要在接口上进行配置,聚合的范围可以是任意的网络地址和掩码. 两种路由聚合只是在配置手段上有所区别,具体的聚合处理是没有区别的.在配置了路由聚合之后,对聚合范围内的所有路由,EIGRP生成了一条聚合路由,这条路由的Metric取聚合范围内的最小Metric值.在向外发送报文时,EIGRP对外只发布这条聚合路由,聚合范围内的其他路由不再被发布.聚合路由的接收方路由器将它们和其他普通路由信息同样处理. 使用路由聚合可以减少路由报文对网络带宽的占用,减少其他路由器为了存储路由信息所耗用的内存空间,减少路由器CPU的处理负荷. Cisco的EIGRP聚合路由会加入到路由表中,出接口为NULL0,这样可以避免形成路由环. 10.1 自动聚合 当EIGRP的路由跨越不同的主网时,会按照有类地址进行自动聚合.自动聚合需要注意以下方面: 2.系统中至少要配置两个network命令,即至少需要有两个主网络被EIGRP打开. 3.对于EIGRP的外部路由或者收到的远端路由,一般不会被自动按照有类地址进行聚合.但是如果此路由落在某个network命令指定的网段区间,则会随network命令一起被自动聚合,即使这个network命令的网段并映射任何实际接口. 例如,如下图所示: 图中A有3个接口:S0,E0和E1,接口的地址网段在图上标出.其他相关配置如下: ip route 129.1.1.0 255.255.255.0 NULL0 ip route 129.1.2.0 255.255.255.0 NULL0 router eigrp 100 network 10.0.0.0 network 11.0.0.0 network 129.1.0.0 redistribute static 则: 1.路由10.1.1.0/24和10.1.2.1/24通过Serial0口发送给B时被自动聚合成10.0.0.0/8 2.路由10.1.1.0/24通过Ethernet1口发送给D时,不会被自动聚合成10.0.0.0/8,因为相同的主网. 3.引入的静态路由129.1.1.0/24和129.1.2.0/24通过Serial0口发送给B时被自动聚合成129.1.0.0/16,因为这个网段被network打开,并且跨越了主网. 10.2 手工聚合 EIGRP通过手工聚合来支持CIDR(无类域间)路由,与自动聚合不同,手工聚合可以配置任意掩码的聚合路由. EIGRP的手工聚合与BGP协议的手工聚合不同,是针对接口的,即聚合是在接口模式下配置,路由只有从该接口发送出去时,才可能会被聚合,而从其它接口发送,则不受影响. 例如:A上有三条路由192.1.1.0/24,192.1.2.0/24,192.1.3.0/24.通过Serial0口发送路由时只想发送一条聚合路由(CIDR),则需要进行如下配置: interface serial0 ip summary eigrip 100 192.1.0.0 255.255.252.0 则发送时这三条路由被手工聚合成一条CIDR路由192.1.0.0/22 11 EIGRP的负载分担 EIGRP即支持等价负载分担,又支持非等价分担,而且EIGRP是目前唯一支持非等价负载分担的路由协议.下面将介绍这两种负载分担方式. 11.1 等价负载分担 等价负载分担,即EIGRP的metric相等的路由参与负载分担 通常情况下,EIGRP只会选择一条最佳路由添加到路由表中,用来指导转发.但是如果几条路由的metric相同,那么,这些路由都会被加入到路由表中,来负载分担数据流的转发. 等价负载分担有两种工作方式:基于目的地址(per-destination)和基于数据包(per-pack): 2.基于数据包:到达目的地址1的第一个数据包使用path1来发送;到达目的地址1的第二个数据包使用path2来发送.依此类推. 11.2 非等价负载分担 非等价负载分担,即EIGRP的metric不相同的路由参与负载分担.参与非等价分担的EIGRP路由需要满足下列条件: 1.路由必须是可靠的,即无环路,满足FC 2.路由的metric值小于或者等于最小metric值的N倍(N为系数,可以通过variable命令来调整). 例如:Router到目标网络有三条路由(这三条路由都是可靠的) path1:Metric=30 path2:Metric=20 path3:Metric=40 选出最下的Metric=20 a.N=2,即所有metric小于或者等于40(20*2)的路径都参与负载分担.从而是可以启用path1和path2 b.N=3,即所有metric小于或者等于60(20*3)的路由都参与负载分担,从而可以启用path1,path2和path3. 参与非等价负载分担的路径的流量分配与路径的metric值成反比,即用所有参与非等价负载分担的路径中最大的metric值除以每一条路径的metric值,便可以得到该路径转发数据包的数据.如上面的N=3的例子: 最大Metric=45,流量分配为 path1:45/30=3/2 path2:45/20=9/4 path3:45/45=1 即前9个包使用path2发送,接下来6个包使用path1发送,最后四个包使用path3发送. 12 EIGRP命令列表 13 EIGRP的新进展 13.1 IEGRP Stub EIGRP提出了STUB路由器的概念,位置处于末端的路由器可以通过命令配置成为STUB路由器.一台路由器被配置成为STUB之后,会通过Hello报文通报给邻居路由器.STUB路由器默认只会发布自身的直连路由和聚合路由,不会向外转发路由.也就是说,STUB路由器对于其他路由器是可达的,但是一般情况下流量不会穿过STUB路由器. 在DUAL算法中,一台路由器进入Avtive状态后,会向所有的邻居路由器发出查询(Query),并等待所有邻居路由器的应答(Reply).如果一台路由器发起查询时发现一个接口上的所有邻居都是STUB路由器,那么这个查询就不会发出.如果一个接口上既有STUB邻居又有普通邻居,那么查询报文仍将以组播方式发出.STUB路由器收到查询后,将会立即以不可达来应答查询,同时不会向外扩散查询. 将一些路由器配置为STUB将有效的降低网络中的路由信息流量,减少路由振荡时的收敛时间. 13.2 在PE-CE之间运行EIGRP EIGRP本来就支持多进程运行,Cisco在此基础上实现了EIGRP PE-CE,就是在PE-CE之间运行EIGRP协议,传递VPN内路由信息,但是目前还没有见到组网应用. 注:MPLS VPN有三种类型的路由器,CE路由器,PE路由器和P路由器.其中.CE路由器是客户端路由器,为用户提供到PE路由器的连接;PE路由器是商边缘路由器,也就是MPLS网络中的标签边缘路由器(LER).它根据存放的路由信息将来自CE路由器或标签交换路径(LSP)的VPN数据处理后进行转发,同时负责和其他PE路由器交换路由信息;P路由器是运营端网络主干路由器,也就是MPLS网络中的标签交换路由器(LSR),它根据分组的外层标签对VPN数据进行透明转发,P路由器只维护到PE路由器的路由信息而不维护VPN相关的路由信息. 具体情况和RIP,OSPF都很相似.Cisco扩展了BGP的扩展团体属性,通过BGP传递了EIGRP路由的一些属性:如原始自治系统号,是否是外部路由.如果PE收到的一条EIGRP路由是由内部路由,并且原始自治系统号和本地的EIGRP自治系统号相同,则将这条EIGRP路由作为一条内部路由注入到相连的CE中,否则将作为一条外部路由注入到CE中.整个过程和OSPF有一些类似. EIGRP PE-CE的配置方式和RIP,BGP相似,和OSPF不同.EIGRP在协议模式下在使用address-family命令指定对应的VRF实例. 需要注意的一点是:上面提到的携带在BGP扩展团体属性中的EIGRP自治系统号并不是在router eigrp后面配置的数值,Cisco增加了另外一条anonymous-system命令来指定需要携带在BGP扩展团体属性的自治系统号.Cisco可能更加倾向将router eigrp命令中的数值看成是EIGRP的进程号,和OSPF统一起来. 目前EIGRP PE-CE还没有类似OSPF Shamlink这样的机制来解决Backdoor问题. 注:MPLS VPN里面PE和CE通过OSPF连接,并且几个CE之间有后门链路(Backdorr),数据会优先走后门链路,通过OSPFSham link就可以让你决定数据走什么路. 13.3通过RouterID来减少邻居数量 当2台运行EIGRP的路由器通过了多个接口连接起来时,现在EIGRP将在每一个接口上都建立邻居关系,这样将形成多个独立的邻居关系.目前EIGRP对此进行了改进,通过RouterID来确认是否是同一个邻居,对于RouterID相同的路由器,只选择一条最佳链路来建立唯一的邻居关系. 这种处理将避免多个链路上路由信息的重复传送,同时也能够在发生路由振荡时加快收敛. 13.4 EIGRP NSF Cisco号称在最新的IOS 12.3中实现了EIGRP的NSF(Never Stop Forwarding),具体情况不详.但是考虑到EIGRP基本上不会应用在骨干网上,这个特性的意义并不大. 13.5 三次握手过程的改进 Cisco在最新的IOS版本中改进了EIGRP的三次握手过程. 以前的握手过程是这样的:只要收到邻居发来的Hello报文,就将这个邻居加入邻居列表中.并向这个邻居单播发送的Init Update报文(可以携带路由),等到收到对端的Init Update报文并对我们的Update报文进行Ack,握手完成 .也就是说,只要收到Hello报文并且参数正确就认为邻居建立,在握手进行的同时就可以交换路由信息. 改进后的握手过程是这样的:收到邻居的Hello报文之后,先将这个邻居加入一个候选列表中.对于进入候选列表的邻居可以发送Init Update报文(但不携带路由),只有收到对端的Init Update报文并对我们Update进行Ack之后,才会将邻居放入到正式邻居列表中.只有对在正式列表中的邻居,才能确保单播和多播双向可达性,这时才用Update报文开始交换路由信息.改进后的握手过程和以前的握手过程是兼容的.在改进的握手过程中,只有收到对方的单播和多播报文才认为邻居建立,才开始交换路由. Fast Hellos是Cisco对所有路由协议进行的一个改进.简单来说,加快Hello报文的发送速率可以快速检测到链路故障,从而加快网络的收敛速度.一般来说,在接口上Hello报文间隔时间最小可以配置为一秒.但是Cisco新增了一条命令,允许在一秒内发送出多个Hello报文,这样可以保证在1秒内检测到网络的故障.当然,频繁的Hello报文也会以占用一定的网络带宽作为代价. 14 EIGRP vs OSPF OSPF是目前使用最为广泛的域内单播路由协议,EIGRP也在金融,证券,中小企业中得到了较大规模的应用.这2种协议各有优缺点,下面作一个简单的对比. 14.1 OSPF的缺点 vs EIGRP优点 2.OSPF不支持不等价负载分担.EIGRP是目前唯一支持不等价负载分担的协议.另外,OSPF对路由的级别划分较多,不同级别之间的路由不可以负载分担. 3.EIGRP可以控制协议报文对链路带宽占用的最大比例,OSPF没有类似的功能. 4.OSPF协议需要存放整个区域的网络拓扑结构,并使用SPF算法来计算路由,对路由器的CPU和内存需求较高.这实际上也是所有L-S算法协议的共同特点.不过随着路由器性能不断提高和硬件成本不断下降,这个缺点现在并不重要.EIGRP对CPU和内存的需求相对来说要小一些. 14.2 OSPF的优点 vs EIGRP缺点 1.OSPF通过区域划分很好的实现了路由的分级管理,在大规模网络的情况下,OSPF可以通过划分区域来规划和限制网络规模.EIGRP没有区域(AREA)的概念,一般更适用于网络规模相对较小的网络.EIGRP虽然也可以划分自治系统并互相引用,但是这样的组网方案在实际中很少使用,效果不及OSPF的划分区域理想,也不如OSPF+BGP的实现方案. 2.在共享网络的NBMA网络上,OSPF可以选举DR和BDR,所有路由器将只和DR,BDR交换路由信息,这样可以有效的降低协议报文的数量.而EIGRP路由器将两两交换路由信息,这样EIGRP将会使用更多的带宽来传送协议报文,当一个共享网段上有大量EIGRP路由器时,协议报文对带宽的占用将非常严重. 3.OSPF协议使用的是L-S算法,在完成路由信息扩散之后,各节点分别在本地计算路由,在大规模网络中更加具有优势.EIGRP的路由计算是基于DUAL算法的,这种分布式的算法需要在一个较大范围内进行查询扩散并依次向回收敛,这样在较大型网络中性能表现会不如OSPF.尤其是如果在狭长形的网络拓扑结构中运行的EIGRP,一端的路由信息变化需要依次传递到另外一端,然后再从另一端向回依次收敛,效率更加不理想. 4.OSPF支持STUB,完全STUB,NSSA等区域类型,通过配置这些类型的区域,可以最大限度的减少路由数目和路由计算次数,确保网络更加稳定.EIGRP虽然也提出了STUB路由器的想法,但是优化的效果不如OSPF. 5.OSPF协议是IETF组织公布的标准RFC.世界上主要的网络设备厂商都支持该协议,所以它的互操作性和可靠性由于公开而得到保障,并因为竞争的存在也使得网络的构建在合理的价格范围内,而在众多的厂商支持下,该协议也会不断走向更加完善.而EIGRP是Cisco公司的私有协议.Cisco公司是该协议的发明者和唯一具备该协议解释和修改权的厂商,没有受到外界监督与完善.Cisco公司对该协议的修改没有义务通知任何其他厂家和使用该协议的用户,因此会在网络升级扩展中导致运行的安全隐患;从另外一个角度,如果用户使用了这种协议组网,由于担心网络扩展而出现的隐患,从而选择了单一设备,则又将陷入封闭网络的怪圈,步入使用这种私有网络体系的后尘,最终使得网络的构建及维护费用都大大增加. 15 相关参考资料 [1] < [2] < [3] < [4] < [5] 美国专利US005519704,Cisco [6]http://10.110.90.60/php-dev/protocol.php?f_id=introduction&name=EIGRP,北研协议测试部网站 [7]转自:http://www.docin.com/p-59429884.html
查询是通过组播方式向所有的邻居发送Query报文,报文中使用IP Metric TLV和IP Exterior TLV来描述各条需要查询的路由信息,内部路由使用IP Metric TLV,外部路由使用IP Exterior TLV,这些TLV中的Metric是启动查询时刻的FD值.
应答指通过单播方式的向发起查询的路由器发送Reply报文,报文中使用IP Metric TLV和IP Exterior TLV来描述应答的路由信息.
A-N的最短路径就是A-N,Metric为6,N是A的直连网段,不存在可靠后继;
7.6 DUAL状态机描述.
1.Hello报文.EIGRP在使能的各个接口上使用多播地址向外周期性发送Hello报文.
8.3 序号确认
RTT(Round Trip Time往返时间):从发出报文到收到ACK所需要的时间.
2.如果在配置静态路由时指定的是出接口,并且该路由被EIGRP的network命令打开,则EIGRP自动引入这条静态路由.例如:
ip route 129.1.1.0 255.255.255.0 Serial0
interfcae Serial0
1.必须跨越主网,只有路由与发送接口不在同一个主网时,路由才会被自动聚合.
等价负载分担的路由数量是收到限制的,最多为6条(Cisco的规格),可以通过命令maximum-paths来调整这个数量.
1.基于目的地址:所有到达目的地址1的数据包都使用path1发送;所有到达目的地址2的数据包都使用path2来发磅.
13.6 EIGRP Fast Hellos
1.OSPF的配置相对复杂.由于网络区域划分,DR选举,路由分级,ABR聚合等复杂机制,需要网络管理员对协议比较熟悉才可以规划和管理OSPF网络.EIGRP的配置相对来说要简单一些,在最简单的情况下只需要使能协议和网段就可以了.