简介
EIGRP(增强型的内部网关路由协议),高级距离矢量路由协议集合了距离矢量路由协议和链路状态路由协议的多种优点。它是思科的私有协议,从IGRP(内部网关路由协议,现已淘汰)改进而来,思科设计之初野心比较大-想把BGP干的活也包揽进来。但是后来发现这样做有点力不从心,所以现在EIGRP只在内部自治系统中使用。
EIGRP属于先进的DV(Distance Vector:距离矢量)协议,传输更新的时候,离目的地有多远(Distance);从哪个接口发送出去(Vector)。具有典型的DV特征,传输路由更新仍然是在传输网络前缀,带距离和方向。既然叫增强型(Enhance)那么增强在哪里呢?因为它具有如下部分链路状态路由协议的特征:
算法-DUAL(弥散更新算法),在没有算法的路由协议中如RIP,在失去了一条路由条目后只能等到更新周期到了之后才能更新路由表。而EIGRP在发生这种情况的时候会向周边的邻居发起查询,一直查询到边界以确认这条路由条目是否消失。
邻居表-EIGRP通过Hello报文发现、维持邻居关系,邻居一旦失效EIGRP能够快速检测快速收敛。
增量更新-有确认机制的触发更新而不是像RIP一样的周期更新。
特征
Fast Convergence(快速收敛):EIGRP除了会在拓扑表里找到最优下一跳,还会有备份下一跳,所以对于拓扑变化反应速度非常快。它是IGP里收敛最快的动态路由协议。
Partial Updates(部分更新):两个路由器互发Hello报问,把路由条目都发给对方完成第一次完整更新,以后不再周期性地更新,只有当拓扑发生变化的时候再发送变化的部分路由条目。这里蕴涵一个条件,不做周期性更新,就需要可靠性保障,而EIGRP使用的是IP-和UDP一样不可靠,为确保可靠性需要Ack,Seq。
复杂的度量值(Metric)计算机制:EIGRP不像RIP用跳数来做开销,而是选用一个计算规则来衡量链路的开销。用如下接口链路的几个参数来衡量链路开销:
MTU 1500 bytes(MTU-最大传输单元), BW 1544 Kbit/sec(带宽-链路上的参考带宽), DLY 20000 usec(延迟-数据包发出接口处理的时间), reliability 255/255(可靠性-链路的丢包率,百分比表示), txload 1/255, rxload 1/255(负载-链路带宽使用率,参考值)
支持可变长子网掩码(VLSM):EIGRP是一种无类路由协议,在更新时可以附带每个子网的子网掩码,因此它支持不连续的子网和VLSM。
支持不同的二层协议(数据链路层)和网络拓扑类型(专线、点对点、多路访问和非广播多路访问):使用EIGRP时不像OSPF那样针对不同二层协议(如以太网、帧中继和ATM等)需要做特殊的额配置。在LAN和WAN环境下EIGRP都能够高效的运行;EIGRP支持所有WAN拓扑并能够适应不同类型和速度的介质。
支持多种三层(网络层)协议:源于IGRP,现在基本上只有IP了。对于不同的网络层EIGRP会构建不同的数据库以提供支持。
其他:如无环设计、灵活的网络层次设计、配置简单、支持任一节点手工汇总和唯一一个支持非等价负载均衡配置的动态路由协议。
RTP(可靠传输协议)
EIGRP直接封装在IP包中发送,协议号为88。RTP负责确保EIGRP分组按照顺序地传递给所有邻居,它支持组播(组播地址:224.0.0.10)和单播分组的混合传输。为提高效率只有某些分组(更新、查询、回复)以可靠的方式传输。
我们用抓包工具看看:
EIGRP报文类型
EIGRP有如下5种报文类型:
Hello-用于发现、建立和维持邻居关系
Update-用于发送路由更新信息
Querry-向邻居查询某条更新信息
Reply-针对查询的响应
Ack-确认消息
注意:以上5种报文只有高亮部分的2、3、4报文需要Ack确认。
EIGRP邻居建立和初始路由发现过程
邻居建立过程如下图所示分步进行:
R1在运行EIGRP的所有接口上发送Hello包给R2(R1不需要对方R2确认,对方收到了就知道“我”就是它邻居)。
R2收到R1的Hello报文后,会向R1发送它的所有的Update路由信息(更新组中包含路由表的全部路由)进行应答,但是通过该接口获悉的路由除外(水平分割原理)。但是在路由器在把Hello报文发送给R1前并没有建立邻接关系。R2发送的Update分组的初始位(Init bit)被设置,以指出这是初始化过程。
两台路由器彼此交换Hello分组后,邻接关系便建立了。R1用ACK应答R2指出它已经收到更新信息。
R1将R2给它的更新分组中的信息加入到拓扑表中。拓扑表包含邻接路由器通过的所有目标网络(以及能够到达目标网络的所有邻居和相应的度量值)。
R1同样会向R2发送R1的所有的Update路由信息。
R2收到R1的Update路由更新信息后,向R1发送ACK确认已经收到Updte。
到此R1和R2都收到对方的更新分组后,便能够选择后继(最佳)路由和可行后继(备用)路由,并将后继路由存储到拓扑表中。
EIGRP报文互交过程实例
R2#debug eigrp packets terse //查看除了Hello报文之外的所有其他报文的Debug
EIGRP Packets debugging is on
(UPDATE, REQUEST, QUERY, REPLY, IPXSAP, PROBE, ACK, STUB, SIAQUERY, SIAREPLY) //除了Hello报文之外的所有报文类型
R2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)#router eigrp 1 //启用EIGRP路由进程并计入编号为1的AS
R2(config-router)#eigrp router-id 2.2.2.2 //配置路由ID,可有可无,习惯问题
R2(config-router)#network 0.0.0.0 //懒人做法,宣告所有接口到EIGRP进程
R2(config-router)#
*Mar 1 05:43:03.054: EIGRP: Packet from ourselves ignored
*Mar 1 05:43:03.122: %DUAL-5-NBRCHANGE: IP-EIGRP(0) 1: Neighbor 12.12.12.1 (FastEthernet0/0) is up: new adjacency //邻接建立
*Mar 1 05:43:03.122: EIGRP: Enqueueing UPDATE on FastEthernet0/0 nbr 12.12.12.1 iidbQ un/rely 0/1 peerQ un/rely 0/0
*Mar 1 05:43:03.122: EIGRP: Received UPDATE on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.122: AS 1, Flags 0x1, Seq 17/0 idbQ 0/0 iidbQ un/rely 0/1 peerQ un/rely 0/0
*Mar 1 05:43:03.126: EIGRP: Received Sequence TLV from 12.12.12.1
*Mar 1 05:43:03.126: 12.12.12.2
*Mar 1 05:43:03.126: address matched
*Mar 1 05:43:03.126: clearing CR-mode
*Mar 1 05:43:03.126: EIGRP: Received CR sequence TLV from 12.12.12.1, sequence 18
*Mar 1 05:43:03.126: EIGRP: Received UPDATE on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.130: AS 1, Flags 0xA, Seq 18/0 idbQ 0/0 iidbQ un/rely 0/1 peerQ un/rely 0/0, not in CR-mode, packet discarded
*Mar 1 05:43:03.130: EIGRP: Requeued unicast on FastEthernet0/0
*Mar 1 05:43:03.130: EIGRP: Enqueueing UPDATE on FastEthernet0/0 iidbQ un/rely 0/1 serno 1-4
*Mar 1 05:43:03.134: EIGRP: Forcing multicast xmit on FastEthernet0/0
*Mar 1 05:43:03.134: EIGRP: Building Sequence TLV
*Mar 1 05:43:03.134: EIGRP: Enqueueing UPDATE on FastEthernet0/0 nbr 12.12.12.1 iidbQ un/rely 0/0 peerQ un/rely 0/1 serno 1-4
*Mar 1 05:43:03.138: EIGRP: Sending UPDATE on FastEthernet0/0
*Mar 1 05:43:03.138: AS 1, Flags 0xA, Seq 2/0 idbQ 0/0 iidbQ un/rely 0/0 serno 1-4
*Mar 1 05:43:03.142: EIGRP: Sending UPDATE on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.142: AS 1, Flags 0x1, Seq 1/17 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/2
*Mar 1 05:43:03.210: EIGRP: Received UPDATE on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.210: AS 1, Flags 0x8, Seq 18/0 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/2
*Mar 1 05:43:03.214: EIGRP: Received ACK on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.214: AS 1, Flags 0x0, Seq 0/1 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/2
*Mar 1 05:43:03.214: EIGRP: Sending UPDATE on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.214: AS 1, Flags 0x8, Seq 2/18 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/1 serno 1-4
*Mar 1 05:43:03.282: EIGRP: Received UPDATE on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.282: AS 1, Flags 0x8, Seq 19/1 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/1
*Mar 1 05:43:03.286: EIGRP: Enqueueing ACK on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.286: Ack seq 19 iidbQ un/rely 0/0 peerQ un/rely 1/1
*Mar 1 05:43:03.286: EIGRP: Received ACK on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.290: AS 1, Flags 0x0, Seq 0/2 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 1/1
*Mar 1 05:43:03.290: EIGRP: FastEthernet0/0 multicast flow blocking cleared
*Mar 1 05:43:03.290: EIGRP: Enqueueing UPDATE on FastEthernet0/0 iidbQ un/rely 0/1 serno 5-5
*Mar 1 05:43:03.290: EIGRP: Sending ACK on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.294: AS 1, Flags 0x0, Seq 0/19 idbQ 0/0 iidbQ un/rely 0/1 peerQ un/rely 1/0
*Mar 1 05:43:03.294: EIGRP: Enqueueing UPDATE on FastEthernet0/0 nbr 12.12.12.1 iidbQ un/rely 0/0 peerQ un/rely 0/0 serno 5-5
*Mar 1 05:43:03.298: EIGRP: Requeued unicast on FastEthernet0/0
*Mar 1 05:43:03.726: EIGRP: Sending UPDATE on FastEthernet0/0 nbr 12.12.12.1
*Mar 1 05:43:03.726: AS 1, Flags 0x8, Seq 4/19 idbQ 0/0 iidbQ un/rely 0/0 peerQ un/rely 0/1 serno 1-4
EIGRP表类型
EIGRP有如下3张表:
邻居表-邻居表列出了所有运行EIGRP并且形成邻接(Adjacency)关系的直连路由器。邻居表的内容如下:下一跳运行EIGRP的路由器(邻居的接口IP)和本路由器连接邻居的接口。
此外还包含如下等一些其他参数
R1#sh ip eigrp neighbors
IP-EIGRP neighbors for process 1
H Address Interface Hold Uptime SRTT RTO Q Seq
(sec) (ms) Cnt Num
0 12.12.12.2 Se0/2 11 00:14:26 60 360 0 3
邻居表字段解释
H(Handle):跟踪邻居的编号,代表发现邻居并建立邻接的顺序,0代表最先建立的邻居依次累加最先建立的在在下面最后建立的在最上面。
Address(地址):邻居的接口IP地址。
Interface(接口):通过该接口从邻居那里收到了Hello包,因此通过它可以到达邻居,也就是到邻接的出口。
Hold(保持时间):表示多长时间没有收到邻居的Hello包就认为邻居失效了的等待时间。注意:新版本的Cisco IOS中,收到邻居的第一个Hello分组后,任何EIGRP分组将重置定时器。
Uptime(正常运行时间):表示我认识邻居有多久了,也就是邻居在我的存活时间。如果邻居重启的话,Uptime时间又从0开始计算。
SRTT(Smooth Round Trip Time平滑平均往返时间):该字段用来确认下面要提到的RTO(重传间隔)。SRTT表示将EIGRP分组发送到邻居以及本地路由器收到邻居对该分组的确认之间的时间。在若干次给对方发送Update后对方回复ACK的平均往返时间。该平均值反映了链路的时延。
RTO(Retransmit Time-Out重传超时): 表示给对方发Update后,等待对方回复ACK的最大等待时间,如果ACK一直没有收到,本地路由器就认为Update丢了或者ACK丢了,总之没有得 到对方的确认。如果链路拥塞的话,本地路由器就有可能不能及时收到ACK,那么本地路由器就有必要等待一段时间以避免误解。所以RTO表示我等你“这段” 时间,如果“这段”时间ACK没有回来的话,我就给对方邻居重传。直到重传16次或Hold定时器到期为止。
Q Cnt(Queue Count队列计数器): 我发送分组(Update,Querry,Reply),在对方回ACK之前,先排一个队列,得到ACK的包就从队列移除,没有得到ACK的包,则一直在 队列中排队。该值反应的是等待发送报文的个数。正常情况下,该值的变化是先1后0,因为发一个包没有收到ACK前置1,收到ACK后置0。
Seq Unm(Sequence Number序列号):从邻居里收到的最后一个更新、查询或应答分组的序列号。
除了上面这些能到在邻居表里看到的字段,下面介绍一下没有出现在邻居表里的字段:
MFT(Multicast Follow Timer组播流计时器): 在MA(多路访问)网络中,一个接口连接了多个网络(如帧中继的点到多点子接口),这种情况下就没有必要挨个给邻居发送更新了,干脆就从接口直接发送组播更新这样对端所有邻居(只要启用EIGRP)就应该都能收到了。正常情况下发送一次更新就更新了所有邻居,并都能收到所有邻居的ACK。但是,如果在发送组播更新后,等待MFT时间段后没有收到某个或某些邻居的ACK,则对其发送单播更新(没必要再次发送组播更新,因为只有部分没有收到更新,这样,可靠的多播能够继续进行,而不会延误与其他对等体的通信,从而避免了由于网络中包含不同速率的链路而降低汇聚速度。)并开启RTO计时器,如果RTO超时也没有收到ACK则继续发送第二次单播更新,反复重试16次(默认值)后还是收不到对方的ACK就down neighbor。
注:RTO(针对单播)和MFT(针对多播)都是可以改变的,根据SRTT动态计算。(具体计算公式,目前Cisco没有公开)。
RTO递增计算公式:RTO*(1+1/2),最小值200,最大5000ms(重传间时间隔越来越大直到5秒钟后一直会是每5秒钟重传一次),初始值不固定按照SRTT动态计算。
hold时间在小于80s左右时(如果按照RTO最大5000ms,重传16次计算的话,5s*16=80,实际小于80),重传次数都是16次。
重传次数取决于Hold时间,Hold时间越长,重传次数越多,如果Hold时间设置到最大65535,理论上将永久重传。
拓 扑表-不同于OSPF真正意义上的完整拓扑表,因为它并没有保存整个网络拓扑的副本。邻居间会通过互相update形成该拓扑表。这个表类似于show ip rip database看到的内容,共同点在于都是DV协议,发送和保存的都是路由条目。区别在于,EIGRP拓扑表保存多个邻居发送过来的条目及开销信息用于 预留备份下一跳(Back Next-Hop)。拓扑表结构和内容如下图所示:
路由表-EIGRP从上面提到的拓扑表中寻找到最小的FD(可行距离,后面会讲到)并提交到路由表中,但是不一定能提交成功,还得看管理距离(关于路由表的填充规则可以查看我之前发表的文章路由表填充规则)。
三张表的结构和内容如下: