1

路由选择协议三剑客--OSPF协议

一、背景
RIP会出现路由环路或者坏消息传递慢的问题。OSPF(Open Shortest Path First, OSPF)即开放最短路径优先,是为了克服RIP的缺点在1989年设计出来。

  • “开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。
  • “最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF(Shortest Path First, SPF)。

Dijkstra算法的基本思路:

  • 需要指定起点
  • 引进两个集合,分别记录已计算的顶点及最短路径长度和非计算的顶点和最短路径,相邻则有最短路径,非相邻则距离为无穷大。
  • 通过遍历迭代,将非计算结合的顶点的最短路径更新到已计算的顶点集合里,最后得出整个图的最短路径。
    OSPF采用SPF算法计算路由,从算法上保证了不会出现路由环路,OSPF相对RIP,不限制网络规模,更新效率高、收敛速度快。
    OSPF是基于链路状态的,而不是像RIP是基于距离度量的。这里的链路状态是指路由器的路由器相邻关系和相应的链路代价(cost),这里参考Dijkstra算法。代价用来表示费用、距离、时延、带宽等等,这些都由网络管理员决定。
    例如思科路由器中OSPF计算代价的方法是用100Mbps链路带宽。
  • 计算结果小于1的值仍然记为1
  • 计算结果大于1的值且有小数的,舍去小数

显然考虑的是带宽因素,假设有如下图网络

来计算一下其链路状态是多少。

链路状态是后续相邻路由器之间主要交互的信息。
二、OSPF基本原理
1.OSPF问候分组
问候分组即Hello分组,Hello分组封装在IP数据报中,发往组播地址224.0.0.5,该数据报文头部结构如下:

IP数据报首部中的协议号字段的取值应为89,来表明数据报的数据载荷为OSPF分组。问候分组的发送周期为10秒,若40秒内未收到来自邻居路由器的问候分组,则认为邻居路由器不可达,因此每个路由器都会建立一张邻居表,里面有一个值是死亡倒计时,就是40秒。如果40秒内一直收不到来自某个邻居路由器的问候分组,则认为此邻居路由器已经死亡,即不可达,具体实例:

假设R1路由器的一张邻居表,R2是R1的一个邻居路由器,R1中的邻居ID就是R2来标识,R2连接到R1的接口1上,此时“死亡倒计时”还剩余36秒,弱在死亡倒计时到0之前收到来自R2的问候分组,则重新将R2对应的“死亡”倒计时置为40秒重新倒计时。否则,当死亡倒计时到达0时,则判定该邻居路由器不可达。
2.OSPF链路状态通告LSA
使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement),LSA包含:

  • 直连网络的链路状态信息
  • 邻居路由器的链路状态信息

以R4为例,R4的链路状态通告应包含R4余该直连网络的链路信息、其邻居路由器R1和邻居路由器R3的链路状态信息。

LSA被封装在链路状态更新分组LSU(Link State Update, LSU)中,采用洪泛法发送,收到链路状态更新分组的路由器,将从自己所有其他接口转发此分组,也就是进行洪泛转发。
这样,自治系统内每个路由器所发送的封装有LSA的LSU会传递给系统内其他所有路由器。
使用OSPF的每个路由器都会一个链路状态数据库LSDB(Link State DataBase, LSDB),用于存储LSA。

通告各路由器洪泛发送封装有自己LSA的LSU分组,各路由器的LSDB状态最终将达到一致。
使用OSPF的各路由器,基于LSDB进行最短路径优先SPF计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。

三、OSPF工作流程
OSPF有五种分组类型:

  • 类型1:问候(hello)分组,用来发现和维护邻居路由器的可达性
  • 类型2:数据库描述(Database Description)分组,向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
  • 类型3:链路状态请求(Link State Request)分组,向邻居路由器请求发送某些链路状态项目的详细信息
  • 类型4:链路状态更新(Line State update)分组,路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态
  • 类型5:链路状态确认(Link State Acknowledgement)分组,这是对链路状态更新分组的确认分组

结合下图说明五种分组类型及其相应的作用。

  • 第一步:相邻路由器之间周期性发送问候分组,以便建立和维护邻居关系
  • 第二步:建立邻居关系后,给邻居路由器发送数据库描述分组,也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器(由于OSPF是增量更新,那么如何判断增量呢?无非是先跟别人要一个全量的简单信息,看缺哪些就走到第三步)
  • 第三步:例如R1收到R2的数据库描述分组后,发现自己缺少其中的某些链路状态项目,则向R2发送链路状态请求分组
  • 第四步:R2收到来自R1的链路状态请求分组后,将R1所缺少的链路状态项目的详细信息封装在链路状态更新分组LSU中发送给R1
  • 第五步:R1收到后将这些所缺少的链路状态项目的详细信息添加到自己的链路状态数据中,并给R2发送链路状态确认分组

反之,R2也可以向R1发送链路状态请求分组,过程一样,最终R1和R2的链路状态数据库将达到一致,这就是链路状态数据库同步的过程。

备注:每30分钟或链路状态发送变化时,路由器都会发送链路状态更新分组,收到该分组的其他路由器将洪泛转发该分组,并给该路由器发回链路状态确认分组,这又被称为新情况下链路状态数据库同步。

四、OSPF拓展
OSPF-DR
OSPF路由器会周期性地发送问候分组以建立和维护邻居关系,是往多播地址224.0.0.5发送的,那么当OSPF路由器子啊多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量的多播分组。

如上图,每个路由器之间互为邻居路由器,那么每个路由器都要向其他(N-1)个路由器发送问候分组和链路状态更新分组。
如何解决这个问题呢?
我们会选择指定路由器DR(designated router)和备用的指定路由器BDR(backup 的designated router)。假设下面这两个路由器被选举为DR和BDR,那么所有非DR/BDR
的路由器只与DR/BDR路由器建立邻居关系,非DR/BDR之间不能直接交互信息。

这样邻居关系数量大大减少。若DR出现问题,则有BDR顶替,实现DR和BDR的选举并不复杂,无非就是各路由器之间交互一些选举参数,例如路由器优先级、路由器ID、接口
IP地址等,然后根据选举规则选出DR和BDR。

备注:无论是问候分组机制,还是链路状态通告机制,还是选择DR机制,其实这些在分布式系统中,都是差不多的思路。

五、OSPF再划分-区域
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,称为区域。
原本是一个大的自治系统AS:

OSPF将其划分为三个更小的区域

每个区域都有一个32比特的区域标识符,可以用点分十进制表示,例如主干区域标识符必须为0,可以表示为点分十进制0.0.0.0.
主干区域用于其他区域,其他区域标识符不能为0且互不相同,每个区域的规模不应太大,一般所包含的路由器不应超过200个。
这样划分区域的好处是,把利用洪泛法交互链路状态信息的范围局限于每个区域而不是整个自治系统,这样就减少了整个网络的通信量。如果路由器的所有接口都在一个区域内,这类路由器称为区域路由器。
为了本区域可以和自治系统内其他区域连通,每个区域都会有一个区域边界路由器,他的一个接口连接自己所在区域,另一个接口用于连接主干区域。
可见区域边界路由器就是一个城门,以区域0和区域1之间的区域边界路由器为例,它向主干区域发送0.0.0.1的链路状态通告LSA信息,并且向0.0.0.1区域发送主干区域0.0.0.0和0.0.0.2的链路状态通告LSA信息。
主干区域内的路由器称为主干路由器,我们可以将区域边界路由器和主干区域内的路由器都看作是主干路由器。
此外,主干区域内还有一个特殊的路由器:专门和本自治系统外的其他自治系统交换路由信息,这样的路由器称为自治系统边界路由器。
上述几类路由器可归类为:

  • 区域内路由器IR(internal router)
  • 区域边界路由器ABR(area border router)
  • 主干路由器BBR(backbone router)
  • 自治系统边界路由器ASBR(AS border router)

这种区域划分的方式,虽然使得OSPF更加复杂,但是大大降低了整个自治系统的通信量,因而使得OSPF可以适用于规模很大的自治系统中。

posted @ 2024-04-18 15:37  Bonne_chance  阅读(238)  评论(0)    收藏  举报
1