链路状态路由协议在这里,我们首先将了解链路状态路由协议的原理及它的算法等知识,然后,将详细介绍链路状态路由协议相对于距离矢量路由协议的优势。9.1链路状态路由协议原理属于链路状态类型的路由协议有OSPF、IS-IS等路由协议。运行链路状态路由协议的路由器,在互相学习路由之前,会首先向邻居路由器学习整个网络的拓扑结构,在自己的内存中建立一个拓扑表(或称链路状态数据库),然后使用最短路径优先(SPF)算法,从自己的拓扑表里计算出路由来。这就好比是在上高速路之前先去买了一份地图,之后再开车去目的地,这样就不用看了路牌了。遇到路坏了,也可以根据自己手中的地图找到绕行的路,而不用再去问别人了。运行链路状态路由协议的路由器虽然在开始学习路由时先要学习整个网路的拓扑,学习路由的速率可能会比运行距离矢量路由协议的路由器慢一点,但是一旦路由学习完毕,路由器之间就不再需要周期性地互相传递路由表了,因为整个网路的拓扑路由器都知道,不需要使用周期性的路由更新包来维持路由表的正确性,从而节省了网路的带宽。当网路拓扑出现改变时(如在网路中加入了新的路由器或网路发生了故障),路由器也不需要吧自己的整个路由表发送给邻居路由器,只需要发出一个包含有出现改变网段的信息的触发更新包。收到这个包的路由器会把该信息添加进拓扑表里,并且从拓扑表里计算出新的路由。由于运行链路状态路由协议的路由器都维护一个相同的拓扑表,而路由是路由器自己从这张表中计算出来的,所以运行链路状态路由协议的路由器都能自己保证路由的正确性,不需要使用额外的措施来保证它。运行链路状态路由协议的网路在出现故障收敛是很快的。由于链路状态路由协议不必周期性地传递路由更新包,所以它不像距离矢量路由协议一样用路由更新包来维持邻居关系,链路状态路由协议必须使用专门的Hello包来维持邻居关系。运行链路状态路由协议的路由器周期性地向邻居的路由器发送Hello包,它们通过Hello包中的信息相互认识对方并且形成邻居关系。只有在形成邻居关系之后,路由器才可能学习网路拓扑。9.2链路状态路由协议的算法正如我们所知,运行链路状态路由协议的路由器在计算路由之前会首先学习网络拓扑,建立拓扑表。然后,它们会使用SPF算法(基于Dijkstra算法),即最短路径优先(ShortestPathFirst)算法,根据拓扑表计算路由。SPF算法会把网路拓扑转变为最短路径优先树(ShortestPathFirstTree),然后从该树型结构中找出到达每一个网段的最短路径,该路径就是路由;同时,该树型结构还保证了所计算出的路由不会存在路由环路。SPF计算路由的依据是带宽,每条链路根据其带宽都有相应的开销(Cost)。开销越小,该链路的带宽越大,该链路越优。9.3链路状态协议的优缺点当在比较大型的网路里运行时,距离矢量路由协议就暴露出了它的缺陷。比如,运行距离矢量路由协议的路由器由于不能了解整个网路的拓扑,只能周期性地向自己的邻居路由器发送路由更新包,这种操作增加了整个网路的负担。距离矢量路由协议在处理网路故障时,其收敛速率也极其缓慢,通常要耗时4~8分钟甚至更长,着对于大型网络或者电信级网路的骨干来说是不能忍受的。另外,距离矢量路由协议的最大度量值的限制也使得该种协议无法再大型网络里使用。所以,在大型网络里,我们需要使用一种比距离矢量路由协议更加高效,对网络带宽的影响更小的动态路由协议,这种协议就是链路状态路由协议。1.链路状态路由协议与距离矢量路由协议的比较链路状态路由协议与距离矢量路由协议的比较的比较如下。1)对整个网络拓扑的了解运行距离矢量路由协议的路由器都是从自己的邻居路由器处得到邻居的整个路由表,然后学习其中的路由信息,在把自己的路由表发给所有的邻居路由器。在这个程中,路由器虽然可以学习到路由,但是路由器并不了解整个网络的拓扑。运行链路状态路由协议的路由器首先会向邻居路由器学习整个网络拓扑,建立拓扑表,然后使用SPF算法从该拓扑表里自己计算出路由来。由于对整个网络拓扑的了解,链路状态路由协议具有很多距离矢量路由协议所不具备的优点。2)计算路由的算法距离矢量路由协议的算法(也被称为Bellman–Ford-Fulkerson算法),只能够使路由器知道一个IP网段在网络里德哪个方向,有多远,而不能知道该IP网络的具体位置,从而使路由器无法了解网络的拓扑。链路状态路由协议的算法需要链路状态数据库的支持,链路状态路由协议是从链路状态数据库里计算出路由的。3)路由更新由于距离矢量路由协议不能了解网络拓扑,运行该协议的路由器必须周期性地向邻居路由器发送路由更新包,其中包括了自己的整个路由表。距离矢量路由协议只能以这种方式保证路由表的正确性和实时性。运行距离矢量路由协议的路由器无法告诉邻居路由器哪一条特定的链路发生了故障,因为它们都不知道网络拓扑的样子。由于在链路状态路由协议刚刚开始工作时,所有运行链路状态路由协议的路由器就都学习了整个网络的拓扑,并且从中计算出了路由,所以运行链路状态路由协议的路由器不必周期性地向邻居路由器传递路由更新包。它只需要在网络发生故障时发出触发的更新包,告诉其它的路由器在网络的哪个位置发生了故障即可。而网络中的路由器会依据拓扑表重新计算该链路相关的路由。链路状态路由协议的路由更新是增量的更新。2.链路状态路由协议的优点从上述比较,我们可以看出链路状态路由协议的优点如下。●快速收敛。由于该链路状态路由协议对整个网络拓的了解,当发生网络故障故障时,察觉到该故障的路由器将该故障向网络里德其它路由器通告。接收到链路状态通告的路由器除了继续传递该通告外,还会根据自己的拓扑表重新计算关于故障网段的路由。这个重新计算的过程相当快速,整个网络会在极短的时间里收敛。●路由更新的操作更加有效率。由于链路状态路由协议在刚刚开始工作的时候,路由器就已经学习了整个网络的拓扑,并且根据网络拓扑计算出了路由表,如果网络的拓扑不发生改变,这些路由器的路由表里的路由条目一定是正确的。所以运行链路状态路由协议的路由器之间不必周期性地传递路由更新包来保证路由表的正确性,它们只需要在网络拓扑发生改变的时候(如有新的路由器加入网络或者网络中出现了故障),发送触发的更新包来通知其他路由器,网络中具体哪里发生了变化,而不用传递整个路由表。接收到该信息的路由器会根据自己的拓扑表计算出网络中变化部分的路由。这种触发的更新(或者叫做增量更新),由于不必周期性地传递整个路由表,使路由更新的处理变得更有效率了。但是,链路状态路由协议并不是没有缺点。●由于链路状态路由协议要求路由器首先学习拓扑表,然后从中计算出路由,所以运行链路状态路由协议的路由器被要求有更大的内存和更强计算能力的处理器。●同时,由于链路状态路由协议在刚刚开始工作的时候,路由器之间要首先形成邻居关系,并且学习网络拓扑,所以路由器在网络刚开始工作的时候不能路由数据包,必须等到拓扑表建立起来并且从中计算出路由,路由器才能进行数据包的路由操作,这个过程需要一定的时间。●另外,因为链路状态路由协议要求在网络中划分区域,并且对每个区域的路由进行汇总,从而达到减少路由表的路由条目、减少路由操作延时的目的,所以链路状态路由协议要求在网络中进行体系化编址,对IP子网的分配位置和分配顺序要求极为严格。虽然链路状态路由协议有上述这些缺点,但相对于它所带来的好处,这些缺点不过是白璧微瑕,并非不可以接受。由于以上这些特点,链路状态路由协议特别适合大规模的网络或者电信级网络的骨干上使用。9.4OSPF路由协议概述开放式最短路径优先(OpenShortestPathFirst,OSPF)路由协议是一种基于开放式标准的链路状态路由协议。它的最新记述出现在RFC2328文档中。OSPF中的开放式(Open)表示该协议是向公众开放的非私有的协议。OSPF路由协议也是一种IGP协议,它只能工作在自治域系统内部,不能跨自治域系统运行。相对于距离矢量路由协议,OSPF具有收敛时间很短、适用范围很大的优点。在大型网络或者电信级网络的骨干上,是不能使用距离矢量路由协议的。原因在于距离矢量路由协议的最大度量值影响了它的使用范围;而且该种协议收敛缓慢,无法达到电信运营网对故障恢复时间的要求;另外,距离矢量路由协议周期性地向邻居发送路由更新,也会占用带宽。而OSPF很好地解决了这些问题。运行OSPF路由协议的路由器,在刚刚开始工作的时候,首先和相邻的路由器建立邻居关系,形成邻居表,然后相互交换自己所了解的网络拓扑。路由器在没有学习到全部网络的拓扑之前,是不会进行任何路由操作的,因为这时路由表是空的。只有当路由器学习到了全部网络的拓扑,建立了拓扑表(也称链路状态数据库)之后,它们会使用最短路径优先(SPF)算法,从拓扑表中计算出路由来。因为所有运行OSPF路由协议的路由器都维护着相同的拓扑表,路由器可以自己从中计算出路由,所以这些路由器之间不必周期性地传递路由更新包,OSPF路由协议的更新是增量的更新。这种更新方式也节省了对网络带宽的消耗。由OSPF的工作方式,我们可以知道,运行OSPF路由协议的路由器要求有更多的内存和更高效的处理器,以便存储邻居表、拓扑表等数据库和进行路由的计算。虽然OSPF路由协议在刚刚运行的时候,其操作要比距离矢量路由协议复杂,OSPF路由协议的生效可能不如距离矢量路由协议快,但是,OSPF路由协议一旦开始运行,它的优势就体现出来了。在运行OSPF路由协议的网络里,当网络拓扑发生改变的时候(比如有新的路由器或网段加入网络,或者网络出现了故障,某个网段坏掉了),这时发现该变化的路由器会向其他路由器发送触发的路由更新包——链路状态更新包(LSU)。在LSU中包含了关于发生变化的网段的信息——链路状态通告(LSA)。接收到该更新包的路由器,会继续向其他路由器发送更新,同时根据LSA中的信息,在拓扑表重新计算发生变化的网段的路由。由于没有holdown时间,OSPF路由协议的收敛速率是相当快的,这一点对于大型网络或者电信级网络是非常重要的。OSPF路由协议还有一个重要的特征,就是它可以把一个大型的路由网络进行分级设计,即把一个大型网络分成多个区域,这种特性使OSPF路由协议能够在大规模的路由网络上正常而高效地工作。在大型路由网络里,往往有成百上千台路由器。如果这些路由器都是在一个大的区域里工作,那么每一台路由器都要了解整个网络的所有网段的路由,这些路由器的路由表里的条目可能会有成千上万条。路由器为每一个数据包做路由时,都不得不在大量的路由信息里寻找适合该数据包的路由条目,路由器对数据包进行路由操作的反应时间势必会延长,从而路由器的包通过率下降。另外,在一个大的区域里集中了如此多的路由器和链路,出现设备故障和链路故障的概率也会相应增加,而每次故障都会引起整个网络的路由收敛操作。即使是使用如OSPF这样的能够快速收敛的路由协议,频繁的网络收敛一样会使网络的可用性下降。OSPF路由协议通过使用分级的设计,把整个大型路由网络划分成多个小范围的区域,从而解决了上述问题。OSPF把大型网络划分为骨干区域和非骨干区域。骨干区域只有一个并且固定地称为区域0,所有的非骨干区域都必须和骨干区域相连,如图9-1所示。图9-1OSPF划分区域的示意图在每个小区域里,路由器不再去关心其他区域的链路改变,而只关心本区域的链路改变,一个区域的网络拓扑变化,只会引起本区域的网络收敛操作。通过划分区域,网络故障的影响范围被缩小,整个网络不再频繁地进行收敛操作。在区域与区域的边界处有边界路由器。该路由器负责学习两个区域的路由,而区域内部的路由器只需要使用静态路由或者汇总的路由,把目的地是其他区域的数据包路由给边界的区域3区域2区域1骨干区域区域0自治域系统路由器,由边界路由器将数据包路由到其他区域,而区域内部的路由器不需要学习其他区域的路由。这样,相对而言,路由器所维护的路由表体积显著减小,路由操作提高。但是,为了达到以上目的,每一个区域的路由都要尽量地进行汇总,这要求进行分级的、体系化的编址,如图9-2所示。图9-2OSPF要求进行体系化的编址在图9-2中