开放最短通路优先协议(OSPF)
(1)基本特点
随着因特网规模的不断扩大,RIP协议的缺点渐趋明显。为了克服RIP协议存在的缺点,于1989年开发出开放最短通路优先OSFP(Open Shortest Path First)协议,目前OSPF2已成为因特网标准协议(RFC 2328)。由于多数路由器制造商都支持OSFP,它已成为最主要的内部网关协议。
OSFP协议采用了“开放”的设计思想,并使用了Dijkstra所提出的最短通路算法。它的主要特征是它是一种分布式的链路状态协议(link state protocol),其基本特点是:
① 路由器采用洪泛法向本自治系统中的所有路由器发送路由信息。所谓洪泛法是指路由器把收到的信息通过除输入链路之外的所有输出链路转发给相邻的路由器,而且每一个相邻路由器又将收到的信息再次发往相邻的路由器。路由器依据链路状态数据库中的数据,使用Dijkstra算法计算出自己的路由表。仅当链路状态发生变化,路由器才用洪泛法向所有路由器发送路由信息,路由器据此计算路由表,更新链路数据库。因此,OSFP的更新收敛过程较快。OSFP对“链路状态”的变化用一个32位的序号来表示,序号越大则状态越新。OSFP规定,链路状态序号的增长速率不得超过5s/次。按此计算,600年内不会产生序号重复。
② 所有的路由器都维持一个链路状态数据库。所谓路由器的“链路状态”是指该路由器与哪些网络或路由器相邻,以及该链路的“度量”。有时为了方便起见,也称“度量”为“代价”。OSFP用“度量”来表示费用、距离、时延、带宽等。这些均可由网络管理人员进行设定。OSFP可根据IP分组的不同类型对不同的链路设置成不同的代价。例如,对于非实时业务的高带宽卫星链路可设置为较低的代价,而对时间敏感的实时业务设置为较高的代价。链路的代价用一个无量纲的16位二进制数(相当于十进制数1~65535)来表示。
③ OSFP对于到同一目的网络存在多条相同代价的路径,可以进行通信量的分配,以达到多条路径间的负载平衡。
④ OSFP对路由器之间交换的路由信息具有鉴别的功能,保证了仅在可信赖的路由器之间交换链路状态信息。
⑤ OSFP支持变长子网划分和无分类编址CIDR。
由此可见,OSFP协议的工作原理与RIP协议不同。OSFP是依靠各路由器间频繁地交换信息动态地更新链路状态数据库,并维持这个数据库在全网范围内的一致性。每一个路由器都知道全网的拓扑结构和各链路的代价。每一个路由器使用链路状态数据库中的数据,构造出自己的路由表。
需要指出的是,OSPF分组不是用UDP而是直接用IP数据报传送的(注:IP数据报首部的协议字段值为89),可见OSPF协议的位置在网络层。且OSPF构成的数据报很短,这样做可减少路由信息的通信量,且不必将长的数据报进行分片传送。
(2)自治系统的划分
为了使OSPF能够用于规模较大的网络,OSPF将一个自治系统AS划分成若干个规模较小,且不重叠的区域(area)。一个区域是一个网络或一组邻近的网络,并以一个32位的区域标识符(用点分十进制)表示。一个区域内的路由器数目最好限制在200个以内,以免区域的规模过大。
划分区域的想法在于把利用洪泛法交换链路状态信息的范围局限在每一个区域之内,而不是整个自治系统,从而减少网络的通信量。OSFP采用层次结构的区域划分方法,每一个AS有一个主干区域(backbone area),称为0号区域,其标识符为 0.0.0.0。同一AS内的所有区域都连接到主干区域上,因此从AS的任何一个区域出发,经过主干区域,就可以到达该AS的其他区域。采用分层次划分区域的方法,虽然使交换信息的种类增加,同时也使OSFP协议更加复杂,但却使每个区域内的交换路由信息的通信量大大减少,这就使得OSFP协议能够用于规模很大的自治系统当中。
图6-23表示主干区域与其他区域之间的关系。图中,OSFP所使用的路由器有4种:
① 在一个区域使用的内部路由器(如R2、R5~R8);
② 连接两个或多个区域的区域边界路由器(如R3、R4);
③ 位于主干区域内的主干路由器(如R1~R4);
④ 位于AS边界上的AS边界路由器(如R1)。
这些路由器允许兼用,如R3和R4既是主干路由器,也是区域边界路由器。显然,每一个区域至少有一个区域边界路由器。所有区域边界路由器都是主干区域中的路由器,反之,主干区域中的路由器不一定是区域边界路由器。
(3)OSFP分组的格式
OSFP分组由首部和数据部分组成,如下图所示。
首部的各字段的含义如下:
① 版本(8位)。指明OSFP协议的版本号,当前版本号为2。
② 类型(8位)。指明5种分组类型之一。
③ 分组长度(16位)。指明包含分组首部在内的长度(以字节为单位)。
④ 路由器标识符(32位)。表示发送该分组的路由器端口的IP地址。
⑤ 区域标识符(32位)。表示路由器所属区域的标识符。
⑥ 检验和(16位)。用于检测分组存在的差错。
⑦ 鉴别类型(16位)。目前只有两种,0(不用)和1(口令)。
⑧ 鉴别(64位)。鉴别类型为0时填入0,否则就填入8个字符的口令。
数据部分是某一种OSPF分组类型。OSPF共有5种分组类型:
① 问候分组(hello)。用于发现和维持邻站的可达性。OSFP规定,每两相邻路由器每隔10秒要交换一次问候分组,以便确知哪些邻站是可达的。因为只有可达邻站的链路状态信息才存入链路状态数据库,并由此计算出路由表。若40秒内没有收到某个相邻路由器发来的问候分组,则可认为该相邻路由器是不可达的,应立即修改链路状态数据库,并重新计算路由表。
② 数据库描述分组(database description)。向邻站提供自己链路状态数据库中的所有链路状态项目的摘要信息。
③ 链路状态请求分组(link state request)。向邻站请求发送某些链路状态项目的详细信息。
④ 链路状态更新分组(link state update)。用洪泛法向全网更新链路状态。路由器使用该分组类型将其链路状态通信邻站,以便更新路由表。链路状态更新分组共有5种,表示5种不同的链路状态。
⑤ 链路状态确认分组(link state acknowledgment)。对链路更新分组的确认。
上述后4种分组类型都是用来维持链路状态数据库的同步。所谓“同步”是指不同路由器的链路状态数据库的内容保持一致。两个同步的路由器称为完全邻接(fully adjacent)路由器。显然,相邻路由器与完全邻接路由器不是同一个概念。相邻路由器只强调物理上的相邻性,而完全邻接路由器既表明它们在物理上是相邻的,更强调它们的链路状态数据库的一致性。 当一台路由器刚启动时,它通过发送“问候”分组得知与它相邻的路由器是否工作。为了减少网络通信量,OSFP协议要求路由器使用“数据库描述”分组与相邻的路由器交换本数据库中已有的链路状态摘要信息。此后,路由器就可使用“链路状态请求”分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的这些分组交换,全网同步的链路数据库就建立起来了。
在网络运行过程中,每台路由器周期性地把“链路状态更新”分组发送给它的邻接路由器,此分组含有一个序列号。当邻接路由器收到后,以“链路状态确认”分组予以应答,并通过判别序列号来确定链路状态信息的新旧,从而决定是否更新路由表。当一条链路刚刚启用或停止使用,或者链路状态发生变化,路由器都要发送“链路状态更新”分组。为了确保链路状态数据库与全网的状态保持一致,OSPF规定每隔一段时间(如30分钟),要刷新一次数据库中的链路状态。