互联网协议 — OSPF 开放式最短路径优先协议

Posted 范桂飓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了互联网协议 — OSPF 开放式最短路径优先协议相关的知识,希望对你有一定的参考价值。

目录

OSPF

OSPF(Open Shortest Path First,开放式最短路径优先协议)是 IETF 定义的一种基于链路状态的内部网关路由协议,用于在单一 AS 内决策路由(IGP、链路状态协议)。

OSPF 的出现是为了解决 RIP(IGP、距离矢量协议)的缺点:

  • 收敛慢;
  • 易产生路由环路;
  • 可扩展性差,最大只能支持 15 跳。

OSPF 的特点:

  • OSPF 把 AS 划分成逻辑意义上的一个或多个区域;
  • OSPF 通过 LSA(Link State Advertisement)的形式发布路由;
  • OSPF 依靠在 OSPF 区域内各设备间交互 OSPF 报文来达到路由信息的统一;
  • OSPF 报文封装在 IP 报文内,可以采用单播或组播的形式发送。

OSPF 协议主要优点:

  • OSPF 是真正的 LOOP-FREE(无路由自环)路由协议,源自其算法本身的优点(链路状态及最短路径树算法)。
  • OSPF 收敛速度快:能够在最短的时间内将路由变化传递到整个 AS。
  • 具有区域(Area)划分的概念,将 AS 划分为不同区域后,通过区域之间的对路由信息的摘要,大大减少了需传递的路由信息数量。也使得路由信息不会随网络规模的扩大而急剧膨胀。
  • 将协议自身的开销控制到最小。

OSPF 的网络架构

  • 邻居(Neighbor):OSPF 路由器启动后,便会通过 OSPF 接口向外发送 Hello Msg 用于发现邻居。收到 Hello Msg 的 OSPF 路由器会检查报文中所定义的一些参数,如果双方的参数一致,就会彼此形成邻居关系。

  • 邻接(Adjacency):形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。只有当双方成功交换了 DD Msg,并能交换 LSA Msg 之后,才形成真正意义上的邻接关系。

OSPF 邻居路由器之间之所以要建立邻接关系,是为了相互交换路由信息。OSPF 邻居路由器之间会通过 Hello Msg(互发 Hello 数据包),来建立和维持邻接关系。

NOTE:在广播网络环境中,并非每台邻居路由器之间都要建立 “齐备的” OSPF 邻接关系。

支持的网络类型

  1. 点到点网络:指只把两台路由器直接相连的网络。

  2. 广播型网络:指支持两台以上路由器,并且具有广播能力的网络。例如:一个含有三台路由器的以太网就是一个广播型网络。

此外,OSPF 还可以在不支持广播的多路访问网络上运行,此类网络包括在 HUB-SPOKE(星形拓扑)上运行的 FR(帧中继)和 ATM(异步传输模式)网络,这些网络的通信依赖于虚电路。OSPF 定义了下述两种支持多路访问的网络类型:

  1. NBMA(None-Broadcast Multi-Access,非广播多路访问网络):OSPF 模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置。NBMA 方式要求网络中的路由器组成全连接。缺省情况下,OSPF 认为 FR、ATM 的网络类型是 NBMA。

  2. P2MP(Point To Multi-Points,点到多点网络):将整个网络看成是一组点到点网络。对于不能组成全连接的网络应当使用点到多点方式。

NOTE:现网中遇到的大部分属于 “点到点网络” 和 “广播型网络”,因为 FR、ATM 网络基本已经淘汰了。

DR/BDR 选举

为减小广播型网络和 NBMA 网络中 OSPF 流量,OSPF 会选择一个 DR(Designated Router,指定路由器)和一个 BDR(Backup Designated Router,备份指定路由器)。每一个含有至少两个路由器的广播型网络和 NBMA 网络都有一个 DR 和 BDR。而在点到点网络和 P2MP 网络中则不需要选举。

DR/BDR 可以减少邻接关系的数量,从而减少链路状态信息以及路由信息的交换次数,这样可以节省带宽,降低对路由器处理能力的压力。

一个既不是 DR 也不是 BDR 的路由器只会与 DR 和 BDR 形成邻接关系并交换链路状态信息以及路由信息,这样就大大减少了大型广播型网络和 NBMA 网络中的邻接关系数量。

DR/BDR 的工作原理:

  1. 当指定了 DR 后,所有的路由器都与 DR 建立起邻接关系,DR 成为该广播网络上的中心点;
  2. BDR 在 DR 发生故障时接管业务,一个广播网络上所有路由器都必须同 BDR 建立邻接关系。

DR/BDR 的选举:在邻居发现完成之后,路由器会根据网段类型进行 DR/BDR 选举:

  1. 在广播型网络和 NBMA 网络上,路由器会根据参与选举的每个接口的优先级进行 DR 选举。优先级取值范围为 0-255,值越高越优先。缺省情况下,接口优先级为 1。如果一个接口优先级为 0,那么该接口将不会参与 DR 或者 BDR 的选举。
  2. 如果优先级相同时,则比较 Router ID,值越大越优先被选举为 DR。为了给 DR 做备份,每个广播和 NBMA 网络上还要选举一个 BDR。BDR 也会与网络上所有的路由器建立邻接关系。

NOTE:为了维护网络上邻接关系的稳定性,如果网络中已经存在 DR/BDR,则新添加进该网络的路由器不会成为 DR/BDR,不管该路由器的 Router Priority 是否最大。如果当前 DR 发生故障,则当前 BDR 自动成为新的 DR,网络中重新选举 BDR;如果当前 BDR 发生故障,则 DR 不变,重新选举 BDR。这种选举机制的目的是为了保持邻接关系的稳定,使拓扑结构的改变对邻接关系的影响尽量小。

在这里插入图片描述

在没有 DR 的广播网络上,邻接关系的数量可以根据公式 n(n-1)/2 计算出,n 代表参与 OSPF 的路由器接口的数量。

如图所示,所有路由器之间有 6 个邻接关系。本例中使用 DR 和 BDR 将邻接关系从 6 减少到了 5,RTA 和 RTB 都只需要同 DR 和 BDR 建立邻接关系,RTA 和 RTB 之间建立的是邻居关系。

NOTE:此例中,邻接关系数量的减少效果并不明显。但是,当网络上部署了大量路由器时,比如 100 台,那么情况就大不一样了。

OSPF 支持区域的划分,可以缩小路由器的 LSDB 规模,减少网络流量。

区域内的详细拓扑信息不向其他区域发送,区域间传递的是抽象的路由信息,而不是详细的描述拓扑结构的链路状态信息。

每个区域都有自己的 LSDB,不同区域的 LSDB 是不同的。路由器会为每一个自己所连接到的区域维护一个单独的 LSDB。由于详细链路状态信息不会被发布到区域以外,因此 LSDB 的规模大大缩小了。

在这里插入图片描述

划分 OSPF 区域的方式:

  1. 路由器的每个接口可以被划分在一个区域,一个路由器可以同时属于多个区域。
  2. Area0 为骨干区域,其他区域为非骨干区域。每个非骨干区域都必须连接到骨干区域。
  3. 运行在区域之间的路由器叫做 ABR(Area Boundary Router,区域边界路由器),它包含所有相连区域的 LSDB。

NOTE:ASBR(Autonomous System Boundary Router,自治系统边界路由器)是指和其他 AS 中的路由器交换路由信息的路由器,这种路由器会向整个 AS 通告 AS 外部路由信息。

OSPF 区域内部的路由器使用 SPF 最短路径算法保证了区域内部的无环路。

SPF 算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离,每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图,该结构图类似于一棵树,在 SPF 算法中,被称为最短路径树。且树是一种无环路的数据结构。

OSPF 利用 “区域间的连接规则” 保证了区域之间无路由环路。

为了避免区域间路由环路,非骨干区域之间不允许直接相互发布路由信息,所有的非骨干区域间通信都需要借助骨干区域。因此,每个区域都必须连接到骨干区域。

OSPF 的消息类型

OSPF 使用 IP 报文直接封装协议报文,协议号为 89。OSPF 具有 5 种消息类型。

  1. Hello Msg:用于发现、维护邻居关系,在广播和 NBMA 类型的网络中选举 DR 和 BDR。周期性的在使能了 OSPF 的接口上发送。报文内容包括一些定时器的数值、DR、BDR 以及自己已知的邻居。
    在这里插入图片描述

  2. DD(Database Description Packet)Msg:两台路由器在邻接关系初始化进行 LSDB 数据库同步时,用 DD Msg 来描述自己的 LSDB。DD Msg 的内容包括了 LSDB 中每一条 LSA Header(唯一标识一条 LSA)。LSA Header 只占了一条 LSA 记录的一小部分,所以,这样就可以减少路由器之间的协议报文流量。在两台路由器交换DD报文的过程中,一台为 Master,另一台为 Slave。由 Master 规定起始序列号,每发送一个 DD Msg 报文序列号 +1,Slave 方使用 Master 的序列号作为确认。
    在这里插入图片描述

  3. LSR(Link State Request Packet)Msg:两台路由器互相交换过 DD Msg 之后,知道对端的路由器有哪些 LSA 记录是本地的 LSDB 所缺少的,这时需要发送 LSR Msg 向对方请求缺少的 LSA,LSR 只包含了所需要的 LSA 的摘要信息。LSR Msg 格式如下图所示,其中 LS type、Link State ID 和 Advertising Router 可以唯一标识出一个 LSA,当两个 LSA 一样时,需要根据 LSA 中的 LS sequence number、LS checksum 和 LS age 来判断出所需要 LSA 的新旧。
    在这里插入图片描述

  4. LSU(Link State Update Packet)Msg:用来向对端路由器发送其所需要的 LSA 或者泛洪自己更新的 LSA,内容是多条 LSA(全部内容)的集合。LSU 在支持组播和广播的链路上是以组播形式将 LSA 泛洪出去。为了实现 Flooding 的可靠性传输,需要 LSAck 报文对其进行确认。对没有收到确认报文的 LSA 进行重传,重传的 LSA 是直接发送到邻居的。
    在这里插入图片描述

  5. LSACK(Link State Acknowledgment Packet)Msg:用来对接收到的 LSU Msg 进行确认。内容是需要确认的 LSA 的 Header(一个 LSAck 报文可对多个 LSA 进行确认)。
    在这里插入图片描述

OSPF 的状态机

  • Down:这是邻居的初始状态,表示没有从邻居收到任何信息。如图所示,R1 和 R2 都运行 OSPF。邻居状态显示为 Down 状态,表明 OSPF 路由器尚未从邻居路由器收到任何 OSPF 协议数据包。
    在这里插入图片描述

  • Attempt:只有在 NBMA 网络环境中,才会出现 Attempt 状态。若一台 OSPF 路由器将其邻居路由器显示为 Attempt 状态,则表示未从该邻居路由器收到任何 OSPF 协议数据包,但自己已 “尽其所能” 地(Serious effort)“联络” 过该邻居路由器。即:此 OSPF 路由器会周期性的向邻居发送 Hello Msg,发送间隔为 Hello Interval。如图所示,R1 发出了 Hello Msg,表明自己既未发现其他路由器,也不知 DR 何在。如果 Router Dead Interval 间隔内未收到邻居的 Hello Msg,则转为 Down 状态。
    在这里插入图片描述

  • Init:在此状态下,路由器已经从邻居收到了 Hello Msg,但是自己不在所收到的 Hello Msg 的邻居列表中,尚未与邻居建立双向通信关系。如图所示,R1 发出了 Hello Msg。收到此 Hello Msg 之后,由于 R2 在其所含邻居路由器字段中未发现自己的 Router-ID,因此邻居双方会步入单向(接收)状态。
    在这里插入图片描述

  • 2-Way:当 OSPF 邻居双方都收到了对方发出的 Hello Msg 之后,就会建立起 2-way 状态,这也就拉开了 OSPF 邻接关系建立的序幕。在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的最高级状态。在 2-way 状态的建立过程中,会选举出了 DR/BDR。如图所示,R2 所发 Hello 数据包的邻居路由器字段中包含了 R1 的 Router-ID,收到此包之后,R1 就知道 R2 已经收到了自己先前发出的 Hello 数据包。由于 R2 的 Router-ID 更高,因此会在此 Hello Msg 的指定路由器字段中填入自己的 Router-ID,表明自己的 DR 身份。
    在这里插入图片描述

  • ExStart:这是形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向邻居发送 DD Msg,OSPF 邻居双方会发起数据库同步过程。主从关系是在此状态下形成的,初始 DD 序列号也是在此状态下决定的。在此状态下发送的 DD Msg 不包含链路状态描述。如图所示,R1 和 R2 都发出了自己的第一个 DBD 数据包。Router-ID 最高的路由器被推举成为主路由器。本例,R2 的 Router-ID 更高,故成为主路由器。
    在这里插入图片描述

  • Exchange:此状态下路由器相互发送包含链路状态信息摘要的 DD Msg,描述本地 LSDB 的内容。OSPF 邻居双方会互发描述本机所持完整链路状态数据库的 DBD 数据包。每个 DBD 数据包都必须明确得到确认。只允许存在一个未经确认的(在途)DBD 数据包。在此状态下,OSPF 路由器还会发出 LSR 数据包,来请求新的 LSA 实例。由下图可知,R1 和 R2 正交换各自的链路状态数据库信息。此外,还可获知 R2 将其发出的最后一个 DBD 数据包中的 M 位置 0(图中最后一个箭头),表明主路由器已无更多 DBD 数据包要发。在此情形, R1 作为从路由器会发送其余的 DD Msg,发完之后,也会顺带在最后一个 DD Msg 中将 M 位置 0。此时,便标志着 OSPF 邻居双方已经交换完描述各自链路状态数据库的完整信息了。
    在这里插入图片描述

  • Loading:相互发送 LSR Msg 请求 LSA,发送 LSU Msg 通告 LSA。由图可知,R1 正处于 Loading 状态,且已发出 LSR 数据包,要求 R2 向其发出某条 LSA 的最新实例。
    在这里插入图片描述

  • Full:此状态表示 OSPF 邻居双方已经交换了完整的信息,路由器的 LSDB 已经同步。如图所示,R1 和 R2 已经交换完了各自的链路状态数据库信息,且同处于 Full 状态。
    在这里插入图片描述

OSPF 的运行原理

在这里插入图片描述

  1. 邻居发现:OSPF 路由器会发送 Hello Msg,用来发现和维持 OSPF 路由器的邻居关系。

  2. LSDB 数据库同步:路由器在建立完成邻居关系之后,便开始进行 LSDB 数据库同步。OSPF 路由器使用 DD Msg 来进行 DR/BDR(主从路由器)的选举和 LSA Header(描述 LSDB 的摘要信息)的交互。
    在这里插入图片描述

  3. 建立完全邻接关系
    在这里插入图片描述

以上是关于互联网协议 — OSPF 开放式最短路径优先协议的主要内容,如果未能解决你的问题,请参考以下文章

OSPF开放式最短路径优先

OSPF协议介绍

OSPF 中的最短路径算法:Dijkstra 算法

网络层-第五节2:OSPF协议与链路状态算法

OSPF

ospf