如果一台路由器参与到了针对某个目的地的弥散计算中(即将相应路由置为活动状态,并发送查询包),它必须首先等待所有邻居都返回响应包,之后它才能执行自已的弥散计算,接着选出新的最优路径,最后开始发送自已的响应包。因此,如果路由器发送处查询包,并且这个查询包导致它的多个邻居都将路由置为了活动状态,那么这台路由器现在就不仅要等待它自已的活跃邻居,还要等待邻居的邻居。如果邻居的邻居没有响应,那么邻居就不能执行自已的弥散计算,也就不能向这台路由器返回响应包,也就是说这台路由器也不能执行自已的弥散计算。如此扩展下去,一台处于活动状态的路由器会依赖于所有由于它的查询包而进人活动状态的路由器。在这些链路中,只要有一台路由器(无论出于什么原因)没有发送响应包,都会导致所有依赖于它的路由器延迟自已的弥散计算时间,可能永远无法完成自已的弥散计算,最终无法收敛。
EIGRP邻居路由器有多种原因无法发出响应包,现在把常见原因总结如下:
■ 由于邻居路由器的CPU超负荷运转,导致它无法及时回复响应包,或者根本无法处理所有人站数据包,其中包括EIGRP数据包;
■ 由于链路上的传输质量不良,导致数据包丢失;
■ 由于低带宽链路的拥塞导致数据包延迟或被丢弃;
■ 由于网络拓扑过于庞大或过于复杂,导致查询范围过大,或者导致单条链路或单个节点的故障波及了太多网络前缀。
处于活动状态路由器的相互依赖关系,在某种程度上是EIGRP的致命弱点。因此EIGRP实施了多个机制来应对这一问题。
当一台路由器初次发出查询包时,这条路由的活动计时器(Active Timer)就开始计时了。活动计时器的默认值是3分钟,工程师可以将它设置为1-65535分钟之间的任意值,也可以在router eigrp配置模式下,使用命令timers active-time将它设置为无限期。如果在活动计时器超时后,路由器还没有收到所有它所等待的响应包,那么 这条正在查询的路由就处于SIA (停滞在活动状态)状态中。路由器这时会从邻居表中移除那些没有响应的邻居,从而导致它们之间的邻接关系断开;弥散计算会认为这些邻居回复了一个无穷大的度量值。
EIGRP中的SIA状态非常糟糕,而且通常难以诊断。在最糟糕的情况下,一台未响应的路由器能够导致大范围网络无法在活动计时器规定的时间内收敛。此外, SIA 状态导致的邻接关系丢失能够引发网络的不稳定性,因为这样一来,通过那个邻居学到的所有网络都会被冲刷掉,只有等Hello间隔后,邻居关系重新建立起来之后,路由器才会再次学到这些路由。
在最初的EIGRP部署环境中解决SIA状态带来的问题尤为棘手,因为如果一个邻居在活动计时器超时前,都没有发送响应包,路由器就会断开与这个邻居之间的邻接关系, 即使这个邻居本身并不是使它进人SIA状态的根本原因。很显然,这样做可以使路由器摆脱SIA状态,但同时这种做法也惩罚了一个可能无辜的路由器,并且对于定位真正的故障点毫无帮助。为了能够尽量牵制和定位真正的故障点,即影响查询包/响应包无法正常交换,导致弥散计算一拖再拖;最新的EIGRP实施方案中使用了SIA查询包和SIA响应包。
如果当活动计时器规定的时间过去了一半,一个邻居还没有通过自已的响应包对 路由器发出的查询包做出响应,路由器将会向这个邻居发送SIA查询包o SIA查询包 所包含的意思是“你还在处理我的查询包吗”。如果邻居能够接收并处理这个SIA查 询包,它将会马上以SIA响应包作为响应o SIA响应包所包含的内容可以是“是的, 我仍在等待我的邻居向我发送响应包”,也可以是“不,计算已经完成;这是对于这个 目的地,我的当前度量值”。无论是哪种内容,邻居都会马上发送SIA响应包,并将 其当作对SIA查询包的响应;对于回应SIA查询包这件事来说,没有什么好等的。收到SIA响应包后,路由器会重置活动计时器,为弥散计算提供更多的时间o SIA查询 包最多可以发送3次,每次都是在经过了活动计时器规定时间的一半时发送。如果路 由器发出了第3个SIA查询包,也收到了第3个SIA响应包,弥散计算还没有完成,那么当再次经过了活动计时器规定时间的一半时,路由器会断开与这个邻居的邻接关 系。如果路由器没有收到邻居针对SIA查询包所返回的SIA响应包,那么在活动计时 器的后一半时间超时后,它也会断开与这个邻居的邻接关系。活动计时器的默认设置是180秒, 3个连续的SIA查询包能够把弥散计算的时间延长到4×90=360秒(90秒后发送第1个SIA查询包,每个SIA查询包可以争取到90秒的时间)。
如果两个邻居之间的通信没有出现问题的话,路由器会在发出SIA查询包后,几乎立即收到SIA响应包。然而如果两个邻居之间的通信存在问题,这个问题也很可能 就是导致普通查询包和响应包无法交换的原因,那么这个SIA查询包也很有可能收不 到响应。因此这两台路由器之间的邻接关系会被断开,它们之间的连接很可能就是导 致SIA状态的根本原因。
下例展示了路由进人SIA状态的案例。3台路由器串联在一 起,路由器X连接路由器Y,路由器Y连接路由器Z (路由器Z没有出现在拓扑中),它们都运行IPv4 EIGRP。活动计时器保留默认设置:3分钟。拓扑中每个接口的保持间隔增加为10000秒,路由器Y连接路由器Z的接口上应用了一个ACL,用来丢弃所有人向数据包。路由器x上的本地环回接口被关闭后,路由器x向路由器Y发送 查询包,路由器Y继而向路由器Z发送查询包。但由于ACL发挥作用,路由器Y无 法收到路由器z发出的响应包,从而使这条路由进人SIA状态。下面这个案例记录了 EIGRP对于这个问题的处理过程。
注意,当一个目的地处于活动状态时,路由器仍可能接收对于这个目的地的查询包。考虑下图所示拓扑。
图中所示的环境是这样的。
■ R1直连着一个LAN网络。
■ R2和R3都会将R1作为去往LAN的下一跳, R1的CD值是0。
■ R2和R3都不会把自已作为去往R1 LAN的可行后继。
■ R1上的LAN接口关闭后,R1会向它的所有邻居发送有关这个网络的查询包, 并在其中通告一个无穷大的距离。假设R1向其邻居发送数据包时的延迟很大,这时R2首先收到了这个查询包。
■ 收到这个查询包后, R2不再将R1作为后继(R1现在无法通过R2上的FC检查了),同时R2又没有可行后继,这时它会进人活动状态,并向R3发送自已的查询包。
■ 同一时间,假设R3收到了R1的查询包。对于R3来说,情况也是一样的。 R3也会进人活动状态,并向R2发送自已的查询包;这时R2的查询包已经传输在R2-R3链路上了。
■ 最终的结果是: R2和R3都向对方发送了各自的查询包,它们也都会收到一 个查询包,查询的是已经处于活动状态的目的地。
在路由器X上的环回口关闭后,它向它的邻居路由器Y发送了一个查询包。注意查询的源是Local。“Remaining replies”中的小写字母r表示它期望从10.0.12.2(Y)上收到回复但还没收到。直到SIA-Query发送之前,sh ip eigrp topology 和 sh ip eigrp topology active 的输出完全一样。加上关键字 active 自动限制仅输出活跃状态条目。
在路由器Y上,使用后继源的查询源汇报的路由。这里在“Remaining replies”那里也有小r标志。表示期望从Z收到回复,但还没收到。由于Y和Z之间的ACL,此回复永远不会到达。条目标题中的“Q”标志表示已经为这条路由发送了查询,但尚未确认(也卡在了ACL上)。
在活动计时器过去一半以后,X和Y都将试着找出他们尚未回应的邻居是否仍在处理查询。所以它X和Y向没有回复的邻居发送SIA-Query
X上的“retries(1)”表示已经向Y发送了一个SIA-Query,并收到了回复。这在很多地方都可见:作为一个收到SIA-Query 回复的结果,Infinity/Infinity via 10.0.12.2的拓扑表条目被添加到 show ip eigrp active 的输出中。并且这个条目的小r标志表示仍然期望收到规律的回复,没有“s”标志表示收到SIA-Query回复。和后边的Y上的输出比较一下。
在Y上,也可见向Z发送了一个SIA查询。然而这个SIA查询没有回复。sh ip eigrp topology 的输出中,Z被标记为 SIA-Stuck。在sh ip eigrp topology active 的输出中,Z的拓扑表条目表示不仅期望一个回复(“r”),还期望一个还没收到的SIA-Query回复(“s”)。“q”标志表示已经发送了一个SIA-Query但还没收到ACK(因为ACL)。
最后,在下一个一半的活动计时器间隔之后还没收到SIA回复,Y决定断开和Z的邻接关系。
有些资料说正是上面这种情况才会导致路由进人SIA状态,并且它们认为这是个死局。路由器将一个目的地置为活动状态,表示它还没有完成自已的弥散计算,还不能发送响应包,这会导致两台或更多台路由器相互等待,无法从对方那里收到响应包。这是对实际情况极大的误解,这种情况并不会导致路由进人SIA状态。回想一下,当路由器将一个目的地置为活动状态后,它会发送查询包,并在其中表明拓扑变化后,自已去往目的地的当前距离,而正是这个网络变化导致路由转换为活动状态。如果在活动状态期间,路由器 收到了另一个针对该目的地的查询包,它会马上回复一个响应包,并在其中指明自已去往 目的地的距离,这与它在自已的查询包中通告的距离相同。换旬话说,路由器只是再次重 申了一遍它早已在自已的查询包中通告过的距离。并没有类似死局的情况产生。
根据上图的描述,在R2和R3向对方发送了查询包(查询的是已经处于活动状 态的路由)后,它们会马上再向对方发送响应包,并在其中通告自已去往目的地的当 前距离,这个距离它们已经在各自的查询包中通告过了,也就是无穷大。在这之后, R2和R3收到了各自等待的响应包,这时它们可以完成各自的弥散计算,计算结果是 它们都没有去往该目的地的备份路径,因此它们会在向Rl发送的响应包中,表明自 已去往目的地的距离是无穷大,这样就完全终结了弥散计算。
- EIGRP-9-弥散更新算法-拓扑表
弥散更新算法(DUAL)是一个收敛算法.它代替了其他距离矢量协议使用的Bellman-Ford 算法.路由环路.甚至是在协议完全收敛前出现的瞬时环路.都会对网络性能造成不良影响.为了防止环路的形成.D ...
- EIGRP-12-弥散更新算法-DUAL的FSM(*没写完)
FD (可行距离).后继和可行后继.本地计算和弥散计算(随着查询包的发出而扩散,随着响应包的接收而收敛)一到目前为止介绍的这些机制能够使路由器有效地计算出去往某目地的新路径,只要在整个弥散计算中不再出 ...
- EIGRP-11-弥散更新算法-EIGRP中的本地计算和弥散计算
至此,我们已经了解了诸多概念: RD (报告距离). CD (计算距离). FD (可行距 离)和FC (可行性条件) ,在此基础上继续了解EIGRP对于拓扑变化的应对方法想必是轻松愉快的.能够导致拓 ...
- EIGRP-10-弥散更新算法-计算距离,报告距离,可行距离和可行性条件
对于某个目的网络,EIGRP持续关注它的各种距离参数.EIGRP使用复合度量参数,不过为了简化,这里使用一个没有单位的数值.同样出于简化,这里的EIGRP路由器都不使用水平分割.
- Xamarin 2017.9.13发布更新
Xamarin 2017.9.13发布更新 Visual Studio 2017更新到15.3.4.其中,Xamarin.Visual更新到4.6.3.4;Xamarin.iOS更新到10.12.3 ...
- WeihanLi.Npoi 1.13.0 更新日志
WeihanLi.Npoi 1.13.0 更新日志 Intro 在 Github 上收到 Issue 收到网友反馈希望支持自动分 Sheet 导出,有兴趣的可以参考 Issue https://git ...
- ubuntu linux 13.04更新
首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 而后用gedit或其他编辑器打开: gksu gedit /et ...
- Windows Phone本地数据库(SQLCE):13、更新数据(翻译)
这是“windows phone mango本地数据库(sqlce)”系列短片文章的第十三篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的 ...
- LTE Module User Documentation(翻译13)——频率复用算法(Frequency Reuse Algorithms)
LTE用户文档 (如有不当的地方,欢迎指正!) 19 Frequency Reuse Algorithms(频率复用算法) 本节我们将描述如何在 LTE 仿真中使用频率复用(FR)算法.共有两 ...
随机推荐
- docker 学习(一)
1. docker介绍 1)docker的出现 Docker是诞生于2013年,是dotCloud的一个开源项目,基于Google推出的GO语言实现.遵从Apache2.0协议. 2)docker介绍 ...
- Linux的svn服务器搭建
最近把Linux上的一些服务器学习了一遍 我这里更新一下笔记——SVN服务器 我从其他博主上学习了一下——转载https://www.cnblogs.com/mymelon/p/5483215.htm ...
- 【Redis】Hash常见应用场景 - 电商购物车
电商购物车 以用户id为key 商品id为field 商品数量为value 购物车操作 [key(用户id),field(商品id),value(数量)] 添加商品 -> hset cart: ...
- C++98/11/17表达式类别
目标 以下代码能否编译通过,能否按照期望运行?(点击展开) #include <utility> #include <type_traits> namespace cpp98 ...
- java-五大内存图
jrm—Java虚拟机在进行程序运行时会向cpu申请一个内存约为10%左右,该内存被jrm分为5大区域 一:栈内存(stack)用来存储变量 当栈消失时,变量也随之消失.二:堆内存(heap)在Jav ...
- [Objective-C] 016_UI篇_UIView(上)
在我们使用app时屏幕上能看到的UI元素(按钮,列表,图片...),我们称之为视图,都是继承与UIView,它们通常有着位置,大小,背景颜色等属性,在appl中视图和窗口展示了应用的用户界面,同时负责 ...
- 五、Java - 集合
一.集合 Java 中的集合类存放于 java.util 包中,是一个存放对象的容器. 集合存放的是对对象的引用,对象本身还是存在于 JVM 堆内存中. 存放的是对象,即引用数据类型,对于基本数据类型 ...
- DC-8靶机writeup
nmap -sV 172.16.61.129 -A 看下端口信息 nid=1 ‘ 报错,存在注入,扔到sqlmap跑 sqlmap -u http://172.16.61.129/?nid=1 --d ...
- 记一次使用windbg排查内存泄漏的过程
一.背景 近期有一个项目在运行当中出现一些问题,程序顺利启动,但是观察一阵子后发现内存使用总量在很缓慢地升高, 虽然偶尔还会往下降一些,但是总体还是不断上升:内存运行6个小时候从33M上升到80M: ...
- Oracle数据库表被锁死的处理方法
(1)锁表查询的代码有以下的形式: select count(*) from v$locked_object; select * from v$locked_object; (2)查看哪个表被锁 se ...