至此,我们已经了解了诸多概念: 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
.png)
在eigrp拓扑表中,R2标记为后继,R3为可行后继,R4不显示,因为它不满足FC,
.png)
使用all-links关键字,也可以显示R4,但从(CD/RD)值可以明显看出R4不满足FC。而R2和R3满足
.png)
下边这条命令用来查看eigrp的DUAL FSM动作
.png)
.png)
在s1/0接口关闭后,注意R2的丢失在拓扑表中被表示为就像R2通告了无限度量。R1在拓扑表中对这个目的计算所有邻居条目,并确定当最小距离(Dmin)为4096时,下一跳为R4,而R4不匹配FC,这就是debug输出中"not found"注释的原因。“not found”显示出的地方与 FE80::4 这行没有真正的关系。(这只是debug输出混乱)
FS(可行后继)
.png)
因为提供最低开销路径的邻居不满足FC,R1进入活动状态,发出查询包,并期望得到答复
.png)
R3回复:它不受R1/R2链路故障的影响。所以 CD/RD 与已存储的相同
.png)
R4回复:它不受R1/R2链路故障的影响。所以 CD/RD 与已存储的相同
.png)
现在已经收到了所有回复,R1可以自由地重置FD并选择提供提供最小CD的任意邻居,显然,是R4.“RT installed”显示路由和下一跳已经被装进了路由表
.png)
下面的输出显示FD已被重置并更新到新的最小CD-4096。下一跳为R4的路由也装进了路由表中,注意R3被留下了,作为可行后继,从未被提升为后继角色。
.png)
- EIGRP-12-弥散更新算法-DUAL的FSM(*没写完)
FD (可行距离).后继和可行后继.本地计算和弥散计算(随着查询包的发出而扩散,随着响应包的接收而收敛)一到目前为止介绍的这些机制能够使路由器有效地计算出去往某目地的新路径,只要在整个弥散计算中不再出 ...
- EIGRP-9-弥散更新算法-拓扑表
弥散更新算法(DUAL)是一个收敛算法.它代替了其他距离矢量协议使用的Bellman-Ford 算法.路由环路.甚至是在协议完全收敛前出现的瞬时环路.都会对网络性能造成不良影响.为了防止环路的形成.D ...
- EIGRP-10-弥散更新算法-计算距离,报告距离,可行距离和可行性条件
对于某个目的网络,EIGRP持续关注它的各种距离参数.EIGRP使用复合度量参数,不过为了简化,这里使用一个没有单位的数值.同样出于简化,这里的EIGRP路由器都不使用水平分割.
- EIGRP-13-弥散更新算法-停滞在活动状态
如果一台路由器参与到了针对某个目的地的弥散计算中(即将相应路由置为活动状态,并发送查询包),它必须首先等待所有邻居都返回响应包,之后它才能执行自已的弥散计算,接着选出新的最优路径,最后开始发送自已的响 ...
- 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...
- How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)
How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新) 重要通知: 最近开题报告已差不多告一段落, ...
- iTunes 11.2更新下载:改善播客阅读
昨日,苹果公布了iTunes 11.2更新,新版别改善了播客阅读的方法,让用户能够在新的"未播映的"标签中疾速找到没有赏识的单集,其他功用包括主动删去现已播映的单集,并可在&quo ...
- PowerDesigner如何将设计的表更新到数据库中
前言: 软件开发的过程中,将设计的表更新到数据库中是一件繁琐的事情,使用好工具,能够事半功倍. 环境介绍:Oracle 11g x64 前期准备: 1.PowerDesigner工具(本人是32位的) ...
- Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...
随机推荐
- vagrant与vrtualbox的使用
1.先要安装 vrtualbox和 vagrant (以centos 7下面的为例): cd /opt wget https://download.virtualbox.org/virtualbo ...
- table动态添加的tr 其click事件在IE兼容模式中不执行 jquery 1.9 的live事件 和获取 first last
http://www.css88.com/jqapi-1.9/first-of-type/index.html#p=//www.css88.com/jqapi-1.9/last-child-selec ...
- chosen.jquery.min.js select2.js 弊端
chosen.jquery.min.js --将select放在页面最下方,会导致页面高度增加,最下方空白多出来 select2.js --点击select 但未选择,然后移出鼠标,发现其他文本框.关 ...
- 基于Netty包中的Recycler实现的对象池技术详解
一.业务背景 当项目中涉及到频繁的对象的创建和回收的时候,就会出现频繁GC的情况,这时就出现了池化的技术来实现对象的循环使用从而避免对象的频繁回收,Netty包下的Recycler就实现了这一功能.当 ...
- mysql事务与锁机制详解
一.事务 1.事务简介 (1)事务的场景 转账:一个账户减少,另一个账户增加.两个动作同时成功或者同时失败.就要开启事务. (2)事务定义 事务是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数 ...
- 最优化之凸优化之Bregman算法
本文介绍了Bregman迭代算法,Linearized Bregman算法(及在求解Basis Pursuit问题中的应用)和Split Bregman算法(及在求解图像TV滤波问题中的应用). 由于 ...
- uni-app运行到浏览器跨域H5页面的跨域问题解决方案
官方文档对跨域的解决方案推荐: https://ask.dcloud.net.cn/article/35267 更方便的解决方案 项目根目录直接创建一个vue.config.js文件,并在里面配置代理 ...
- vue中使用剪切板插件 clipboard.js
vue中使用剪切板需要借助一个插件,clipboard,使用方法还是很简单的,先下载,然后引入: npm i clipboard -S //引入 import Clipboard from 'clip ...
- 【QT】利用pyqt5实现简单界面
Topic: 利用pyqt5编写简单界面Env:win10 + Pycharm2018 + Python 3.6.8Date: 2019/4/29 by hw_Chen2018 ...
- [JavaWeb基础] 015.Struts2 表单验证框架
在web开发的过程中,我们经常要用到一些填写表单的操作,我们一般都要在提交表单信息的时候对表单的内容进行验证,struts2给我们提供了简单的实现接口,让我们可以很容易的对表单进行验证.下面讲解下最传 ...