EIGRP的思维导图

如图,我想采用一种全新的“框架式”教学法,或者叫“盖楼”,旨在利用抽象的外部接口,分类分层地介绍各个机制之间的关系。其实任何学习到最后都是这个样子,比如数学,刚开始你要认识各种数学定理并且证明他们,之后你就能灵活运用这些定理去解决更高层的问题,而不用再去思考那些定理的证明方法,实现“屏蔽底层的复杂度”。如果你学完一个系统的逻辑机制后仍然在担心,会不会发生某一种情况让这个系统故障?呵呵,那只能说你是死记硬背的。

EIGRP是极少数的几个思科私有协议之一,在时间顺序上介于RIP与OSPF之间。EIGRP本是一款优秀高效的动态路由协议,但它的现状却不乐观:,由于现实因素,全球的园区网、骨干网领域基本上被OSPF,IS-IS和再上面的BGP给垄断了,只剩下地球角落里的一点点企业仍然在使用它。

不得不说EIGRP有点可怜,因为它本身有着其他协议无法比拟的优点:

1.隶属于高级距离矢量协议(其实是高于)。它由距离矢量和链路状态两种路由协议混合而成:既像前者那样,与它的邻居交换更新信息;也像后者那样,保存着一个拓扑表。

2.网络收敛速度于所有协议中最快,出动查询同时保存备份路径,主链路断掉后备份立刻顶上。

3.能保证99.99%无环路,依赖于可爱的DUAL算法。

4.支持不等价负载均衡。

下面正式进入EIGRP原理的系统大厦:

首先,进化自RIP的EIGRP依然是通过“口口相传”的形式了解到去往每个网段的最佳邻居。注意,这里的寻路原理类似生成树但不同于ospf,与前者的唯一不同在于,一个是线与线之间一个是点到点之间的寻路,而后者是在整个网络的“线路图”中通过dijkstra算法求得最短路径,也就是地图导航中使用的算法。这些区别一定要弄清楚。

然后提到视角问题。EIGRP开创了“发现邻居”的先河,保留了一份前无古人的邻居表。邻居表中存放着与自己形成邻接关系的邻居,提醒一下,邻居就是物理位置上相邻而邻接指同属一个eigrp域。如果说RIP的视角只局限于每个路由器自身,那么EIGRP的视力可以看到周围所有的邻居设备,从而增强了网络的可靠性和安全性。

视角范围的大大提升(当然OSPF拥有更大的视角)直接避免了RIP难以避免的“很愚蠢”的环路,即一条链路两端永不停息的来回交换着同一个数据包,就像两个邻居在赌气一般。因为如果在某个网络的更新包中看到邻居的下一跳竟是自己,那么果断扔掉(类比BGP的AS号)。除此之外,EIGRP自己的水品分割和DUAL算法也给这种环路宣告了死刑。

说到邻居,自然就引入了hello消息。hello消息的三个(也可以是两个)作用是发现、建立和维护邻居关系。由于需要间隔性的维护,hello消息自始至终都一直存在着,占用着一点带宽。邻居关系的维护构成了EIGRP最底层的独立机制,之所以叫独立是因为其与上面的其他机制互不影响(除非关系中断)。所以,学会了hello包之后再学习网络收敛机制就不用考虑hello的工作原理了,更不用担心hello机制的影响让上层机制产生bug!

EIGRP里面的所有机制包括底层机制,他们正常工作的根本前提是EIGRP程序本身完好无损!!之后提到的环路、短路、次优等bug都是EIGRP程序(机制)造成的,而如果程序本身被串改或染上病毒,那么就不是改善机制所能解决的了。针对这个问题,一个思科内部员工建议,通过思科路由器的操作系统(IOS)来监控这个可能出现的bug,一旦发现则禁用EIGRP,并且向邻居发送一个goodbye消息,意指“我已经挂了”。这是个开创性的发明,那个提出者也获得了百万美金,如果说EIGRP是一款软件,那么goodbye则是一个游离在应用软件与操作系统之间的“高权限”程序。

接下来到了EIGRP的精髓。EIGRP的下一张表是拓扑表。拓扑表是最重要的一张表,它是EIGRP核心算法DUAL的数据库,就好比cpu与内存的关系。拓扑表中存放着所有邻居发来的路有信息,注意,拓扑表中所有条目最好按照不同的目标网络来分类而不是按照不同的邻居,即抵达同一个目的地的所有路径的唯一区别是拥有不同的下一跳,这样有利于理解之后的选路机制。

DUAL(弥散更新算法)中的防环核心公式是:FC=(AD

细心的同学会发现,这个公式是有瑕疵的。在默认情况下(即不做任何修改的情况),局域网中的环路都将被避免。与此同时,有些开销足够大的非环路次优路径因为不满足FC公式而被排出备份路径。

针对这个问题,思科提供了两种解决方案。第一种,利用EIGRP自身的查询机制,当拓扑表中没有备份路径而此时主路径失效后,路由器会主动向邻居发送查询消息,这时那些曾经被“看不起”的次优路径就会被高度重视,变成最佳路径。第二种,手动修改度量值参数(即使连路两段度量值不一样也不影响邻接关系)使总度量值满足公式,这是目前最完美的解决方案,因为它从根源上解决问题,避免了“为了debug衍生出新bug”的尴尬。

再然后到了EIGRP的故障倒换机制,也是EIGRP独一无二的地方。大家研究故障倒换一定要养成“钻牛角尖”的习惯,虽然学IT最忌讳走极端,但是他是不包含网络安全这个领域的。好,在各种想象的应用场景中,只要是链路就将它幻化成含有二层交换机的多分支网段,只要是一个部门网段就让他有多个网关路由器。

时间顺序上,当一个网段或其中一根链路出现故障后,相关的路由器就会立刻知道并且从拓扑表中搜寻有无备份路径,如果没有则被触发一个错误报告(路由更新)给所有的邻居“从我这里无法到达这个网络”,同时再向所有邻居发送一个查询消息以查找可到这个网络的邻居。收到报错包的路由器自然认为这条路径已断,然后选择备份或者发送查询。

不知是否发现,这个查询机制又带来一个问题:FC本来就是为了避免环路才排除那些路径,现在查询机制又直接接受那些路径,如果她们真的是环路该怎么办?答案是:这种情况在现实生活中很少出现,通常全互联的企业网络就已经将环路路径远远甩在备份路径的考虑之后,也就是说通常备份路径是足够多的。如果极端情况,也就是变态的网络规划下出现了这个环路,那不好意思,只能人为的去避免环路,比如利用stub和ACL。

然后问题又来了:那这个查询机制还有个卵用?!哎,怎么说呢,送给大家一个哲学吧:程序员并不聪明,大多数情况只会按部就班按照人类的逻辑开发程序,有时也会把生活中的一些错误习惯带到协议中,因为过于追求算法的完美和精炼的代价是消耗算法的逻辑框架,虽然节省了网络开销但不利于人的学习思考也不能带来等价的商业价值。

更有甚者,有些知识点,比如不等价负载均衡的值,是个CCIE一眼就能看出其设计的很不尽人意,完全可以用更简单的方式表达,但思科非要这么做,故意将其复杂化,让外行人(比如客户)看不懂以体现其技术的深奥!路由器交换机配置的命令行完全可以通过图形化界面代替,鼠标点点选选就可以完成的配置非要设计的像编程一样枯燥难懂,思科早年也提出过这样的概念但是居然被整个行业一票否决…无奈之余我只能将之看成是行业的恶性保护以及标准化的潜规则。试想,当人人都轻而易举学会图形化的网络配置,购买一款人性化软件就能解决所有网络问题,那还要我们CCIE做什么?!不知道大家听明白了没?。。

既然提到了,就顺便说说不等价负载均衡吧.有一个知识点原来困惑了我很久,后来才发现就是个笑话,那就是不等价负载均衡值的计算公式=[FD/FDmin]

1(向下取整再加一,也就是向上取整).后来看到不负均的省查条件里有一句话叫:不等价负载均衡值乘以FDmin必须大于次有路径的FD.我想了半天想不明白,最后在草稿纸上重新推导了一遍这个公式发现,原来这句话已经由前面的计算公式决定了!一句废话为啥还要写在上面啊,再说这个值本来也没什么用!哎说了这么多我也不需要再说什么了.

很多初学者抱怨说,不仅不负均值是个鸡肋,它本身也无法根据特定网络筛选实际需要均衡负载的路径.前者我认同but后者其实可以灵活调整因为你忽略了它的一个审查条件,就是要满足坑爹的FC——那个配合查询机制一起防环的战斗鸡肋.你可以手动或用偏移列表修改路径度量值让不想负载的路径被排除在外即可,也可用不负均值来筛选稍麻烦一点.

吐槽了这么多EIGRP的缺点,最后还是回到主题吧,谈谈网络的层次化架构.虽然ospf和is-is将之发扬光大,但eigrp作为”口口相传路由协议”的代表利用汇总也可以实现层次化、部门化(区域化)的设计:核心层连接不同部门,以部门为单位的局域网各自在同一个大的主类网或子类网中,部门边界做汇总送给核心层,从而有效提高了网络的规划管理能力和对故障的防御力.

网络层次化架构也映射了文章开头提到的学习方法——框架式学习.虽然随着文章的深入这栋大楼不知倒了多少层,但仍然希望它依旧不影响作者和读者的热情.本文没有具体的参数,只有满满的逻辑,因为我的初衷是献给大家一个全新的看待问题的角度,希望大家能理解它,不理解也没关系,这种奇葩的视角本来就无法普及.总之要想全面了解EIGRP的具体参数和更详细的原理如关于三张表四条公式五个消息的还请扭正三观并transfer

to正版书籍~

【★】EIGRP终极解析!的更多相关文章

  1. C++11引用临时变量的终极解析

    工作中遇到一个引用临时变量的问题,经过两天的学习,私以为:不仅弄明白了这个问题,还有些自己的独到见解. 这里使用一个简单的例子来把自己的学习过程和理解献给大家,如果有什么问题请不吝指正.   **** ...

  2. bgp选路原则【第二部】

    面向逻辑谈bgp选路原则(第二部) 终于到了BGP终极解析的第二部曲--BGP选路原则.与题目相呼应,我不会直接介绍选路原则的规则,而是从时间逻辑和空间逻辑上将所有的选路原则分层分类.因为只有从这种角 ...

  3. SonarQube分析报告无法上传的问题

    '); 由于SonarQube5.6 api/ce/submit 接口报以下异常,导致jenkins构建结果显示为失败~: Caused by: java.lang.NullPointerExcept ...

  4. dedecms 模板文件不存在,无法解析文档的终极各种解决办法

    dedecms 模板文件不存在,无法解析文档"的终极各种解决办法 方法一:[此对应喜欢把模板文件使用".html"的格式,] /include/arc.archives. ...

  5. 【终极版】利用阿里云云解析API实现动态域名解析(ddns),搭建私有服务器【含可执行文件和源码】

    前言:懒人可以直接往下看,有代码和全部资源可以下载.此文章是先前文章的定时版,主要是添加了定时执行的功能,并且将代码中的配置项放置到了app.config文件中,方便不懂开发的朋友修改使用.未经许可请 ...

  6. CSS浏览器兼容性与解析问题终极归纳

    1.怪异模式问题:漏写DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中会触发怪异模式.为避免怪异模式给我们带来不必要的麻烦,最好养成书写DTD声明的好习惯. 2.IE6双边距问题:在 ...

  7. dedecms 模板文件不存在,无法解析文档"的终极各种解决办法

    方法一:[此对应喜欢把模板文件使用".html"的格式,]  /include/arc.archives.class.php 556行    if (!preg_match(&qu ...

  8. 【转】CSS浏览器兼容性与解析问题终极归纳

    1.怪异模式问题:漏写DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中会触发怪异模式.为避免怪异模式给我们带来不必要的麻烦,最好养成书写DTD声明的好习惯. 2.IE6双边距问题:在 ...

  9. oracle plsql 64位 32位连接未打开 无法解析各种错终极解决方案

    首先取消登陆,进入pl/sql界面-工具-首选项 其次就需要你设置环境变量(加一个ORACLE_HOME和修改原先path里的路径这个不修改也行,主要是让大家知道为什么设置环境变量) 这些设置好,你在 ...

随机推荐

  1. Vue组件模板形式实现对象数组数据循环为树形结构

    数据结构为数组中包含对象--树形结构,用Vue组件的写法实现以下的效果: 树形列表,缩进显示层级,第5级数据加底色,数据样式显色,点击展开折叠数据.本文为用Vue实现方式,另有一篇为用knockout ...

  2. [Usaco2015 Jan]Grass Cownoisseur Tarjan缩点+SPFA

    考试的时候忘了缩点,人为dfs模拟缩点,没想到竟然跑了30分,RB爆发... 边是可以重复走的,所以在同一个强连通分量里,无论从那个点进入从哪个点出,所有的点一定能被一条路走到. 要使用缩点. 然后我 ...

  3. 逻辑回归的实现(LogicalRegression)

    1.背景知识       在刚刚结束的天猫大数据s1比赛中,逻辑回归是大家都普遍使用且效果不错的一种算法.   (1)回归           先来说说什么是回归,比如说我们有两类数据,各有50十个点 ...

  4. HTML-标签:图片 超链接

    [img图片标签] 1,src属性:表示图片所在的路径. [路径的表示方式] ① 网络图片地址.并不建议使用. ② 可以使用图片的绝对路径.但是严禁使用绝对路径,因为绝对路径使用file://协议,网 ...

  5. ubuntu修改grub,修改开机顺序,配置grub启动顺序

    方法一: 1.进入Ubuntu系统后打开终端 2.终端中输入以下命令 sudo gedit /boot/grub/grub.cfg 3.找到Windows的配置将其剪切到Ubuntu的前面 把下面 # ...

  6. node.js之setTimeout()、clearTimeout()与 setInterval()与clearInterval()

    1.setTimeout函数与clearTimeout函数 setTimeout(cb,ms,[arg],[...])延时一定时间执行回调函数该函数中cb参数为必填函数,为需要执行的回调函数ms为经过 ...

  7. Tomcat修改端口

    当在服务器上运行报错说端口已占用的时候,需要修改Tomcat的端口,步骤如下: 一.找到Tomcat的安装目录 二.进入conf目录,找到server.xml文件,记事本打开 此时文件中有三个地方可以 ...

  8. c#获取数组中指定元素的索引

    //获取元素的索引 ArrayList arrList = new ArrayList(); ; i < array.Length; i++) { ) { arrList.Add(i); } } ...

  9. 【Shell Basic】source . 与 bash sh 的区别

    一.在命令行窗口执行shell脚本时,source .所执行的脚本中,变量的作用域在当前shell窗口期,而bash.sh在shell脚本执行完了就失效了. dream361@master:~$ ca ...

  10. 【Js应用实例】图片预览

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...