7.5 OSPF
OSPF(Open Shortest Path First,开放最短路径优先)是一种链路状态性的路由协议,即使网络中有环路,也可以进行稳定的路由控制。
另外,OSPF支持子网掩码,使得在RIP中无法实现的可变长度子网构造的网络路由控制成为现实。
为了减少网络流量,OSPF引入了“区域”的概念,其将一个自治网络划分为若干个更小的范围,由此可以减少路由协议之间不必要的交换。
OSPF还可以针对IP首部中的区分服务(TOS)字段,生成多个路由控制表。但也有实现了OSPF的路由器无法支持TOS的情况。
OSPF是链路状态型路由协议,路由器之间交换链路状态用于生成网络拓扑信息,然后根据该拓扑信息生成路由控制表。
RIP的路由选择,要求途中经过的路由器个数越少越好。与之相比,OSPF可以给每条链路赋予一个权重(cost),并始终选择一个权重最小的路径最为最终路由,始终选择一个总的带教最小的一条路径。如下图所示:
OSPF的基础知识
首先讲一些概念性的东西。
连接到同一个链路的路由器统称为相邻路由器(Neighboring Router)
。在一个相对简单的网络结构中,例如每个路由器仅限一个路由器相互连接时(使用PPP相连),相邻路由器之间可以交换路由信息。但若是在一个比较复杂的网络中,例如在同一个链路中加入了以太网或FDDI等路由器时,就不需要在所有相邻的路由器之间都进行控制信息的交换,而是确定一个指定路由器(Designated Router)
,以它为中心交换路由信息即可。
RIP还有一个缺点是,其包类型只有一种,以便确认是否连接网络,一边传送网络信息,但是这种方式每次交换的路由控制信息会随着网络个数而增加,且在网络稳定时,也要定期交换,在一定程度上浪费了网络带宽。
OSPF中,根据作用不同,有五种类型的包,见下表
**问候(HELLO)**包,用于确认是否连接;
**数据库描述包(Database Description)**则用于每个路由器同步路由控制信息,相互发送路由摘要信息和版本信息;
**链路状态请求包(Link State Request)**则请求路由控制信息;
**链路状态更新包(Link State Update)**则接收路由状态信息;
**链路状态确认包(Link State ACK Packet)**通知大家本地已经接收到路由控制信息。
OSPF 工作原理概述
本小节用于介绍OSPF具体如何工作。
OSPF中,进行连接确认的协议叫做HELLO协议。
LAN中每10秒发送一个HELLO包,若没有该包到达,则进行连接是否断开的判断(注:该时间可以由管理员自定义,且必须保证同链路中数值相同):允许空等3次,直到第4次(40秒后)仍无任何反馈就认为连接已经断开。之后再进行连接断开或恢复连接操作时,由于链路状态发生了变化,路由器就会发送一个链路状态更新包(Link State Update Packet)通知其他路由器网络状态的变化。
链路状态更新包所要传达的消息大致分为两类:
- 网络LSA(Network Link State Advertisement,网络链路状态通告),以网络为中心生成的信息,表示该网络与那些路由器相连。
- 路由器LSA(Router Link State Advertisement,网络链路状态通告),以路由器为中心生成的信息,表示该路由器与哪些网络相连。
这两种信息主要采用OSPF发送,每个路由器都可以生成一个可以表示网络结构的链路状态数据库,并结合Dijkstra算法(最短路径优先算法)生成相应的路由控制表。
与距离向量算法相比,链路状态算法生成的路由控制表更加清晰不容易混淆,且可以有效地降低无限循环问题的发生。但是当网络规模逐渐增大时,最短路径优先算法的处理时间就会变长,对CPU和内存的消耗也就越大。
本篇刚开始时,我们曾说过,OSPF中有区域的概念。
此举的目的,正是为了解决网络规模逐渐增大时,减少计算负担。
区域
指连接在一起的网络和主机划分为小组,使一个自治系统内可以拥有多个区域,其中必须有一个主干区域(Backbone Area,ID为0,逻辑上只能有一个,物理上可以划分为多个),且所有其他区域都必须与主干区域相连接(若实际与此不符,需要使用OSPF的虚拟链路功能设置虚拟主干或区域)。如下图所示:
连接区域与主干区域的路由器称作区域边界路由器
;
区域内部的路由器则称作内部路由器
;
只与主干区域内连接的路由器叫做主干路由器
;
与外部连接的路由器就是AS边界路由器
。
每个区域内都有其网络拓扑的数据库,区域之外的路径信息只能从区域边界路由器那里知悉,且区域边界路由器也不会将区域内的链路状态信息全部原样发送给其他区域,只会发送自己到达这些路由器的距离信息。由此,内部路由器持有的网路拓扑数据库就会明显变小。
换句话说就是,内部路由器只需了解本区域内的链路状态信息,在此基础上计算出路由控制表,该机制有效的减少了路由控制信息,还能减轻处理负担。(很好理解,当一个帮派人足够多时,例如丐帮,就需要分舵和舵主,替帮主管理)。
此外,作为区域出口的区域边界路由器如果只有一个(一夫当关),就叫做末端区域
,如上图中的区域2,其区域边界路由器(上图中为路由器E)将成为默认路径,传送路由信息。
最后,OSPF作为链路状态路由算法的一种框架,想要构造一个稳定的网络,区域设计与物理设计同样重要,如果区域设计不合理,就有可能无法充分发挥OSPF的优势。
本篇小结
本篇介绍了基于链路状态算法的OSPF(开放最短路径优先)协议。
其通过路由器之间交换链路状态信息,用以在路由器中生成网络拓扑信息。
OSPF以链路代价(也称为权重)为计算标准,选取时会挑选总代价最小的一条路径。与总是选择路由器个数最小的RIP不同。
OSPF中,连接到同一个链路的路由器称为相邻路由器;如果在一个较为复杂的网络中,可以确定一个指定路由器,所有相邻路由都和它进行控制信息的交换。
RIP中,信息只有距离和方向,而在OSPF中,根据作用不同可以分为以下五种包:
- 问候:用以确定相邻路由器和指定路由器
- 数据库描述:链路状态数据库的摘要信息
- 链路状态请求:请求从数据库中获取链路状态信息
- 链路状态更新:更新链路状态数据库的链路状态信息
- 链路状态确认应答:链路状态信息更新的确认应答
问候包用以定期发送给周围的路由器,允许空等三次,若第4次仍无任何反馈就可以认为连接已断开。而在进行连接断开或恢复连接时,会发送链路状态更新包通知其他路由器网络状态发生了变化。
链路状态更新包要传达的消息大致分为两类:网络链路状态通告和路由链路状态通告。
经过状态信息的不停更新,路由器便可以生成一个代表当前网络结构的链路状态数据库,根据此数据库,结合Dijkstra算法(最短路径优先算法)生成相应的路由控制表。
为了缓解网络过于复杂导致每次链路状态更新过久、数据库过大的问题,OSPF中可以将一个自治区域划分为多个区域,其中必须有一个主干区域,且其他区域都要与主干区域相连接。
在这种划分下,路由器也有了别名:
- 连接区域与主干区域的路由器称为区域边界路由器
- 区域内部的路由器叫做内部路由器
- 只与主干区域连接的路由器叫做主干路由器
- 与外部相连接的路由器是AS边界路由器
区域内的路由持有基于本区域的网络拓扑的链路状态数据库。区域之外的信息,有区域边界路由器处获取各网络的距离。
末端区域指只有一个区域边界路由器。