随着 Internet 技术在全球范围内的飞速发展, IP 网络作为一种最有前景的网络技术,受到了人们的普遍关注。而作为 IP 网络生存、运作、组织的核心 ——IP路由 技术提供了解决 IP 网络动态可变性、实时性、 QoS 等关键技术的一种可能。在众多的路由技术中, OSPF协议 已成为目前 Internet 广域网和 Intranet 企业网采用最多、应用最广泛的路由技术之一。本文在分析 OSPF 动态路由 协议 基本工作原理的基础上,提出了 Dijkstra 算法和 OSPF 路由表计算的实现方法。
 
  目前应用较多的路由 协议 RIP OSPF ,它们同属于内部网关协议,但 RIP 基于距离矢量算法,而 OSPF 基于链路状态的最短路径优先算法。它们在网络中利用的传输技术也不同。
 
    RIP 是利用 UDP 520 号端口进行传输,实现中利用套接口编程,而 OSPF 则直接在 IP 上进行传输,它的协议号为 89. RIP 当中,所有的路由都 由跳数来描述,到达目的地的路由最大不超过 16 跳,且只保留唯一的一条路由,这就限制了 RIP 的服务半径,即其只适用于小型的简单网络。同时,运行 RIP 的路由器需要定期地(一般 30s )将自己的路由表广播到网络当中,达到对网络拓扑的聚合,这样不但聚合的速度慢而且极容易引起广播风暴、累加到无穷、路由 环致命等问题。为此, OSPF 应运而生。 OSPF 是基于链路状态的路由协议,它克服了 RIP 的许多缺陷:
 
  第一, OSPF 不再采用跳数的概念,而是根据接口的吞吐率、拥塞状况、往返时间、可靠性等实际链路的负载能力定出路由的代价,同时选择最短、最优路由并允许保持到达同一目标地址的多条路由,从而平衡网络负荷;
 
  第二, OSPF 支持不同服务类型的不同代价,从而实现不同 QoS 的路由服务;
 
  第三, OSPF 路由器不再 交换 路由表,而是同步各路由器对网络状态的认识,即链路状态数据库,然后通过 Dijkstra 最短路径算法计算出网络中各目的地址的最优路由。这样 OSPF 路由器间不需要定期地 交换 大量数据,而只是保持着一种连接,一旦有链路状态发生变化时,才通过组播方式对这一变化做出反应,这样不但减轻了不参与系统的负荷而且达到了对网络拓扑的快速聚会。而这些正是 OSPF 强大生命力和应用潜力的根本所在。
 
  一、 OSPF 工作原理分析
 
    OSPF 是一种分层次的路由协议,其层次中最大的实体是 AS (自治系统),即遵循共同路由策略管理下的一部分网络实体。在每个 AS 中,将网络划分为不同 的区域。每个区域都有自己特定的标识号。对于主干( backbone )区域,负责在区域之间分发链路状态信息。这种分层次的网络结构是根据 OSPF 的实际 提出来的。当网络中自治系统非常大时,网络拓扑数据库的内容就更多,所以如果不分层次的话,一方面容易造成数据库溢出,另一方面当网络中某一链路状态发生 变化时,会引起整个网络中每个节点都重新计算一遍自己的路由表,既浪费资源与时间,又会影响路由协议的性能(如聚合速度、稳定性、灵活性等)。因此,需要 把自治系统划分为多个域,每个域内部维持本域一张唯一的拓扑结构图,且各域根据自己的拓扑图各自计算路由,域边界路由器把各个域的内部路由总结后在域间扩 散。这样,当网络中的某条链路状态发生变化时,此链路所在的域中的每个路由器重新计算本域路由表,而其它域中路由器只需修改其路由表中的相应条目而无须重 新计算整个路由表,节省了计算路由表的时间。
 
   OSPF 由两个互相关联的主要部分组成: 呼叫 协议和 可靠泛洪 机制。呼叫协议检 测邻居并维护邻接关系,可靠泛洪算法可以确保统一域中的所有的 OSPF 路由器始终具有一致的链路状态数据库,而该数据库构成了对域的网络拓扑和链路状态的 映射。链路状态数据库中每个条目称为 LSA (链路状态通告),共有 5 种不同类型的 LSA ,路由器间交换信息时就是交换这些 LSA. 每个路由器都维护一个用 于跟踪网络链路状态的数据库,然后各路由器的路由选择就是基于链路状态,通过 Dijkastra 算法建立起来最短路径树,用该树跟踪系统中的每个目标的最 短路径。最后再通过计算域间路由、自治系统外部路由确定完整的路由表。与此同时, OSPF 动态监视网络状态,一旦发生变化则迅速扩散达到对网络拓扑的快速 聚合,从而确定出新的网络路由表。
 
   OSPF 的设计实现要涉及到指定路由器、备份指定路由器的选举、协议包的接收、发送、泛洪机制、路由表计算等一系列问题。本文仅就 Dijkstra 算法与路由表的计算进行讨论。
 
  二、 Dijkstra 算法
 
   Dijkstra 算法是路由表计算的依据,通过 Dijkstra 算法可以得到有关网络节点的最短路径树,然后由最短路径优先树得到路由表。
 
   1.Dijkstra 算法的描述如下:
 
  ( 1 )初始化集合 E ,使之只包含源节点 S ,并初始化集合 R ,使之包含所有其它节点。初始化路径列 O ,使其包含一段从 S 起始的路径。这些路径的长度值等于相应链路的量度值,并以递增顺序排列列表 O.
 
  ( 2 )若列表 O 为空,或者 O 中第 1 个路径长度为无穷大,则将 R 中所有剩余节点标注为不可达,并终止算法。
 
  ( 3 )首先寻找列表 O 中的最短路径 P ,从 O 中删除 P. V P 的最终节点。若 V 已在集合 E 中,继续执行步骤 2. 否则, P 为通往 V 的最短路径。将 V R 移至 E.
 
  ( 4 )建立一个与 P 相连并从 V 开始的所有链路构成的侯选路径集合。这些路径的长度是 P 的长度加上与 P 相连的长度。将这些新的链路插入有序表 O 中,并放置在其长度所对应的等级上。继续执行步骤 2.
 
   2.Dijkstra 算法举例:
 
  下面我们以路由器 A 为例,来说明最短路径树的建立过程:
 
  ( 1 )路由器 A 找到了路由器 B C ,将它们列入候选列表 {B 1 C 2}.
 
  ( 2 )从候选列表中找出最小代价项 B ,将 B 加入最短路径树并从候选列表中删除。接着从 B 开始寻找,找到了 D ,将其放入候选列表 {C 2 D 2}.
 
  ( 3 )从列表中找出 C ,再由 C 又找到了 D. 但此时 D 的代价为 4 ,所以不再加入候选列表。最后将 D 加入到最短路径树。此时候选列表为空,完成了最短路径树的计算。
 
  三、 OSPF 路由表的计算与实现
 
  有关路由表的计算是 OSPF 的核心内容,它是动态生成路由器内核路由表的基础。在路由表条目中,应包括有目标地址、目标地址类型、链路的代价、链路的存活时间、链路的类型以及下一跳等内容。关于整个计算的过程,主要由以下五个步骤来完成:
 
  ( 1 )保存当前路由表,当前存在的路由表为无效的,必须从头开始重新建立路由表;
 
  ( 2 )域内路由的计算,通过 Dijkstra 算法建立最短路径树,从而计算域内路由;
 
  ( 3 )域间路由的计算,通过检查 Summary-LSA 来计算域间路由,若该路由器连到多个域,则只检查主干域的 Summary-LSA
 
  ( 4 )查看 Summary-LSA :在连到一个或多个传输域的域边界路由器中,通过检查该域内的 Summary-LSA 来检查是否有比第( 2 )( 3 )步更好的路径;
 
  ( 5 AS 外部路由的计算,通过查看 AS-External-LSA 来计算目的地在 AS 外的路由。
 
  通过以上步骤, OSPF 生成了路由表。但这里的路由表还不同于路由器中实现路由转发功能时用到的内核路由表,它只是 OSPF 本身的内部路由表。因此,完成上述工作后,往往还要通过路由增强功能与内核路由表交互,从而实现多种路由协议的学习。
 
    OPSF 作为一种重要的内部网关协协议的普遍应用,极大地增强了网络的可扩展性和稳定性,同时也反映出了动态路由协议的强大功能。但是,在有关 OSPF 协议的研究、实现中尚存在一些问题,如数据库的溢出、度量的刻画、以及 MTU 协商等等。同时,在 IPv6 中, OSPFv3 基于链路的处理机制、 IP 地址的 变化、泛洪范围的增加、包格式、 LSA 的变化以及邻居的识别等技术都将是我们共同探讨的课题。