EIGRP同IGRP一样是距离矢量路由协议,他们使用相同的综合metric计算方法,除此之外,他们有很大不同。
EIGRP有时候被描述为像链路状态路由协议的距离矢量路由协议。
EIGRP是一个nonperiodic,partial 和 bounded的路由协议。所谓nonperiodic意思是不是在一个固定的间隔发送更新;partial,更新只在网络发生变化时;bounded,更新只发送给受影响的路由。所有这些意味着跟传统的距离矢量路由协议相比,EIGRP只占用很少的带宽。使用命令 ip bandwid-percent eigrp 可以调整EIGRP占用某个端口带宽的百分比。
EIGRP另一个特点是不仅可以路由IP,也支持IPX和Appletalk。
EIGRP在计算metric时候,在IGRP计算结果上面再乘以256,以实现更小的粒度。
EIGRP协议栈由4部分组成:
- Protocol-dependent modules:完成基于各个网络协议的路由交换。
- Reliable transport Protocol:负责发送、接收EIGRP包。Reliable意味着传输有保障,并且按顺序。
- cisco私有的算法Reliable multicast (使用组播地址224.0.0.10)保证可靠传输,邻居收到一个组播包都会发送一个单播的确认。
- 在包中加入两组sequence number保证了包传输的先后顺序。发送者在包中写入顺序号,每个包依次递增;发送者同时在包内写入上一个从对方收到的包的顺序号。
- EIGRP有时会使用不可靠传输unreliable delivery。不需要ACK,没有顺序号。
EIGRP有5种包类型:
- Hello。组播、不可靠传输。
- Acknowledge(ACK)。没有数据的Hello包。单播、不可靠。
- Update。包含路由信息。当某个特定路由器需要需要update时,使用单播;当多个路由器需要时(比如网络产生变化)使用组播。可靠传输。
- Queries和Replies。被DUAL有限状态机使用。Queries可以为组播或单播,replaies始终为单播。均为可靠传输。
- Request。最早使用在路由服务器上,没有用。
如果一个可靠传输的组播没有收到ACK,路由器会以单播重传数据包到没有响应的邻居16次,之后确认邻居关系破裂。
几个timer:
- multicast flow timer。等待ACK期间,从组播转换为单播的时间。
- retransmission timeout(RTO)。单播之间的间隔。
- smooth round-trip time(SRTT)。传输一个包到邻居到从邻居收到这个包的ACK的间隔。以毫秒计算。针对每个邻居的multicast flow timer和RTO都是根据SRTT值计算出来的。
- 以上timer的具体计算方法都是厂商私有的。
邻居的发现、重发现:
- Hello time在多数网络环境中是5秒(减去一个很小的随机时间防止同步)。在点对多点接口(x.25, Fram Relay, ATM )环境中,速度小于等于T1,hello time为60秒。在接口模式下命令ip hello-interval eigrp更改默认hello time。
- 当路由器从邻居收到一个hello包时,包内有一个hold time。hold time告诉路由器收到下一个hello包之前最长的等待时间。默认的,hold time为hello time的3倍,即15秒或者180秒。
- 邻居表:
表中,H代表学习到邻居的先后顺序;interface 为收到邻居hello包的接口;hold为从邻居收到的hello包的hold time;uptime是自从邻居增加到邻居表的时间;如果路由器发出update、query或者reply,它会在其队列中保留一个副本,以便在RTO到期时再次发送,Q表明在队列中的包的数量;Seq是最近的从邻居收到的update、query或者reply包的sequence number。
几个术语:
- Adjacent,邻接。两个邻居间的逻辑连接,路由信息在其上交换。
- Feasible Distance, FD可行距离。路由器用其收到的邻居通告加上其到邻居的距离,形成了到达某个网络的距离。到达某个网络多条路径中,距离最短的就是可行距离。
- Feasible Condition, FC可行条件。一个邻居宣告到达某一目的地的距离小于路由器本地计算出来的可行距离FD。
- Feasible Successor,FS可行后继。如果一个邻居宣告的路由满足可行条件FC,那么这个邻居就成为可行后继。
- Successor,后继。到达每个网络的一个或多个FS将记录在topological table内,其中metric最小的将被选中放入路由表中。宣告这条metric最小的路由的邻居,就成了Successor。
- 如果想更改接口metric来影响EIGRP或者IGRP,尽量使用Delay。否则容易影响其他路由器或者出现其他状况。
DUAL 有限状态机:
- 如果路由器没有在运行diffusing计算,那么就处于被动状态(passive state)。
- 路由器将在以下input状况出现时,重新评估其FS
- 直连链路cost更改
- 直连链路状态更改(up/down)
- 收到update packet
- 收到request packet
- 收到reply packet
3. 评估的第一步是本地计算(local computing),在这一步里,到达某个目的地所有FC都会重新计算。可能的结果有:
- 拥有最小distance的FS跟Successor不一致,这种情况下,这个FS将成为Successor
- 新的distance比当前的FD小,则这个FD会被更新
- 如果distance跟现有的distance不同,路由器会向所有邻居发送更新
- 当路由器在进行本地计算时,其状态任然是passive,如果发现FS,会向所有邻居发送更新,状态不变
4. 如果路由器在topology talbe内找不到FS,路由器会进行diffusing计算并且变成活动状态(active state)。在路由器进行diffusing计算(active state)时,路由器不允许:
- 更改Successor
- 更改它正在传播的路由的distance
- 更改路由的FD
- 对这条路由开始另外一个diffusing计算
5. 路由器以对所有邻居发送query来开始diffusing计算。query内包含本地新计算出来的到达目的地的distance。每一个收到此query的邻居会进行本地计算。
- 如果邻居有一个或多个到某个目的地的FS,它会发送reply回去。这个reply包含这个邻居本地计算出来的到达那个目的地的最小distance。
- 如果邻居没有到达某个目的地的FS,那么邻居自己也会变成active状态并且开始diffusing计算。
6. 路由器对每个发送了query的邻居会设定一个reply status flag来跟踪相应的邻居。在路由器收到所有query的reply后,diffusing计算结束。
7. 有些情况下,路由器收不到reply。在diffusing计算开始时,路由器会设定一个3分钟的active timer,在active timer过期前都没有收到reply,这条路由会被定义成stuck-in-active(SIA)状态。没有响应的邻居将会从邻居表中删除,diffusing计算将认为这个邻居回复了一个infinite metric。使用命令timers active-time更改或者禁用active timer。
8. 在diffusing计算结束时,路由器将FD设定为无限大,以保证所有从邻居收到的有限大的distance都满足FC,从而成为FS,然后参与Successor的选举。 #### 所有reply收到之后才会选举Successor。####
9. 使用命令debug eigrp packets可以查看EIGRP的包传递,使用命令debug eigrp packets query reply update可以查看除Hello和ACK之外的包通讯。
总结一下Diffusing算法:
- 任何一个input时间发生时,进行本地计算(local calculation);
- 如果找到一个或多个FS,以最低cost的为Successor;
- 如果没有找到FS,则转入active状态,向所有邻居发送query寻求FS;
- 保持active状态直到收到所有query的reply或者active timer超时;
- 如果diffusing计算没有找到FS,则宣告目的地不可达
EIGRP包格式:
- IP协议88,最大包长度一般为IP包的MTU 1500 octets;
- Version。自EIGRP发布以来,尚未更改过;
- Opcode。定义了EIGRP包类型;
- Checksum。计算整个EIGRP包,不包括IP包头;
- Flag。只用到两个flag;
- Sequence。用于RTP,表明顺序号;
- ACK。最后从邻居听到的顺序号。一个Hello包与一个非0的ACK,将被认为是一个ACK包,而不是Hello包。一个包如果是单播,那么ACK只能为非0,因为acknowledge不可能是组播;
- Autonomous System Number。EIGRP域的区分数字;
- TLV=Type/Length/Vlaue。此项不仅包含路由条目,还提供字段用于管理DUAL process,组播顺序,IOS软件版本;每一个TLV包含了一个2 octets的Type和2 octets的长度字段;
- EIGRP Parameter TLV
- IP Internal routes TLV
- Next Hop: 下一跳IP地址(允许是或者不是产生这条路由的路由器地址);
- Delay: 沿途delay的总和,以10微秒为单位;IGRP使用24 bit delay字段,EIGRP使用32 bit delay字段刚好包含了EIGRP metric里面乘以的256;Delay 字段0xFFFFFFFF代表不可达路由;
- Bandwidth:=356*10,000,000/沿途最小带宽;
- MTU:沿途最小MTU(从未用过);
- Hop Count:0x01与0xFF之间的数字;
- Reliability:0x01与0xFF之间的数字,反映沿途总的出口错误率,0xFF代表100%可靠的链路;
- Load:0x01与0xFF之间的数字,反映沿途总的出口负载,0x01代表最小负载;
- Reserved:保留字段,总是0x0000;
- Prefix Length:目的地址掩码;
12. IP external routes TLV:
- Originating Router:重发布外部路由到EIGRP自制系统的路由器的IP地址或者路由器ID;
- Arbitrary Tag:用于装载route map的tag;
- External Protocol Metric:外部路由协议metric,用于与IGRP重发布;
- External Protocol ID:表明从哪个外部路由协议学习到此路由;
- Flag:目前只有两个flag,设定8bit里面最右边的(0x01),代表这个是外部路由;设定第二bit(0x02),代表此路由为默认路由候选;