链路状态路由协议
在这里,我们首先将了解链路状态路由协议的原理及它的算法等知识,然后,将详细介绍链路状态路由协议相对于距离矢量路由协议的优势。
9.1 链路状态路由协议原理
属于链路状态类型的路由协议有OSPF 、IS-IS 等路由协议。
运行链路状态路由协议的路由器,在互相学习路由之前,会首先向邻居路由器学习整个网络的拓扑结构,在自己的内存中建立一个拓扑表(或称链路状态数据库),然后使用最短路径优先(SPF )算法,从自己的拓扑表里计算出路由来。
这就好比是在上高速路之前先去买了一份地图,之后再开车去目的地,这样就不用看了路牌了。遇到路坏了,也可以根据自己手中的地图找到绕行的路,而不用再去问别人了。 运行链路状态路由协议的路由器虽然在开始学习路由时先要学习整个网路的拓扑,学习路由的速率可能会比运行距离矢量路由协议的路由器慢一点,但是一旦路由学习完毕,路由器之间就不再需要周期性地互相传递路由表了,因为整个网路的拓扑路由器都知道,不需要使用周期性的路由更新包来维持路由表的正确性,从而节省了网路的带宽。
当网路拓扑出现改变时(如在网路中加入了新的路由器或网路发生了故障),路由器也不需要吧自己的整个路由表发送给邻居路由器,只需要发出一个包含有出现改变网段的信息的触发更新包。收到这个包的路由器会把该信息添加进拓扑表里,并且从拓扑表里计算出新的路由。由于运行链路状态路由协议的路由器都维护一个相同的拓扑表,而路由是路由器自己从这张表中计算出来的,所以运行链路状态路由协议的路由器都能自己保证路由的正确性,不需要使用额外的措施来保证它。运行链路状态路由协议的网路在出现故障收敛是很快的。
由于链路状态路由协议不必周期性地传递路由更新包,所以它不像距离矢量路由协议一样用路由更新包来维持邻居关系,链路状态路由协议必须使用专门的Hello 包来维持邻居关系。运行链路状态路由协议的路由器周期性地向邻居的路由器发送Hello 包,它们通过Hello 包中的信息相互认识对方并且形成邻居关系。只有在形成邻居关系之后,路由器才可能学习网路拓扑。
9.2 链路状态路由协议的算法
正如我们所知,运行链路状态路由协议的路由器在计算路由之前会首先学习网络拓扑,建立拓扑表。然后,它们会使用SPF 算法(基于Dijkstra 算法),即最短路径优先(Shortest
Path First )算法,根据拓扑表计算路由。
SPF 算法会把网路拓扑转变为最短路径优先树(Shortest Path First Tree),然后从该树型结构中找出到达每一个网段的最短路径,该路径就是路由;同时,该树型结构还保证了所计算出的路由不会存在路由环路。
SPF 计算路由的依据是带宽,每条链路根据其带宽都有相应的开销(Cost )。开销越小,该链路的带宽越大,该链路越优。
9.3 链路状态协议的优缺点
当在比较大型的网路里运行时,距离矢量路由协议就暴露出了它的缺陷。比如,运行距离矢量路由协议的路由器由于不能了解整个网路的拓扑,只能周期性地向自己的邻居路由器发送路由更新包,这种操作增加了整个网路的负担。距离矢量路由协议在处理网路故障时,其收敛速率也极其缓慢,通常要耗时4~8分钟甚至更长,着对于大型网络或者电信级网路的骨干来说是不能忍受的。另外,距离矢量路由协议的最大度量值的限制也使得该种协议无法再大型网络里使用。所以,在大型网络里,我们需要使用一种比距离矢量路由协议更加高效,对网络带宽的影响更小的动态路由协议,这种协议就是链路状态路由协议。
1. 链路状态路由协议与距离矢量路由协议的比较
链路状态路由协议与距离矢量路由协议的比较的比较如下。
1)对整个网络拓扑的了解
运行距离矢量路由协议的路由器都是从自己的邻居路由器处得到邻居的整个路由表,然后学习其中的路由信息,在把自己的路由表发给所有的邻居路由器。在这个程中,路由器虽然可以学习到路由,但是路由器并不了解整个网络的拓扑。运行链路状态路由协议的路由器首先会向邻居路由器学习整个网络拓扑,建立拓扑表,然后使用SPF 算法从该拓扑表里自己计算出路由来。
由于对整个网络拓扑的了解,链路状态路由协议具有很多距离矢量路由协议所不具备的优点。
2)计算路由的算法
距离矢量路由协议的算法(也被称为Bellman –Ford-Fulkerson 算法),只能够使路由器知道一个IP 网段在网络里德哪个方向,有多远,而不能知道该IP 网络的具体位置,从而使路由器无法了解网络的拓扑。
链路状态路由协议的算法需要链路状态数据库的支持,链路状态路由协议是从链路状态数据库里计算出路由的。
3)路由更新
由于距离矢量路由协议不能了解网络拓扑,运行该协议的路由器必须周期性地向邻居路
由器发送路由更新包,其中包括了自己的整个路由表。距离矢量路由协议只能以这种方式保证路由表的正确性和实时性。运行距离矢量路由协议的路由器无法告诉邻居路由器哪一条特定的链路发生了故障,因为它们都不知道网络拓扑的样子。
由于在链路状态路由协议刚刚开始工作时,所有运行链路状态路由协议的路由器就都学习了整个网络的拓扑,并且从中计算出了路由,所以运行链路状态路由协议的路由器不必周期性地向邻居路由器传递路由更新包。它只需要在网络发生故障时发出触发的更新包,告诉其它的路由器在网络的哪个位置发生了故障即可。而网络中的路由器会依据拓扑表重新计算该链路相关的路由。链路状态路由协议的路由更新是增量的更新。
2. 链路状态路由协议的优点
从上述比较,我们可以看出链路状态路由协议的优点如下。
● 快速收敛。
由于该链路状态路由协议对整个网络拓的了解,当发生网络故障故障时,察觉到该故障的路由器将该故障向网络里德其它路由器通告。接收到链路状态通告的路由器除了继续传递该通告外,还会根据自己的拓扑表重新计算关于故障网段的路由。这个重新计算的过程相当快速,整个网络会在极短的时间里收敛。
● 路由更新的操作更加有效率。
由于链路状态路由协议在刚刚开始工作的时候,路由器就已经学习了整个网络的拓扑,并且根据网络拓扑计算出了路由表,如果网络的拓扑不发生改变,这些路由器的路由表里的路由条目一定是正确的。所以运行链路状态路由协议的路由器之间不必周期性地传递路由更新包来保证路由表的正确性,它们只需要在网络拓扑发生改变的时候(如有新的路由器加入网络或者网络中出现了故障),发送触发的更新包来通知其他路由器,网络中具体哪里发生了变化,而不用传递整个路由表。接收到该信息的路由器会根据自己的拓扑表计算出网络中变化部分的路由。
这种触发的更新(或者叫做增量更新),由于不必周期性地传递整个路由表,使路由更新的处理变得更有效率了。
但是,链路状态路由协议并不是没有缺点。
● 由于链路状态路由协议要求路由器首先学习拓扑表,然后从中计算出路由,所以运行链路状态路由协议的路由器被要求有更大的内存和更强计算能力的处理器。
● 同时,由于链路状态路由协议在刚刚开始工作的时候,路由器之间要首先形成邻居关系,并且学习网络拓扑,所以路由器在网络刚开始工作的时候不能路由数据包,必须等到拓扑表建立起来并且从中计算出路由,路由器才能进行数据包的路由操作,这个过程需要一定的时间。
● 另外,因为链路状态路由协议要求在网络中划分区域,并且对每个区域的路由进行汇总,从而达到减少路由表的路由条目、减少路由操作延时的目的,所以链路状态路由协议
要求在网络中进行体系化编址,对IP 子网的分配位置和分配顺序要求极为严格。
虽然链路状态路由协议有上述这些缺点,但相对于它所带来的好处,这些缺点不过是白璧微瑕,并非不可以接受。
由于以上这些特点,链路状态路由协议特别适合大规模的网络或者电信级网络的骨干上使用。
9.4 OSPF路由协议概述
开放式最短路径优先(Open Shortest Path First,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 把大型网络划分为骨干区域和非骨干区域。骨干区域只有一个并且固定地称为区
图9-1 OSPF划分区域的示意图 在每个小区域里, 路由器不再去关心其他区域的链路改变, 而只关心本区域的链路改变, 一个区域的网络拓扑变化, 只会引起本区域的网络收敛操作。通过划分区域,网络故障的影响范围被缩小,整个网络不再频繁地进行收敛操作。
在区域与区域的边界处有边界路由器。该路由器负责学习两个区域的路由,而区域内部的路由器只需要使用静态路由或者汇总的路由,把目的地是其他区域的数据包路由给边界的
路由器,由边界路由器将数据包路由到其他区域,而区域内部的路由器不需要学习其他区域的路由。这样,相对而言,路由器所维护的路由表体积显著减小,路由操作提高。
但是,为了达到以上目的,每一个区域的路由都要尽量地进行汇总,这要求进行分级的、
图9-2 OSPF要求进行体系化的编址
在图9-2中,我们可以看到,每一个区域里都IP 地址, 应该尽量的连续分配,这样才能汇总出比较少的路由条目。
由于多区域的OSPF 操作比较复杂,CCNA 的教学和考试只要求掌握在单个区域里配置OSPF 路由协议的技术。本章下面的有关OSPF 的内容,都是在OSPF 单区域中的操作知识,学会了在单个区域里配置OSPF 协议,就为学习在多区域环境中配置OSPF 打下了良好的基础。
9.5 OSPF协议适用的网络类型
OSPF 路由协议在下面三种类型的网络上都可以使用。
● 广播多路访问(Broadcast Multiaccess,BMA) 网络:广播多路访问网络包括以太网、令牌环网及FDDI 。在这种类型的网络上使用OSPF 要求进行DR 与BDR 的选举。
● 点对点(Point-To-Point )网络:专线是典型的点对点网络。在这种类型的网络上不需要进行DR 与BDR 的选举。
● 非广播多路访问(Nonbroadcast Multiaccess ,NBMA )网络:非广播多路访问网络包括帧中继、X.25及SMDS 。在这种网络中使用OSPF 情况比较复杂。
图9-3描述了这三种网络类型。
图9-3 OSPF路由协议适用的三种网络类型
广播路访问 点对点 非广播多路访问 9.6 DR与BDR 的选举
在运行OSPF 路由协议的广播多路访问网络中,所有的路由器被连接到同一个网段,它们两两之间如果建立完全的邻居关系,则会有n ×(n-1)/2个邻居关系。在大型的网络中,存在着大量的路由器,在一个网段里有如此多的邻居,维持邻居关系的Hello 包及邻居间的链路状态通告会消耗很多的带宽。尤其是当网络中突发大面积故障时,同时发生的大量的链路更新可能会使路由器不断的重新计算路由,而无法正常提供路由服务。
解决该问题的办法是从这些路由器中选举出指定的路由器DR ,并且把这个路由器作为广播网络里每一台路由器的邻居路由器,如图9-4所示。
所有非DR 得路由器把自己的链路状态信息以多点广播的形式发送给DR ,该多点广播的地址为224.0.0.6。然后DR 再以多点广播的形式将这些信息发送给网段中所有的路由器,该多点广播的地址为224.0.0.5。这样的操作使众多的状态信息只使用一个广播包就可以传递到所有的路由器,节省了网络资源。
图9-5、图 9-6和图9-7举例说明了DR 的操作。
图9-4 DR与BDR 的操作
图9-5路由器B 向DR 通告网络故障 在图9-5中我们看到,当路由器B 发现一个网段出现故障后,它会向DR 发出LSU, 通告该网络故障。然后,DR 会向网络中所有的非DR 路由器发送LSU ,通告该故障。如图9-6所示。
路由器C 在接收到该通告后,除了要改动自己的拓扑表、重新计算路由以外,还要向其他的路由器转发该通告,如图9-7所示。
图9-6 DR向非DR 发送链路状态更新
图9-7路由器C 转发链路状态更新
从上例子中我们可以看出,事实上,DR 成为了广播多路访问网络中链路信息会聚的点,它同时也是广播多路访问网络中链路信息发散的点。为了防止DR 故障影响整个网络链路信息的传递,我们还要从这些路由器中选举出备份的DR ,即BDR 。
DR 与BDR 的选举,在广播多路访问网络中是自动的。
在运行OSPF 路由协议的广播多路访问网络中,路由器相互比较它们的优先级,优先级高的作为DR ,第二高的作为BDR 。
但是在默认情况下,路由器的优先级是一样的,这时,路由器依靠比较路由器的标识来决定谁是DR 。标识最大的路由器作为DR ,标识第二大的路由器作为BDR 。
一旦DR 发生故障而离线,BDR 会升级为DR ,同时引发新一轮的选举,从非DR 中选举出一台BDR 。当发生故障的原DR 重新在线时,无论它的优先级多高,或者路由器标识多大,它都不能得到原来的DR 地位,只能成为普通的非DR 路由器。只有等到下一次DR 的选举,它才可能成为DR 或者BDR 。
优先级是0的路由器永远不能成为DR 或者BDR 。
9.7 OSPF邻居关系的建立
运行OSPF 路由协议的路由器之间使用周期性地发送Hello 包的方法建立和维持邻居关系。
在OSI 参考模式的网络层上,Hello 包也是向多点广播组224.0.0.5发送。这个多点广播组是所有运行OSPF 路由协议的路由器都识别的。
默认地,运行OSPF 路由协议的路由器每10秒钟发出一次Hello 包,但是在NBMA 类型的网络里,路由器每30秒钟发出一次Hello 包。
图9-8 Hello包的包头结构 Hello 包的包头实际上是OSPF 包的包头,当OSPF 包头的TYPE 部分被置位为1时,该报成为Hello 包。
在Hello 包的包头里,包含路由器的标识及区域标识,这是必不可少的信息。路由器的标识作用在于让其他的路由器能够识别自己。两台路由器只有区域标识相同才能成为邻居。另外,如果我们在运行OSPF 路由协议的路由器上配置了邻居验证,验证的数据也会包含在Hello 包的包头里,如果验证口令不匹配,两台路由器不能成为邻居。
图9-9表示的是Hello 包的内容。
图9-9 Hello包的内容
在图9-9中Hello Interval 是发出Hello 包的时间间隔,Dead Interval是邻居关系失效的时间,也就是在Dead Interval规定的时间里没有收到Hello 包,则邻居关系失效。两台只有Hello Interval和Dead Interval相同才能成为邻居关系。
Router Priority是路由器的优先级。通过交换Hello 包,路由器能够了解邻居的优先级和路由器标识的大小,从而能够在广播多路访问网络中选举出DR 和BDR 。
一旦DR 和BDR 被选出,它们会出现在Hello 包的内容里。
一台路由器发出的Hello 包里还包括了它的所有邻居路由器的标识。如果路由器在它收到的Hello 包里看到了自己的标识则该路由器认为发送Hello 包的路由器和自己是邻居关系
下面的图9-10到图9-16,表示了路由器之间形成邻居关系及建立拓扑表和形成路由表的过程。
首先请看图9-10。
如图9-10所示,在使用OSPF 路由协议的网络还没有运行的时候,路由器A 和路由器B 互相还没有向对方发送任何信息,这是两台路由器互相不知道对方的存在,这种状态是DOWN 状态。
路由器A 路由器B DOWN 状态
图
9-10 DOWN状态
当使用OSPF 路由协议的网络开始运行时,其中总会有一台路由器首先发出Hello 包,如图9-11所示。
路由器A
路由器ID : 路由器ID :
路由器B
初始(Init )状态
Hello 包 路由器ID : 1.1.1.1
图9-11初始状态
在图9-11中,路由器A 首先发出Hello 包,路由器B 收到该Hello 包并且将路由器A 的标识记入邻居表,这个状态是初始状态。
路由器B 认识了路由器A 之后,也会向路由器A 发出Hello 包,如图9-11所示。 在图9-12中,路由器B 也发出Hello 包,其中不但有路由器B 的标识,还有它所认识的邻居的标识。路由器A 收到该Hello 包后,也会把路由器B 的标识记入邻居表。这时,两台路由器的邻居表里都有了对方的信息,邻居关系形成,这个状态是Two-Way 状态。
路由器ID : 路由器ID :
Two-Way 状态
Hello 包
路由器ID :1.1.1.2 邻居路由器ID :1.1.1.1
图9-12 Two-Way状态
由于两台路由器是使用以太线连接的,也就是说它们工作在广播多路访问网络中,而不是点对点网络,所有,在形成邻居关系之后要选举DR ,如图 9-13所示。
在图9-13中我们可以看到,路由器A 和路由器B 通过相互交换Hello 包比较两者的优先级和路由器标识。优先级高的路由器将成为DR 。如果优先级相同,则路由器标识大的路由器成为DR 。
在图9-13中,两台路由器的优先级都是默认的,是相同的,所以路由器标识较大的B 路由器成为了DR 。
路由器A
路由器ID : 路由器ID : 路由器B
E0 Exstart 状态 E1 DR
交换Hello 包
比较路由器优先级和 路由器标识
图9-13 Exstart状态
这个过程是Exstart 状态
选举出DR 之后,有DR 首先向非DR 发送网络拓扑信息,然后非DR 再把自己所知道的网卡拓扑信息发送给DR ,如图9-14所示。
发LSAck 确认收到信息
图9-14 Exchange状态
路由器A
路由器ID : 路由器ID : 路由器B
E0 Exchange 状态 E1 DR
路由器B 的链路状态数据库的汇总信息
路由器A 的链路状态数据库的汇总信息
路由器交换链路状态信息的过程是Exchange 状态。
在这个过程中交换的是链路状态数据库的汇总信息。如果路由器A 对某一条链路的信息不清楚,可以要求DR 发送关于该链路的完整的信息条目。
在图9-15中,DR 应路由器A 的要求,发送出某条链路的完整信息,这是Loading 状态。
路由器A
路由器B
E0
Loading 状态
E1
DR
路由器A 要求得到某条链路的详细信息
路由器B 传送某条链路的详细信息给A
发LSAck 确认收到信息
图9-15 Loading状态
当Loading 状态结束时,路由器已经学习到了完整的网络拓扑,这个时候是Full 状态,如图9-16所示。
E0
Full 状态
图9-16 Full状态
路由器A
路由器ID : 路由器ID :
路由器B
E1
只有当到达了Full 状态的时候,运行OSPF 路由协议的路由器才会从拓扑表里计算出路由表。在达到Full 状态之前,路由器没有路由能力。
2 运行OSPF 路由协议的路由器处理路由更新的过程
在运行OSPF 路由协议的网络里,当网络拓扑发生改变的时候,路由器会收到LSU ,其中包含有链路状态通告(LSA )。图9-17是路由器对LSA 的处理过程。
忽略
LSU
结束
结束
图9-17运行OSPF 路由协议的路由器处理路由更新的过程
如图9-17所示,当链路状态更新包到达路由器时,路由器首先判断自己的拓扑表里有没有链路状态通告所描述的链路。
如果没有,则说明该链路是新添加进网络的链路。路由器将它添加进路由表,然后向发送者发出确认信息并且向其他邻居该更新信息,最后计算出这条新添加的链路的路由。
如果自己的拓扑表里已经有了该条目,那么路由器会比较该更新的顺序号与自己维护的链路状态的顺序号。运行OSPF 路由协议的路由器只接受和维护最高的顺序号。
如果顺序号相同,说明该更新路由器已经处理过了,路由器将忽略该链路更新。 如果链路更新的顺序号还不如路由器维护的链路状态的顺序号大,说明该更新是过时的信息,路由器会向它的发送者发出更新的信息。
如果链路更新的顺序号比路由维护的链路状态的顺序号大,说明该通告中包含的是比较新的信息,路由器会完成将该信息添加进路由表、发出确认信息、向邻居转发该更新信息、计算路由等一系列操作。
9.8 单区域OSPF 的配置
在这一节里,将会介绍如何在单区域里配置OSPF 路由协议,以及一些OSPF 的辅助命令和检查OSPF 配置的命令。
9.8.1 配置OSPF 路由协议的命令及一些辅助命令
配置OSPF 路由协议的命令及一些辅助命令介绍如下: 1. 在路由器上配置单区域的OSPF 路由协议的命令 首先在路由器上声明使用OSPF 路由协议,命令格式如下:
Router (config)#router ospf process-id
在该命令中,process-id 是进程号,范围是1~65 535。在同一个使用OSPF 路由协议的网络中的不同路由器可以使用不同的进程号。一台路由器可以启用多个OSPF 进程。
在声明使用OSPF 路由协议之后,我们还要在OSPF 路由协议里发布网段,命令格式如下:
Router (config-router ) #network address wildcard-mask area area-id
在该命令中,address 可以是网段。子网或者接口的地址:wildcard-mask 称为通配符号掩码,它与子网掩码正好相反,但是作用是一样的;area-id 是区域标识,它的范围是0-65535,区域0是骨干区域,OSPF 路由协议在发布网段的时候必须指明其所属的区域,在单区域的的OSPF 配置里区域标识必须是0
下面是一组OSPF 的配置命令示范: Router (config)#router ospf 1
Router (config-router ) #network 10.0.0.0 0.255.255.255 area 0 Router (config-router ) #network 172.16.0.0 0.0.255.255 area 0 Router (config-router ) #network 192.168.1.0 0.0.0.255 area 0 Router (config-router ) #network 192.168.2.1 0.0.0.0 area 0 2. 在路由器上配置环回接口的命令
我们已知道,运行OSPF 路由协议的路由器需要一个标识,该标识可以是路由器的所有物理接口上配置的最大的IP 地址。但是物理接口由于线路等原因有可能会从UP 变成为DOWN 的状态。为了稳定起见,我们可以在运行OSPF 路由协议的路由器上配置环路接口,它不会变成为DOWN 的状态。
声明环回的命令格式如下:
Router (config)#interface loopback number
然后可以在该接口下配置地址,该接口不必使用no shutdown 命令。 图9-18
图9-18 配置环回接口命令
取消环回接口的命令格式如下:
Router (config)#no interface loopback number 图9-19给出了取消环回接口的命令实例。
图9-19 取消环回接口的命令
3. 更改优先级的命令
运行OSPF 路由协议的路由器之间会比较各自的优先级,优先级高的路由器将成为DR 。优先级的范围为0~255,其中如果优先级为0,则该路由器永远不能成为DR 。路由器上默认的优先级是1。我们可以改变某一台路由器的优先级,使得该路由器成为DR 或者永远不会成为DR 。
更改优先级的命令格式如下:
Router (config-if ) #ip ospf priority number 图9-20给出了更改优先级命令的实例。
图9-20更改优先级的命令
我们可以使用如下命令查看接口上的优先级及其他关键信息: Router #show ip ospf interface type number 图9-21显示了该命令查看的部分内容。
图9-21 show ip ospf interface 命令的部分内容
2. 更改链路开销的命令
OSPF 路由协议是通过对链路的带宽计算得出路径的开销值的,计算公式是:
链路开销=108/带宽(bps )
在串行接口上链路的带宽默认为1.544Mbps 。Cisco IOS 会根据接口的带宽自动计算链路开销的值,表9-1介绍了部分链路的开销值。
表 9-1 部分链路的开销
我们可以通过使用如下的命令更改接口的带宽,则该链路的开销也会相应改变: Router (config)# interface serial 0/0 Router (config-if )# bandwidth 64
另外,我们可以通过如下命令直接在接口上更改开销: Router (config-if )#ip ospf cost number 其中开销值可以是1~65535之间的数值。 3. 应用邻居验证的命令
在默认情况下,路由器相信它所收到的路由信息是没有被篡改的。但是如果网络环境无法保证该信任,我们可以使用邻居验证的方法来保证路由器收到的路由信息确实是它的邻居发出的。
我们可以在路由器的接口上配置验证的密码,该密码最多可以有8位字符。该接口所连接的邻居路由器的相应接口也要配置验证的密码。这样,当两台路由器互相发送Hello 包时,Hello 包里就会带有验证的信息,如果该信息不匹配,则无法形成邻居关系。 在接口上配置验证密码的命令格式如下:
Router (config-if )#ip ospf authentication-key password
当配置完接口的验证密码之后,还要在OSPF 路由协议里声明使用邻居验证,命令格式
如下:
Router (config-router )#area area-number authentication
这种配置方式下,密码是在网络上以明文的方式传送的,为了安全起见,我们也可以配置MD5加密的密码验证,其接口上的配置命令格式如下:
Router (config-if )#ip ospf message-digest-key key-id md5 encryption-type key 其中key-id 可以是1~255之间的数。两台路由器如果要成为邻居,该数值必须配置得一样。而encryption-type key 可以是0~7之间的数。它表示加密的程度,0表示不加密,7表示最大程度的加密。
在OSPF 路由协议里声明使用加密的邻居验证的命令如下:
Router (config-router )#area area-id authentication message-digest 该种邻居验证方式不会在网络中以文明的方式传递密码,安全性大大增加了。图11-25是MD5加密的密码验证的实例。
图 9-22 MD5加密的密码验证实例
4. 更改Hello-interval 和dead-interval 的命令
Hello-interval 是路由器发出Hello 包的时间间隔,dead-interval 是邻居关系失效的时间间隔。默认的Hello-interval 是10秒,而dead-interval 是40秒。在非广播多路访问网络,默认的Hello-interval 是30秒,而dead-interval 是120秒。当在dead-interval 之内没有收到邻居的Hello 包时,一旦dead-interval 超时,路由器会认为该邻居已经离线。
如果路由器的Hello-interval 或dead-interval 配置不相同,则两台路由器不能形成邻居关系。所以更改该参数时一定要小心。一下是更改Hello-interval 和dead-interval 的命令格式:
Router (config-if ) #ip ospf hello-interval seconds Router (config-if ) #ip ospf dead-interval seconds 图9-23
图9-23更改Hello-interval 和dead-interval 的命令
5. 配置默认静态路由的命令
在OSPF 的非骨干区域里,区域的内部路由器不需要了解其他区域的路由,它们只需要使用一条默认的静态路由,把目的地是其他区域的数据包路由给边界路由器。
在路由器上配置默认静态路由的命令格式如下:
Router (config-if )#ip route 0.0.0.0.0.0.0.0 [interface | next-hop address] 如果在区域里的每台路由器上都配置默认静态路由命令,我们的工作量是比较大的我们可以在边界路由器上使用如下命令,使得区域内部的路由器能够从边界路由器学习到该默认路由:
Router (config-router ) #default-information originate 通过使用该命令,区域内部的路由器将会把边界路由器作为它们的网关。
9.8.2 检验OSPF 配置的命令
常见的OSPF 配置问题和检验OSPF 配置的命令如下。 1. 常见的OSPF 配置问题
一台运行OSPF 路由协议的路由器需要和其他相邻的路由器建立邻居关系,然后它才能和这些路由器互相交换链路状态的信息,从而学习路由。如果路由器无法和其它路由器建立邻居关系,那么它将不能学习到路由。导致路由器不能建立邻居关系的配置问题如下。
● 相邻的路由器互相不发送Hello 包。
● 相邻的路由器的Hello-interval 和dead-interval ● 连接路由器的接口属于不同的网络类型。 ● 邻居验证的密码或关键字不同。
另外,在配置OSPF 路由协议的时候,我们还要保证: ● 在路由器的接口上配置的IP 地址和子网掩码正确无误。 ● 在发布网段的时候使用了正确的通配符掩码。 ● 网段发布到了正确的区域。 2. 检验OSPF 配置的命令
我们可以使用下面这些命令来检查OSPF 路由协议是否正确。 ● show ip ospf interface
该命令用来检查接口是否被配置在相应的区域里,另外我们也可以看到该接口所连接的邻居,以及在接口上的Hello-interval 和dead-interval 的这两个参数。 ● show ip ospf
使用该命令我们可以看到链路状态更新的时间间隔及网络收敛的次数等信息。 ● show ip ospf neighbor detail
该命令显示邻居的详细信息的列表,包括它们的优先级和当前的状态。 ● show ip ospf database
该命令显示路由器管理的拓扑表的内容、路由器标识和OSPF 进程号。 3.OSPF 的clear 和debug 命令
当我们对OSPF 的配置进行了改变(比如更改了所发布的网段)之后,如果这种改变在路由表反映得比较慢,我们可以使用下面的命令来清一下路由表,让路由表立刻开始更新:
Router#clear ip route *
这个命令可以清空整个的路由表,让路由器重新建立路由表。 当然我们也可以指定某一条路由条目,只清空该条目,命令如下: Router#clear ip route a.b.c.d
如果我们怀疑OSPF 的链路状态更新包有问题,我们可以使用如下命令检查: Router#debug ip ospf events 该命令会报告所有的OSPF 事件。 而下面这个命令:
Router#debug ip ospf adj 会报告关于邻居的OSPF 事件。
链路状态路由协议
在这里,我们首先将了解链路状态路由协议的原理及它的算法等知识,然后,将详细介绍链路状态路由协议相对于距离矢量路由协议的优势。
9.1 链路状态路由协议原理
属于链路状态类型的路由协议有OSPF 、IS-IS 等路由协议。
运行链路状态路由协议的路由器,在互相学习路由之前,会首先向邻居路由器学习整个网络的拓扑结构,在自己的内存中建立一个拓扑表(或称链路状态数据库),然后使用最短路径优先(SPF )算法,从自己的拓扑表里计算出路由来。
这就好比是在上高速路之前先去买了一份地图,之后再开车去目的地,这样就不用看了路牌了。遇到路坏了,也可以根据自己手中的地图找到绕行的路,而不用再去问别人了。 运行链路状态路由协议的路由器虽然在开始学习路由时先要学习整个网路的拓扑,学习路由的速率可能会比运行距离矢量路由协议的路由器慢一点,但是一旦路由学习完毕,路由器之间就不再需要周期性地互相传递路由表了,因为整个网路的拓扑路由器都知道,不需要使用周期性的路由更新包来维持路由表的正确性,从而节省了网路的带宽。
当网路拓扑出现改变时(如在网路中加入了新的路由器或网路发生了故障),路由器也不需要吧自己的整个路由表发送给邻居路由器,只需要发出一个包含有出现改变网段的信息的触发更新包。收到这个包的路由器会把该信息添加进拓扑表里,并且从拓扑表里计算出新的路由。由于运行链路状态路由协议的路由器都维护一个相同的拓扑表,而路由是路由器自己从这张表中计算出来的,所以运行链路状态路由协议的路由器都能自己保证路由的正确性,不需要使用额外的措施来保证它。运行链路状态路由协议的网路在出现故障收敛是很快的。
由于链路状态路由协议不必周期性地传递路由更新包,所以它不像距离矢量路由协议一样用路由更新包来维持邻居关系,链路状态路由协议必须使用专门的Hello 包来维持邻居关系。运行链路状态路由协议的路由器周期性地向邻居的路由器发送Hello 包,它们通过Hello 包中的信息相互认识对方并且形成邻居关系。只有在形成邻居关系之后,路由器才可能学习网路拓扑。
9.2 链路状态路由协议的算法
正如我们所知,运行链路状态路由协议的路由器在计算路由之前会首先学习网络拓扑,建立拓扑表。然后,它们会使用SPF 算法(基于Dijkstra 算法),即最短路径优先(Shortest
Path First )算法,根据拓扑表计算路由。
SPF 算法会把网路拓扑转变为最短路径优先树(Shortest Path First Tree),然后从该树型结构中找出到达每一个网段的最短路径,该路径就是路由;同时,该树型结构还保证了所计算出的路由不会存在路由环路。
SPF 计算路由的依据是带宽,每条链路根据其带宽都有相应的开销(Cost )。开销越小,该链路的带宽越大,该链路越优。
9.3 链路状态协议的优缺点
当在比较大型的网路里运行时,距离矢量路由协议就暴露出了它的缺陷。比如,运行距离矢量路由协议的路由器由于不能了解整个网路的拓扑,只能周期性地向自己的邻居路由器发送路由更新包,这种操作增加了整个网路的负担。距离矢量路由协议在处理网路故障时,其收敛速率也极其缓慢,通常要耗时4~8分钟甚至更长,着对于大型网络或者电信级网路的骨干来说是不能忍受的。另外,距离矢量路由协议的最大度量值的限制也使得该种协议无法再大型网络里使用。所以,在大型网络里,我们需要使用一种比距离矢量路由协议更加高效,对网络带宽的影响更小的动态路由协议,这种协议就是链路状态路由协议。
1. 链路状态路由协议与距离矢量路由协议的比较
链路状态路由协议与距离矢量路由协议的比较的比较如下。
1)对整个网络拓扑的了解
运行距离矢量路由协议的路由器都是从自己的邻居路由器处得到邻居的整个路由表,然后学习其中的路由信息,在把自己的路由表发给所有的邻居路由器。在这个程中,路由器虽然可以学习到路由,但是路由器并不了解整个网络的拓扑。运行链路状态路由协议的路由器首先会向邻居路由器学习整个网络拓扑,建立拓扑表,然后使用SPF 算法从该拓扑表里自己计算出路由来。
由于对整个网络拓扑的了解,链路状态路由协议具有很多距离矢量路由协议所不具备的优点。
2)计算路由的算法
距离矢量路由协议的算法(也被称为Bellman –Ford-Fulkerson 算法),只能够使路由器知道一个IP 网段在网络里德哪个方向,有多远,而不能知道该IP 网络的具体位置,从而使路由器无法了解网络的拓扑。
链路状态路由协议的算法需要链路状态数据库的支持,链路状态路由协议是从链路状态数据库里计算出路由的。
3)路由更新
由于距离矢量路由协议不能了解网络拓扑,运行该协议的路由器必须周期性地向邻居路
由器发送路由更新包,其中包括了自己的整个路由表。距离矢量路由协议只能以这种方式保证路由表的正确性和实时性。运行距离矢量路由协议的路由器无法告诉邻居路由器哪一条特定的链路发生了故障,因为它们都不知道网络拓扑的样子。
由于在链路状态路由协议刚刚开始工作时,所有运行链路状态路由协议的路由器就都学习了整个网络的拓扑,并且从中计算出了路由,所以运行链路状态路由协议的路由器不必周期性地向邻居路由器传递路由更新包。它只需要在网络发生故障时发出触发的更新包,告诉其它的路由器在网络的哪个位置发生了故障即可。而网络中的路由器会依据拓扑表重新计算该链路相关的路由。链路状态路由协议的路由更新是增量的更新。
2. 链路状态路由协议的优点
从上述比较,我们可以看出链路状态路由协议的优点如下。
● 快速收敛。
由于该链路状态路由协议对整个网络拓的了解,当发生网络故障故障时,察觉到该故障的路由器将该故障向网络里德其它路由器通告。接收到链路状态通告的路由器除了继续传递该通告外,还会根据自己的拓扑表重新计算关于故障网段的路由。这个重新计算的过程相当快速,整个网络会在极短的时间里收敛。
● 路由更新的操作更加有效率。
由于链路状态路由协议在刚刚开始工作的时候,路由器就已经学习了整个网络的拓扑,并且根据网络拓扑计算出了路由表,如果网络的拓扑不发生改变,这些路由器的路由表里的路由条目一定是正确的。所以运行链路状态路由协议的路由器之间不必周期性地传递路由更新包来保证路由表的正确性,它们只需要在网络拓扑发生改变的时候(如有新的路由器加入网络或者网络中出现了故障),发送触发的更新包来通知其他路由器,网络中具体哪里发生了变化,而不用传递整个路由表。接收到该信息的路由器会根据自己的拓扑表计算出网络中变化部分的路由。
这种触发的更新(或者叫做增量更新),由于不必周期性地传递整个路由表,使路由更新的处理变得更有效率了。
但是,链路状态路由协议并不是没有缺点。
● 由于链路状态路由协议要求路由器首先学习拓扑表,然后从中计算出路由,所以运行链路状态路由协议的路由器被要求有更大的内存和更强计算能力的处理器。
● 同时,由于链路状态路由协议在刚刚开始工作的时候,路由器之间要首先形成邻居关系,并且学习网络拓扑,所以路由器在网络刚开始工作的时候不能路由数据包,必须等到拓扑表建立起来并且从中计算出路由,路由器才能进行数据包的路由操作,这个过程需要一定的时间。
● 另外,因为链路状态路由协议要求在网络中划分区域,并且对每个区域的路由进行汇总,从而达到减少路由表的路由条目、减少路由操作延时的目的,所以链路状态路由协议
要求在网络中进行体系化编址,对IP 子网的分配位置和分配顺序要求极为严格。
虽然链路状态路由协议有上述这些缺点,但相对于它所带来的好处,这些缺点不过是白璧微瑕,并非不可以接受。
由于以上这些特点,链路状态路由协议特别适合大规模的网络或者电信级网络的骨干上使用。
9.4 OSPF路由协议概述
开放式最短路径优先(Open Shortest Path First,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 把大型网络划分为骨干区域和非骨干区域。骨干区域只有一个并且固定地称为区
图9-1 OSPF划分区域的示意图 在每个小区域里, 路由器不再去关心其他区域的链路改变, 而只关心本区域的链路改变, 一个区域的网络拓扑变化, 只会引起本区域的网络收敛操作。通过划分区域,网络故障的影响范围被缩小,整个网络不再频繁地进行收敛操作。
在区域与区域的边界处有边界路由器。该路由器负责学习两个区域的路由,而区域内部的路由器只需要使用静态路由或者汇总的路由,把目的地是其他区域的数据包路由给边界的
路由器,由边界路由器将数据包路由到其他区域,而区域内部的路由器不需要学习其他区域的路由。这样,相对而言,路由器所维护的路由表体积显著减小,路由操作提高。
但是,为了达到以上目的,每一个区域的路由都要尽量地进行汇总,这要求进行分级的、
图9-2 OSPF要求进行体系化的编址
在图9-2中,我们可以看到,每一个区域里都IP 地址, 应该尽量的连续分配,这样才能汇总出比较少的路由条目。
由于多区域的OSPF 操作比较复杂,CCNA 的教学和考试只要求掌握在单个区域里配置OSPF 路由协议的技术。本章下面的有关OSPF 的内容,都是在OSPF 单区域中的操作知识,学会了在单个区域里配置OSPF 协议,就为学习在多区域环境中配置OSPF 打下了良好的基础。
9.5 OSPF协议适用的网络类型
OSPF 路由协议在下面三种类型的网络上都可以使用。
● 广播多路访问(Broadcast Multiaccess,BMA) 网络:广播多路访问网络包括以太网、令牌环网及FDDI 。在这种类型的网络上使用OSPF 要求进行DR 与BDR 的选举。
● 点对点(Point-To-Point )网络:专线是典型的点对点网络。在这种类型的网络上不需要进行DR 与BDR 的选举。
● 非广播多路访问(Nonbroadcast Multiaccess ,NBMA )网络:非广播多路访问网络包括帧中继、X.25及SMDS 。在这种网络中使用OSPF 情况比较复杂。
图9-3描述了这三种网络类型。
图9-3 OSPF路由协议适用的三种网络类型
广播路访问 点对点 非广播多路访问 9.6 DR与BDR 的选举
在运行OSPF 路由协议的广播多路访问网络中,所有的路由器被连接到同一个网段,它们两两之间如果建立完全的邻居关系,则会有n ×(n-1)/2个邻居关系。在大型的网络中,存在着大量的路由器,在一个网段里有如此多的邻居,维持邻居关系的Hello 包及邻居间的链路状态通告会消耗很多的带宽。尤其是当网络中突发大面积故障时,同时发生的大量的链路更新可能会使路由器不断的重新计算路由,而无法正常提供路由服务。
解决该问题的办法是从这些路由器中选举出指定的路由器DR ,并且把这个路由器作为广播网络里每一台路由器的邻居路由器,如图9-4所示。
所有非DR 得路由器把自己的链路状态信息以多点广播的形式发送给DR ,该多点广播的地址为224.0.0.6。然后DR 再以多点广播的形式将这些信息发送给网段中所有的路由器,该多点广播的地址为224.0.0.5。这样的操作使众多的状态信息只使用一个广播包就可以传递到所有的路由器,节省了网络资源。
图9-5、图 9-6和图9-7举例说明了DR 的操作。
图9-4 DR与BDR 的操作
图9-5路由器B 向DR 通告网络故障 在图9-5中我们看到,当路由器B 发现一个网段出现故障后,它会向DR 发出LSU, 通告该网络故障。然后,DR 会向网络中所有的非DR 路由器发送LSU ,通告该故障。如图9-6所示。
路由器C 在接收到该通告后,除了要改动自己的拓扑表、重新计算路由以外,还要向其他的路由器转发该通告,如图9-7所示。
图9-6 DR向非DR 发送链路状态更新
图9-7路由器C 转发链路状态更新
从上例子中我们可以看出,事实上,DR 成为了广播多路访问网络中链路信息会聚的点,它同时也是广播多路访问网络中链路信息发散的点。为了防止DR 故障影响整个网络链路信息的传递,我们还要从这些路由器中选举出备份的DR ,即BDR 。
DR 与BDR 的选举,在广播多路访问网络中是自动的。
在运行OSPF 路由协议的广播多路访问网络中,路由器相互比较它们的优先级,优先级高的作为DR ,第二高的作为BDR 。
但是在默认情况下,路由器的优先级是一样的,这时,路由器依靠比较路由器的标识来决定谁是DR 。标识最大的路由器作为DR ,标识第二大的路由器作为BDR 。
一旦DR 发生故障而离线,BDR 会升级为DR ,同时引发新一轮的选举,从非DR 中选举出一台BDR 。当发生故障的原DR 重新在线时,无论它的优先级多高,或者路由器标识多大,它都不能得到原来的DR 地位,只能成为普通的非DR 路由器。只有等到下一次DR 的选举,它才可能成为DR 或者BDR 。
优先级是0的路由器永远不能成为DR 或者BDR 。
9.7 OSPF邻居关系的建立
运行OSPF 路由协议的路由器之间使用周期性地发送Hello 包的方法建立和维持邻居关系。
在OSI 参考模式的网络层上,Hello 包也是向多点广播组224.0.0.5发送。这个多点广播组是所有运行OSPF 路由协议的路由器都识别的。
默认地,运行OSPF 路由协议的路由器每10秒钟发出一次Hello 包,但是在NBMA 类型的网络里,路由器每30秒钟发出一次Hello 包。
图9-8 Hello包的包头结构 Hello 包的包头实际上是OSPF 包的包头,当OSPF 包头的TYPE 部分被置位为1时,该报成为Hello 包。
在Hello 包的包头里,包含路由器的标识及区域标识,这是必不可少的信息。路由器的标识作用在于让其他的路由器能够识别自己。两台路由器只有区域标识相同才能成为邻居。另外,如果我们在运行OSPF 路由协议的路由器上配置了邻居验证,验证的数据也会包含在Hello 包的包头里,如果验证口令不匹配,两台路由器不能成为邻居。
图9-9表示的是Hello 包的内容。
图9-9 Hello包的内容
在图9-9中Hello Interval 是发出Hello 包的时间间隔,Dead Interval是邻居关系失效的时间,也就是在Dead Interval规定的时间里没有收到Hello 包,则邻居关系失效。两台只有Hello Interval和Dead Interval相同才能成为邻居关系。
Router Priority是路由器的优先级。通过交换Hello 包,路由器能够了解邻居的优先级和路由器标识的大小,从而能够在广播多路访问网络中选举出DR 和BDR 。
一旦DR 和BDR 被选出,它们会出现在Hello 包的内容里。
一台路由器发出的Hello 包里还包括了它的所有邻居路由器的标识。如果路由器在它收到的Hello 包里看到了自己的标识则该路由器认为发送Hello 包的路由器和自己是邻居关系
下面的图9-10到图9-16,表示了路由器之间形成邻居关系及建立拓扑表和形成路由表的过程。
首先请看图9-10。
如图9-10所示,在使用OSPF 路由协议的网络还没有运行的时候,路由器A 和路由器B 互相还没有向对方发送任何信息,这是两台路由器互相不知道对方的存在,这种状态是DOWN 状态。
路由器A 路由器B DOWN 状态
图
9-10 DOWN状态
当使用OSPF 路由协议的网络开始运行时,其中总会有一台路由器首先发出Hello 包,如图9-11所示。
路由器A
路由器ID : 路由器ID :
路由器B
初始(Init )状态
Hello 包 路由器ID : 1.1.1.1
图9-11初始状态
在图9-11中,路由器A 首先发出Hello 包,路由器B 收到该Hello 包并且将路由器A 的标识记入邻居表,这个状态是初始状态。
路由器B 认识了路由器A 之后,也会向路由器A 发出Hello 包,如图9-11所示。 在图9-12中,路由器B 也发出Hello 包,其中不但有路由器B 的标识,还有它所认识的邻居的标识。路由器A 收到该Hello 包后,也会把路由器B 的标识记入邻居表。这时,两台路由器的邻居表里都有了对方的信息,邻居关系形成,这个状态是Two-Way 状态。
路由器ID : 路由器ID :
Two-Way 状态
Hello 包
路由器ID :1.1.1.2 邻居路由器ID :1.1.1.1
图9-12 Two-Way状态
由于两台路由器是使用以太线连接的,也就是说它们工作在广播多路访问网络中,而不是点对点网络,所有,在形成邻居关系之后要选举DR ,如图 9-13所示。
在图9-13中我们可以看到,路由器A 和路由器B 通过相互交换Hello 包比较两者的优先级和路由器标识。优先级高的路由器将成为DR 。如果优先级相同,则路由器标识大的路由器成为DR 。
在图9-13中,两台路由器的优先级都是默认的,是相同的,所以路由器标识较大的B 路由器成为了DR 。
路由器A
路由器ID : 路由器ID : 路由器B
E0 Exstart 状态 E1 DR
交换Hello 包
比较路由器优先级和 路由器标识
图9-13 Exstart状态
这个过程是Exstart 状态
选举出DR 之后,有DR 首先向非DR 发送网络拓扑信息,然后非DR 再把自己所知道的网卡拓扑信息发送给DR ,如图9-14所示。
发LSAck 确认收到信息
图9-14 Exchange状态
路由器A
路由器ID : 路由器ID : 路由器B
E0 Exchange 状态 E1 DR
路由器B 的链路状态数据库的汇总信息
路由器A 的链路状态数据库的汇总信息
路由器交换链路状态信息的过程是Exchange 状态。
在这个过程中交换的是链路状态数据库的汇总信息。如果路由器A 对某一条链路的信息不清楚,可以要求DR 发送关于该链路的完整的信息条目。
在图9-15中,DR 应路由器A 的要求,发送出某条链路的完整信息,这是Loading 状态。
路由器A
路由器B
E0
Loading 状态
E1
DR
路由器A 要求得到某条链路的详细信息
路由器B 传送某条链路的详细信息给A
发LSAck 确认收到信息
图9-15 Loading状态
当Loading 状态结束时,路由器已经学习到了完整的网络拓扑,这个时候是Full 状态,如图9-16所示。
E0
Full 状态
图9-16 Full状态
路由器A
路由器ID : 路由器ID :
路由器B
E1
只有当到达了Full 状态的时候,运行OSPF 路由协议的路由器才会从拓扑表里计算出路由表。在达到Full 状态之前,路由器没有路由能力。
2 运行OSPF 路由协议的路由器处理路由更新的过程
在运行OSPF 路由协议的网络里,当网络拓扑发生改变的时候,路由器会收到LSU ,其中包含有链路状态通告(LSA )。图9-17是路由器对LSA 的处理过程。
忽略
LSU
结束
结束
图9-17运行OSPF 路由协议的路由器处理路由更新的过程
如图9-17所示,当链路状态更新包到达路由器时,路由器首先判断自己的拓扑表里有没有链路状态通告所描述的链路。
如果没有,则说明该链路是新添加进网络的链路。路由器将它添加进路由表,然后向发送者发出确认信息并且向其他邻居该更新信息,最后计算出这条新添加的链路的路由。
如果自己的拓扑表里已经有了该条目,那么路由器会比较该更新的顺序号与自己维护的链路状态的顺序号。运行OSPF 路由协议的路由器只接受和维护最高的顺序号。
如果顺序号相同,说明该更新路由器已经处理过了,路由器将忽略该链路更新。 如果链路更新的顺序号还不如路由器维护的链路状态的顺序号大,说明该更新是过时的信息,路由器会向它的发送者发出更新的信息。
如果链路更新的顺序号比路由维护的链路状态的顺序号大,说明该通告中包含的是比较新的信息,路由器会完成将该信息添加进路由表、发出确认信息、向邻居转发该更新信息、计算路由等一系列操作。
9.8 单区域OSPF 的配置
在这一节里,将会介绍如何在单区域里配置OSPF 路由协议,以及一些OSPF 的辅助命令和检查OSPF 配置的命令。
9.8.1 配置OSPF 路由协议的命令及一些辅助命令
配置OSPF 路由协议的命令及一些辅助命令介绍如下: 1. 在路由器上配置单区域的OSPF 路由协议的命令 首先在路由器上声明使用OSPF 路由协议,命令格式如下:
Router (config)#router ospf process-id
在该命令中,process-id 是进程号,范围是1~65 535。在同一个使用OSPF 路由协议的网络中的不同路由器可以使用不同的进程号。一台路由器可以启用多个OSPF 进程。
在声明使用OSPF 路由协议之后,我们还要在OSPF 路由协议里发布网段,命令格式如下:
Router (config-router ) #network address wildcard-mask area area-id
在该命令中,address 可以是网段。子网或者接口的地址:wildcard-mask 称为通配符号掩码,它与子网掩码正好相反,但是作用是一样的;area-id 是区域标识,它的范围是0-65535,区域0是骨干区域,OSPF 路由协议在发布网段的时候必须指明其所属的区域,在单区域的的OSPF 配置里区域标识必须是0
下面是一组OSPF 的配置命令示范: Router (config)#router ospf 1
Router (config-router ) #network 10.0.0.0 0.255.255.255 area 0 Router (config-router ) #network 172.16.0.0 0.0.255.255 area 0 Router (config-router ) #network 192.168.1.0 0.0.0.255 area 0 Router (config-router ) #network 192.168.2.1 0.0.0.0 area 0 2. 在路由器上配置环回接口的命令
我们已知道,运行OSPF 路由协议的路由器需要一个标识,该标识可以是路由器的所有物理接口上配置的最大的IP 地址。但是物理接口由于线路等原因有可能会从UP 变成为DOWN 的状态。为了稳定起见,我们可以在运行OSPF 路由协议的路由器上配置环路接口,它不会变成为DOWN 的状态。
声明环回的命令格式如下:
Router (config)#interface loopback number
然后可以在该接口下配置地址,该接口不必使用no shutdown 命令。 图9-18
图9-18 配置环回接口命令
取消环回接口的命令格式如下:
Router (config)#no interface loopback number 图9-19给出了取消环回接口的命令实例。
图9-19 取消环回接口的命令
3. 更改优先级的命令
运行OSPF 路由协议的路由器之间会比较各自的优先级,优先级高的路由器将成为DR 。优先级的范围为0~255,其中如果优先级为0,则该路由器永远不能成为DR 。路由器上默认的优先级是1。我们可以改变某一台路由器的优先级,使得该路由器成为DR 或者永远不会成为DR 。
更改优先级的命令格式如下:
Router (config-if ) #ip ospf priority number 图9-20给出了更改优先级命令的实例。
图9-20更改优先级的命令
我们可以使用如下命令查看接口上的优先级及其他关键信息: Router #show ip ospf interface type number 图9-21显示了该命令查看的部分内容。
图9-21 show ip ospf interface 命令的部分内容
2. 更改链路开销的命令
OSPF 路由协议是通过对链路的带宽计算得出路径的开销值的,计算公式是:
链路开销=108/带宽(bps )
在串行接口上链路的带宽默认为1.544Mbps 。Cisco IOS 会根据接口的带宽自动计算链路开销的值,表9-1介绍了部分链路的开销值。
表 9-1 部分链路的开销
我们可以通过使用如下的命令更改接口的带宽,则该链路的开销也会相应改变: Router (config)# interface serial 0/0 Router (config-if )# bandwidth 64
另外,我们可以通过如下命令直接在接口上更改开销: Router (config-if )#ip ospf cost number 其中开销值可以是1~65535之间的数值。 3. 应用邻居验证的命令
在默认情况下,路由器相信它所收到的路由信息是没有被篡改的。但是如果网络环境无法保证该信任,我们可以使用邻居验证的方法来保证路由器收到的路由信息确实是它的邻居发出的。
我们可以在路由器的接口上配置验证的密码,该密码最多可以有8位字符。该接口所连接的邻居路由器的相应接口也要配置验证的密码。这样,当两台路由器互相发送Hello 包时,Hello 包里就会带有验证的信息,如果该信息不匹配,则无法形成邻居关系。 在接口上配置验证密码的命令格式如下:
Router (config-if )#ip ospf authentication-key password
当配置完接口的验证密码之后,还要在OSPF 路由协议里声明使用邻居验证,命令格式
如下:
Router (config-router )#area area-number authentication
这种配置方式下,密码是在网络上以明文的方式传送的,为了安全起见,我们也可以配置MD5加密的密码验证,其接口上的配置命令格式如下:
Router (config-if )#ip ospf message-digest-key key-id md5 encryption-type key 其中key-id 可以是1~255之间的数。两台路由器如果要成为邻居,该数值必须配置得一样。而encryption-type key 可以是0~7之间的数。它表示加密的程度,0表示不加密,7表示最大程度的加密。
在OSPF 路由协议里声明使用加密的邻居验证的命令如下:
Router (config-router )#area area-id authentication message-digest 该种邻居验证方式不会在网络中以文明的方式传递密码,安全性大大增加了。图11-25是MD5加密的密码验证的实例。
图 9-22 MD5加密的密码验证实例
4. 更改Hello-interval 和dead-interval 的命令
Hello-interval 是路由器发出Hello 包的时间间隔,dead-interval 是邻居关系失效的时间间隔。默认的Hello-interval 是10秒,而dead-interval 是40秒。在非广播多路访问网络,默认的Hello-interval 是30秒,而dead-interval 是120秒。当在dead-interval 之内没有收到邻居的Hello 包时,一旦dead-interval 超时,路由器会认为该邻居已经离线。
如果路由器的Hello-interval 或dead-interval 配置不相同,则两台路由器不能形成邻居关系。所以更改该参数时一定要小心。一下是更改Hello-interval 和dead-interval 的命令格式:
Router (config-if ) #ip ospf hello-interval seconds Router (config-if ) #ip ospf dead-interval seconds 图9-23
图9-23更改Hello-interval 和dead-interval 的命令
5. 配置默认静态路由的命令
在OSPF 的非骨干区域里,区域的内部路由器不需要了解其他区域的路由,它们只需要使用一条默认的静态路由,把目的地是其他区域的数据包路由给边界路由器。
在路由器上配置默认静态路由的命令格式如下:
Router (config-if )#ip route 0.0.0.0.0.0.0.0 [interface | next-hop address] 如果在区域里的每台路由器上都配置默认静态路由命令,我们的工作量是比较大的我们可以在边界路由器上使用如下命令,使得区域内部的路由器能够从边界路由器学习到该默认路由:
Router (config-router ) #default-information originate 通过使用该命令,区域内部的路由器将会把边界路由器作为它们的网关。
9.8.2 检验OSPF 配置的命令
常见的OSPF 配置问题和检验OSPF 配置的命令如下。 1. 常见的OSPF 配置问题
一台运行OSPF 路由协议的路由器需要和其他相邻的路由器建立邻居关系,然后它才能和这些路由器互相交换链路状态的信息,从而学习路由。如果路由器无法和其它路由器建立邻居关系,那么它将不能学习到路由。导致路由器不能建立邻居关系的配置问题如下。
● 相邻的路由器互相不发送Hello 包。
● 相邻的路由器的Hello-interval 和dead-interval ● 连接路由器的接口属于不同的网络类型。 ● 邻居验证的密码或关键字不同。
另外,在配置OSPF 路由协议的时候,我们还要保证: ● 在路由器的接口上配置的IP 地址和子网掩码正确无误。 ● 在发布网段的时候使用了正确的通配符掩码。 ● 网段发布到了正确的区域。 2. 检验OSPF 配置的命令
我们可以使用下面这些命令来检查OSPF 路由协议是否正确。 ● show ip ospf interface
该命令用来检查接口是否被配置在相应的区域里,另外我们也可以看到该接口所连接的邻居,以及在接口上的Hello-interval 和dead-interval 的这两个参数。 ● show ip ospf
使用该命令我们可以看到链路状态更新的时间间隔及网络收敛的次数等信息。 ● show ip ospf neighbor detail
该命令显示邻居的详细信息的列表,包括它们的优先级和当前的状态。 ● show ip ospf database
该命令显示路由器管理的拓扑表的内容、路由器标识和OSPF 进程号。 3.OSPF 的clear 和debug 命令
当我们对OSPF 的配置进行了改变(比如更改了所发布的网段)之后,如果这种改变在路由表反映得比较慢,我们可以使用下面的命令来清一下路由表,让路由表立刻开始更新:
Router#clear ip route *
这个命令可以清空整个的路由表,让路由器重新建立路由表。 当然我们也可以指定某一条路由条目,只清空该条目,命令如下: Router#clear ip route a.b.c.d
如果我们怀疑OSPF 的链路状态更新包有问题,我们可以使用如下命令检查: Router#debug ip ospf events 该命令会报告所有的OSPF 事件。 而下面这个命令:
Router#debug ip ospf adj 会报告关于邻居的OSPF 事件。