至此,我们已经了解了诸多概念: RD (报告距离)、 CD (计算距离)、 FD (可行距
离)和FC (可行性条件) ,在此基础上继续了解EIGRP对于拓扑变化的应对方法想必是轻松愉快的。能够导致拓扑发生变化的因素有很多,比如去往某个网络的距离发生了变化,或者有个新邻居上线了并通告了某个网络。相对应地, EIGRP能够通过本地接口度量值的变化感知拓扑变化,或者通过从邻居那里接收到一个更新包、查询包、响应包、 SIA查询包或SIA响应包,并发现数据包中携带着关于某个网络的度量信息更新,以此方法来获知拓扑变化。对于邻居失效这种事件, EIGRP会对所有通过那个邻居可达的网络重新设置CD/RD值,将其设置为无穷大。无论导致拓扑发生变化的原因是什么,路由器都能马上确认在它自己的拓扑表中是否有可行后继所提供的新最短路径,也就是说, 是否有通过了FC检查的路由器所提供的新最短路径。如果有,路由器会执行以下步骤
 
1.路由器将提供了最小CD值的可行后继变为新的后继.
2.如果新后继的CD值小于当前的FD值,路由器将FD值更新为新的CD值; 否则保留当前值. 3.路由器更新路由表,将路由指向新后继. 
4.如果更新后继导致去往目的地的当前距离发生了变化,路由器向所有邻居发送更新包,通告去往该目的地的新距离。
 
上述行为在EIGRP中称为本地计算(Local Computation) ,路由器只需使用已经储存在拓扑表中的信息就可以执行这一过程,无需邻居路由器的介人。在这些行为的执行过程中,相关路由一直保持被动状态。
 
 但是,如果在检测到拓扑变化后,路由器发现目前提供了最短路径的邻居并不是可行后继,它就无法马上将这个邻居当作下一跳,因为这样做有可能会产生路由环路。因此,路由器会发起弥散计算(Diffusing Computation), 具体步骤如下所示.
 
1.路由器将路由表中的相关路由条目进行锁定,使其仍指向当前的后继:直到弥散计算完成且路由再次进人被动状态前,都不能移除这条路由,或者更改它的下一跳.
2.路由器按照当前的后继,将FD值设置为当前的(可能变大了的)CD值。如果当网络处于活动状态时,路由器仍须通告相应距离的话,它也仍旧会使用通过当前后继获得的当前CD值.
3.路由器将网络置于活动状态,并向所有邻居发送查询包。查询包中包含活动网络的前缀和路由器去往该网络的当前CD值。
 
每个收到了查询包的邻居都会使用查询包中通告的距离信息,来更新自已的拓扑表,并依此重新选择自已的后继和可行后继。对于邻居的处理结果,存在以下两种可能性:这个邻居仍然找到了自已的可行后继或者后继,能够提供最低开销的无环路径; 或者根据查询包中包含的信息,这个邻居不能再将它当前的后继作为最短路径了,并且它自己的邻居中,也没有能够提供最短路径的可行后继。 
 
在第一种情况中,如果邻居仍有自己的后继,它会发回一个响应包,并在其中指明自已去往该目的地的当前距离(有必要的话,它会执行自已的本地计算)。这时邻居不必介人到弥散计算中,因为它本身不需要把这个网络置为活动状态。也正因为这一点,弥散计算在这个邻居这里就截止了,不会扩散到更远的范围中。 
 
在第二种情况中,这里邻居需要让自已也参与到弥散计算中,它会发出自已的查询包,并在其中通告通过当前后继的当前距离。这样一来,一波又一波的查询包会在受到拓扑变更影响的网络范围中扩散。网络中没有受到拓扑变更影响的部分将不会参与到弥散计算中来。与其说这种行为揭示了EIGRP的技术原理,不如说在某种程度上,它更印证了EIGRP的营销宣传“部分、边界更新”:每个EIGRP数据包中只包含变化了的信息(部分),并且它只在受到影响的网络部分中传播(边界)。 
 
当路由器将某个目的地置为活动状态,并向邻居发送查询包后,它必须等待接收所有邻居返回的响应包。在那之前,相关路由会持续维持活动状态,并且路由表中的条目也无法更改。只有当接收到所有响应包后,路由器才能将相关路由重新置为被动状态,并从通过了FC检查的邻居中,选择提供了最短路径的邻居;然后根据这个邻居提供的CD值,重新生成FD值。这时路由器才能最终更新路由表中的相关条目。如果这台路由器是由于收到了一个查询包才变为活动状态的,这时它会开始发送自己的响应包,可能还会发送更新包,因为直到这时它才确定了自已去往目的地的距离; 否则的话,路由器只发出更新包。
 
有一点值得单独提出来,更新包、查询包、响应包、 SIA查询包和SIA响应包中包含的最重要的信息其实永远都只是发送方去往某个目的地的当前距离;用来告知接收方,数据包发送方去往目的地的距离,有时还要求接收方的响应(比如查询包和SIA查询包) 。 至于这些数据包会不会导致接收方将某个目的地置为活动状态,只取决于消息中的信息对于接收方选择最短路径的影响,以及为接收方提供最短路径的邻居是否能通过FC检查。
 
大家普遍认为如果当前后继失效了,总是有一个可行后继(如果有的话)会被提拔为后继。不过这种说法并不完全正确。再次考虑上一篇文章图一所示拓扑,假设它维持在例中最后的状态。对R1来说,去往LAN的FD值仍为2048,当前的最优路径是由R2提供的, R2作为后继,它的CD值是2560。 R1将R3看作可行后继,因为它的RD值为1280,这个值小于FD值(2048), R3的CD值是5120。注意, R4实际上提供了一条优于R3的路径, CD值为4096,但由于R4的RD值是3072,没有通过FC检查, 因此R1也就不会将R4看作是可行后继。 
 
如果R1和R2之间的链路断开了,通常我们认为R1会首先查看有没有可以使用的可行后继一而它也这样做了;它找到了R3,将R3提拔为后继,并在路由表中将去往LAN的路由指向R3。可是这并不正确。如果R1单纯地满足于R3提供的路径, 那它将会使用一条可用但并不一定是最短的路径,也不会试图寻找一条更短的路径。 因此EIGRP的真正做法如下所示。 
 
■ 当EIGRP检测到拓扑变化时,它首先会在拓扑表中记录这个变化;如果它是通过接收EIGRP消息获知了拓扑变化,它会对通告了这个变化的邻居更新 RD值和CD值;如果它是通过感知链路度量值的变化获知了拓扑变化,它会 对受到这个变化影响的邻居,更新RD值和CD值。
■ 从通告了这个网络的所有邻居中, EIGRP会根据更新的CD值,找到提供了 最小CD值的邻居。这一步并不涉及FC检查。
■ 只有当找到了提供最小CD值的邻居, EIGRP才会确认这个邻居是否满足FC 的要求,是否是可行后继。如果是的话, EIGRP会将其提拔为后继,并马上 开始将它作为下一跳来使用。但如果邻居不满足FC的要求, EIGRP会将路 由置为活动状态,然后发送查询包,请求它的邻居们帮它找到最优路由。
 
换句话说, EIGRP与其他路由协议一样,总是会试图选择去往某个目的地的最短路径;
但在真正使用这条路径之前, EIGRP还会确认它是否满足FC的无环要求。如果满足的话,EIGRP将会使用这条路径;如果不满足的话, EIGRP将会把这个目的地置为活动状态。
 
接下来看下例,其中展示了当R1-R2链路断开后,图1中的网络如何应对这一拓扑变化。
 
ipv6路由表显示到LAN的下一跳为R2
 
 
在eigrp拓扑表中,R2标记为后继,R3为可行后继,R4不显示,因为它不满足FC,
 
 
使用all-links关键字,也可以显示R4,但从(CD/RD)值可以明显看出R4不满足FC。而R2和R3满足
 
 
下边这条命令用来查看eigrp的DUAL FSM动作
 
 
在s1/0接口关闭后,注意R2的丢失在拓扑表中被表示为就像R2通告了无限度量。R1在拓扑表中对这个目的计算所有邻居条目,并确定当最小距离(Dmin)为4096时,下一跳为R4,而R4不匹配FC,这就是debug输出中"not found"注释的原因。“not found”显示出的地方与 FE80::4 这行没有真正的关系。(这只是debug输出混乱)
FS(可行后继)
 
 
因为提供最低开销路径的邻居不满足FC,R1进入活动状态,发出查询包,并期望得到答复
 
 
R3回复:它不受R1/R2链路故障的影响。所以 CD/RD 与已存储的相同
 
 
R4回复:它不受R1/R2链路故障的影响。所以 CD/RD 与已存储的相同
 
 
现在已经收到了所有回复,R1可以自由地重置FD并选择提供提供最小CD的任意邻居,显然,是R4.“RT installed”显示路由和下一跳已经被装进了路由表
 
 
下面的输出显示FD已被重置并更新到新的最小CD-4096。下一跳为R4的路由也装进了路由表中,注意R3被留下了,作为可行后继,从未被提升为后继角色。
 
 
 
 
 
 

EIGRP-11-弥散更新算法-EIGRP中的本地计算和弥散计算的更多相关文章

  1. EIGRP-12-弥散更新算法-DUAL的FSM(*没写完)

    FD (可行距离).后继和可行后继.本地计算和弥散计算(随着查询包的发出而扩散,随着响应包的接收而收敛)一到目前为止介绍的这些机制能够使路由器有效地计算出去往某目地的新路径,只要在整个弥散计算中不再出 ...

  2. EIGRP-9-弥散更新算法-拓扑表

    弥散更新算法(DUAL)是一个收敛算法.它代替了其他距离矢量协议使用的Bellman-Ford 算法.路由环路.甚至是在协议完全收敛前出现的瞬时环路.都会对网络性能造成不良影响.为了防止环路的形成.D ...

  3. EIGRP-10-弥散更新算法-计算距离,报告距离,可行距离和可行性条件

    对于某个目的网络,EIGRP持续关注它的各种距离参数.EIGRP使用复合度量参数,不过为了简化,这里使用一个没有单位的数值.同样出于简化,这里的EIGRP路由器都不使用水平分割.

  4. EIGRP-13-弥散更新算法-停滞在活动状态

    如果一台路由器参与到了针对某个目的地的弥散计算中(即将相应路由置为活动状态,并发送查询包),它必须首先等待所有邻居都返回响应包,之后它才能执行自已的弥散计算,接着选出新的最优路径,最后开始发送自已的响 ...

  5. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  6. How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)

    How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新) 重要通知: 最近开题报告已差不多告一段落, ...

  7. iTunes 11.2更新下载:改善播客阅读

    昨日,苹果公布了iTunes 11.2更新,新版别改善了播客阅读的方法,让用户能够在新的"未播映的"标签中疾速找到没有赏识的单集,其他功用包括主动删去现已播映的单集,并可在&quo ...

  8. PowerDesigner如何将设计的表更新到数据库中

    前言: 软件开发的过程中,将设计的表更新到数据库中是一件繁琐的事情,使用好工具,能够事半功倍. 环境介绍:Oracle 11g x64 前期准备: 1.PowerDesigner工具(本人是32位的) ...

  9. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

随机推荐

  1. zookeeper实现分布式锁总结,看这一篇足矣(设计模式应用实战)

    分布式锁纵观网络各种各样的帖子层出不穷,笔者查阅很多资料发现一个问题,有些文章只写原理并没有具体实现,有些文章虽然写了实现但是并不全面 借这个周末给大家做一个总结,代码拿来就可以用并且每一种实现都经过 ...

  2. Unity实现精灵资源动态加载

    private Sprite LoadSourceSprite(string relativePath) {         //把资源加载到内存中         UnityEngine.Objec ...

  3. Unity 游戏框架搭建 2019 (四十八/四十九) MonoBehaviourSimplify 中的消息策略完善&关于发送事件的简单封装

    MonoBehaviourSimplify 中的消息策略完善 在上一篇,笔者说,MonoBehaviourSimplify 中的消息策略还有一些小问题.我们在这篇试着解决一下. 先贴出来代码: usi ...

  4. 【JavaScript数据结构系列】07-循环链表CircleLinkedList

    [JavaScript数据结构系列]07-循环链表CircleLinkedList 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识循环链表 首节点与尾节点相连的,就构成循环链表.其 ...

  5. 一元三次方程组求解 luogu P1024

    题目传送门 首先,要明确题目信息,f(x1) * f(x2) < 0, 则一定存在实数根在区间(x1, x2).且所有的根都在[-100, 100)之间.根与根的绝对值之差 >= 1 那么 ...

  6. [Axure教程]0003.元件的触发事件

    Axure RP 的每个元件都有着自己独有的和一些公共的触发事件,在不同的情况下触发不同的事件. 这里我们就以上图中文本输入框为例 A.改元件已使用的触发事件 [1].文字改变时:当一个元件内的文字改 ...

  7. ArrayList及List的常用方法

    ArrayList package com.aff.coll; import java.util.ArrayList; import java.util.List; import org.junit. ...

  8. 用Python做词云可视化带你分析海贼王、火影和死神三大经典动漫

    对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.今天小编利用Python大法带大家分析一下这些神作 ...

  9. Ratel源码-C/S事件梳理

    一.Ratel介绍 Ratel 是一个可以在命令行中玩斗地主的项目,可以使用小巧的jar包在拥有JVM环境的终端中进行游戏,同时支持人人对战和人机对战两种模式,丰富你的空闲时间! 二.玩法Demo 三 ...

  10. jchdl - RTL

    https://mp.weixin.qq.com/s/gNN2eiJnr9N02xdZVQceDQ   ​​   相较于GSL层对物理连接的建模,RTL层提高了一个抽象层次: 把物理的触发器提取为抽象 ...