OSPF概念

本文章介绍TCP/IP路由协议之开放式最短路径优先协议(OSPF)的基本概念与基础配置。
OSPF是内部网关协议的一种,基于链路状态算法。

特点

  • 支持无类域间路由(CIDR):
    OSPF是专门为TCP/IP环境开发的路由协议,支持无类域间路由(CIDR)和可变长子网掩码(VLSM)。
  • 无路由自环:
    由于路由的计算是基于详细链路状态信息(网络拓扑信息)的,所采用的SPF算法本身不会产生环路,并且OSPF报文携带生成者的ID信息,因此OSPF计算的路由无自环。
  • 收敛速度快:
    触发式更新,一旦拓扑结构发生变化,新的链路状态信息立刻泛洪,对拓扑变化敏感。
  • 使用IP组播收发协议数据:
    OSPF路由器使用组播和单播收发协议数据,因此占用的网络资源很小。
  • 支持多条等值路由:
    当到达目的地的等开销路径有多条时,流量被均衡地分担在这些等开销路径上。
  • 支持协议报文的认证:
    OSPF路由器之间交换的所有报文都被验证。

链路状态算法的路由计算过程

  • OSPF最显著的特点是使用链路状态算法,区别于早先的路由协议使用的距离矢量算法,因此,本文首先介绍链路状态算法的路由计算基本过程。

  • 每个路由器通过泛洪链路状态通告(LSA)向外发布本地链路状态信息(例如使能OSPF的端口,可到达的邻居以及相邻的网段等等)。

  • 每一个路由器通过收集其它路由器发布的链路状态通告以及自身生成的本地链路状态通告,形成一个链路状态数据库(LSDB)。LSDB描述了路由域内详细的网络拓扑结构。

  • 所有路由器上的链路状态数据库是相同的。

  • 通过LSDB,每台路由器计算一个以自己为根,以网络中其它节点为叶的最短路径树。

  • 通过每台路由器计算的最短路径树得出了到网络中其它节点的路由表。

  • 在OSPF中,有两个基本的概念需要介绍,一个是自治系统,或者说一个OSPF路由域;一个是Router ID。

  • 在OSPF课程中,自治系统(Autonomous System)是指使用同一种路由协议交换路由信息的一组路由器,简称AS。

  • 由于LSDB描述的是整个网络的拓扑结构,包括网络内所有的路由器,所以网络内每个路由器都需要有一个唯一的标识,用于在LSDB中标识自己。Router ID就是这样一个用于在自治系统中唯一标识一台运行OSPF的路由器的32位整数。每个运行OSPF的路由器都有一个Router ID。

  • Router ID的格式和IP地址的格式是一样的,推荐使用路由器Loopback0的IP地址做为路由器的Router ID。

划分AS为多区域

  • 区域是一组网段的集合。
    OSPF支持将一组网段组合在一起,这样的一个组合称为一个区域,即区域是一组网段的集合。

  • 划分区域可以缩小LSDB规模,减少网络流量。
    区域内的详细拓扑信息不向其他区域发送,区域间传递的是抽象的路由信息,而不是详细的描述拓扑结构的链路状态信息。每个区域都有自己的LSDB,不同区域的LSDB是不同的。路由器会为每一个自己所连接到的区域维护一个单独的LSDB。由于详细链路状态信息不会被发布到区域以外,因此LSDB的规模大大缩小了。

  • Area 0为骨干区域,骨干区域负责在非骨干区域之间发布由区域边界路由器汇总的路由信息(并非详细的链路状态信息),为了避免区域间路由环路,非骨干区域之间不允许直接相互发布区域间路由信息。因此,所有区域边界路由器都至少有一个接口属于Area 0,即每个区域都必须连接到骨干区域。

路由器分类

  • 内部路由器(Internal Router):
    内部路由器是指所有所连接的网段都在一个区域的路由器。属于同一个区域的IR维护相同的LSDB。
  • 区域边界路由器(Area Border Router):
    区域边界路由器是指连接到多个区域的路由器。ABR为每一个所连接的区域维护一个LSDB。
  • 骨干路由器(Backbone Router):
    骨干路由器是指至少有一个端口(或者虚连接)连接到骨干区域的路由器。包括所有的ABR和所有端口都在骨干区域的路由器。
  • AS边界路由器(AS Boundary Router):
    AS边界路由器是指和其他AS中的路由器交换路由信息的路由器,这种路由器向整个AS通告AS外部路由信息。
    AS边界路由器可以是内部路由器IR,或者是ABR,可以属于骨干区域也可以不属于骨干区域。

基本配置

开启OSPF进程,创建OSPF区域,指定每个区域中所包含的网段。

1
2
3
4
5
6
7
8
[RTA]router id 1.1.1.1
[RTA]ospf
[RTA-ospf-1]area 1
[RTA-ospf-1-area-0.0.0.1]network 1.1.1.1 0.0.0.0
[RTA-ospf-1-area-0.0.0.1]network 10.1.1.0 0.0.0.255

//查看路由表
[RTA]display ip routing-table

邻居与邻接的关系

为了交换链路状态信息以及路由信息,OSPF路由器之间首先要建立邻接关系。

邻居(Neighbor)和邻接(Adjacency)

  • OSPF是一个动态路由协议,运行OSPF的路由器之间需要交换链路状态信息和路由信息,在交换这些信息之前首先需要建立邻接关系。

  • 邻居路由器(Neighbor):
    有端口连接到同一个网段的两个路由器就是邻居路由器。
    邻居关系由OSPF的Hello协议维护。

  • 邻接(Adjacency):
    从邻居关系中选出的为了交换路由信息而形成的关系。

  • 并非所有的邻居关系都可以成为邻接关系,不同的网络类型,是否建立邻接关系的规则也不同。

OSPF支持的网络类型

OSPF定义了四种网络类型,分别是点到点网络,广播型网络,NBMA网络和点到多点网络。

  • 点到点网络是指只把两台路由器直接相连的网络。

    • 一个运行PPP的64K串行线路就是一个点到点网络的例子。
  • 广播型网络是指支持两台以上路由器,并且具有广播能力的网络。

    • 一个含有四台路由器的以太网就是一个广播型网络的例子。
  • 非广播多路访问(NBMA):

    • 在NBMA网络上,OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置。
    • NBMA方式要求网络中的路由器组成全连接。例如,使用SVC进行通信的ATM网络。
    • 非广播网络是指支持两台以上路由器互连,但是不具有广播能力的网络。
    • 在非广播网络上,OSPF有两种运行方式,非广播多路访问和点到多点。
  • 点到多点:

    • 将整个非广播网络看成是一组点到点网络。每个路由器的邻居可以使用底层协议例如反向地址解析协议(Inverse ARP)来发现。
    • 对于不能组成全连接的网络应当使用点到多点方式,例如只使用PVC的不完全连接的帧中继网络。

常见链路层协议对应的默认网络类型

虚连接(Virtual Link)

  • 骨干区域必须是连续的,但在物理上不连续的时候,可以使用虚连接使骨干区域在逻辑上连续。

  • 虚连接可以在任意两个区域边界路由器上建立,但是要求这两个区域边界路由器都有端口连接到一个共同的非骨干区域。这个非骨干区域成为Transit区域。

  • 如上图所示,RTB做为一个ABR没有物理连接到骨干区域,此时可以在RTA和RTB之间配置一条虚拟链路,使RTB连接到骨干区域。Area 1是此虚拟连接的Transit区域。

  • 虚连接技术虽然理论上使骨干区域可以在物理上不连续,但在实际组网时是不推荐的。

  • 虚连接是属于骨干区域(Area 0)的一条虚拟链路。

端口状态变换

有两种不同的情况

点到点、点到多点网段和虚连接


各种状态的解释如下:

  • Down:
    这是端口的初始状态,在该状态下,底层协议显示该端口不可用,所有定时器被关闭。
  • Loopback:
    此状态表示端口被环回。在该状态下的端口被通告为一个Stub网段。
  • Point-to-point(P-to-P):
    在此状态下,端口是可用的,而且端口是连接到点到点、点到多点或者虚连接,此状态下的端口试图与邻居建立邻接关系,并以HelloInterval的间隔发送Hello报文。

各种事件解释如下:

  • UnloopInd:
    Unloopback Indication,表示端口解除环回状态。处于Loopback状态下的端口如果收到此事件,则进入Down状态。
  • InterfaceUp:
    端口的链路层协议变成可用状态,即常说的链路层Up。由于不需要选举DR和BDR,因此点到点、点到多点网段以及虚连接的端口状态变换比较

广播型网段和NBMA网段


相关状态和事件解释如下:

  • Waiting:
    在此状态下,路由器通过监听接收到的Hello报文检测网络中是否已经有DR和BDR。在此状态下的路由器不可以参与选举DR和BDR。
  • Backup:
    在此状态下,该路由器成为所连接网络上的BDR,并与网段中所有的其他路由器建立邻接关系。
  • DR:
    在此状态下,该路由器成为所连接网络上的DR,并与网段中所有的其他路由器建立邻接关系。
  • DROther:
    该路由器连接到一个广播型网段或者NBMA网段,而且该路由器不是一个DR或者BDR。此状态下的路由器与DR和BDR形成邻接关系并交换路由信息。
  • BackupSeen:
    路由器已经检测到网络上是否存在BDR。

一个OSPF路由器在广播型网段和NBMA网段上选举DR和BDR之前,首先会等待一段时间(RouterDeadInterval),在这段时间里检测网络上是否已经存在DR和BDR,如果已经有DR和BDR,则不启动选举过程,直接进入DROther状态。因此,网络上Router Priority最大的路由器不一定是DR,Router Priority第二大的路由器也不一定是BDR。

DR和BDR

每一个含有至少两个路由器的广播型网络和NBMA网络都有一个指定路由器(Designated Router,DR)和备份指定路由器(Backup Designated Router,BDR)。

DR和BDR的作用:

  1. 减少邻接关系的数量,从而减少链路状态信息以及路由信息的交换次数,这样可以节省带宽,减少路由器硬件的负担。一个既不是DR也不是BDR的路由器只与DR和BDR形成邻接关系并交换链路状态信息以及路由信息,这样就大大减少了大型广播型网络和NBMA网络中的邻接关系数量。
    本例中,虽然RTA有三个邻居,但是只形成两个邻接关系。

  2. 在描述拓扑的LSDB中,一个NBMA网段或者广播型网段是由单独一条LSA来描述的,这条LSA是由该网段上的DR产生的。

选举DR和BDR

  • DR和BDR由OSPF的Hello协议选举,选举是根据端口的路由器优先级(Router Priority)进行的。

  • 如果Router Priority被设置为0,那么该路由器将不允许被选举成DR或者BDR。

  • Router Priority越大越优先。如果相同,Router ID大者优先。

  • 但是为了维护网络上邻接关系的稳定性,如果网络中已经存在DR和BDR,则新添加进该网段的路由器不会成为DR和BDR,不管该路由器的Router Priority是否最大。

  • 如果当前DR故障,当前BDR自动成为新的DR,网络中重新选举BDR;如果当前BDR故障,则DR不变,重新选举BDR。

  • 这种选举机制的目的是为了保持邻接关系的稳定,减小拓扑结构的改变对邻接关系的影响。

配置Router Priority

1
2
[RTB]interface Ethernet 0/0
[RTB-Ethernet0/0]ospf dr-priority 100
  • ospf dr-priority value:修改端口的Router Priority。
  • Router Priority的取值范围是0~255,默认值为1。
  • 如果两台路由器Router Priority值相同,则比较Router ID,Router ID大的更优先。
  • 如果修改了Router Priority,需要重启ospf进程才能重新参与选举DR和BDR。

配置

NBMA网络


物理拓扑描述:

三台路由器通过帧中继交换机组成全连接。把所有网段配置在Area 1中。
NBMA网络中不需要配置反向ARP,邻居需要手动指定。
在RTA上配置两个邻居,10.1.1.2和10.1.1.3。
指定邻居的时候使用该邻居在该网段上的IP地址来标识。
peer ip-address [ dr-priority dr-priority-number ]
dr-priority-number:邻居的Router Priority,默认为1。

1
2
3
4
5
6
7
8
9
[RTA]router id 1.1.1.1 
[RTA]ospf
[RTA-ospf-1]peer 10.1.1.2
[RTA-ospf-1]peer 10.1.1.3
[RTA-ospf-1]area 1
[RTA-ospf-1-area-0.0.0.1]network 1.1.1.1 0.0.0.0
[RTA-ospf-1-area-0.0.0.1]network 10.1.1.0 0.0.0.255
[RTA-ospf-1-area-0.0.0.1]return
<RTA>
1
2
3
4
5
6
7
8
[RTB]router id 2.2.2.2
[RTB]ospf
[RTB-ospf-1]peer 10.1.1.1
[RTB-ospf-1]peer 10.1.1.3
[RTB-ospf-1]area 1
[RTB-ospf-1-area-0.0.0.1]network 2.2.2.2 0.0.0.0
[RTB-ospf-1-area-0.0.0.1]network 10.1.1.0 0.0.0.255
[RTB-ospf-1-area-0.0.0.1]return
1
2
3
4
5
6
7
8
[RTC]router id 3.3.3.3
[RTC]ospf
[RTC-ospf-1]peer 10.1.1.1
[RTC-ospf-1]peer 10.1.1.2
[RTC-ospf-1]area 1
[RTC-ospf-1-area-0.0.0.1]network 3.3.3.3 0.0.0.0
[RTC-ospf-1-area-0.0.0.1]network 10.1.1.0 0.0.0.255
[RTC-ospf-1-area-0.0.0.1]return
1
2
3
4
5
//验证路由表
[RTA]display ip routing-table

//验证OSPF端口信息
[RTA]display ospf interface Serial 1/0

State: 端口状态。
Type: 该端口的OSPF网络类型。
Priority:该端口的Router Priority值,用于DR和BDR选举。
Designated Router: DR的端口IP地址。
Backup Designated Router: BDR的端口IP地址。

点到多点网络

本例中:
RTA可以连接到其它两台路由器,但是RTB和RTC之间没有连接。
由于网络中的路由器不是全连接的,所以帧中继端口的OSPF网络类型需要手动指定为点到多点。
帧中继的反向ARP需要在端口上开启。
在RTA上,把所有网段配置在Area 1中。
把Serial 1/0端口的网络类型手动修改成点到多点。
ospf network-type broadcast | nbma | p2mp | p2p
OSPF共有四种网络类型。

1
2
3
4
5
6
7
8
[RTA]router id 1.1.1.1
[RTA]ospf
[RTA-ospf-1]area 1
[RTA-ospf-1-area-0.0.0.1]network 1.1.1.1 0.0.0.0
[RTA-ospf-1-area-0.0.0.1]network 10.1.1.0 0.0.0.255
[RTA]interface Serial 1/0
[RTA-Serial1/0]ospf network-type p2mp
[RTA-Serial1/0]return
1
2
3
4
5
6
7
8
[RTB]router id 2.2.2.2
[RTB]ospf
[RTB-ospf-1]area 1
[RTB-ospf-1-area-0.0.0.1]network 2.2.2.2 0.0.0.0
[RTB-ospf-1-area-0.0.0.1]network 10.1.1.0 0.0.0.255
[RTB]interface Serial 1/0
[RTB-Serial1/0]ospf network-type p2mp
[RTB-Serial1/0]return
1
2
3
4
5
6
7
8
[RTC]router id 3.3.3.3
[RTC]ospf
[RTC-ospf-1]area 1
[RTC-ospf-1-area-0.0.0.1]network 3.3.3.3 0.0.0.0
[RTC-ospf-1-area-0.0.0.1]network 10.1.1.0 0.0.0.255
[RTC]interface Serial 1/0
[RTC-Serial1/0]ospf network-type p2mp
[RTC-Serial1/0]return
1
2
3
4
5
//验证路由表
[RTA]display ip routing-table

//验证OSPF端口信息
[RTA]display ospf interface Serial 1/0

OSPF网络类型为点到多点,点到多点网络类型的端口的端口稳定状态是Point-to-Point。

虚连接

本例中:
RTC是ABR,但是RTC没有连接到骨干区域。因此在RTB和RTC之间配置虚连接。Area 1是该虚连接的Transit区域。在RTA上,把所有网段配置在Area 0中。

配置虚连接时,需要指定虚连接对端的Router ID。
虚连接在transit区域的区域视图下配置。
vlink-peer router-id :配置虚拟连接时,使用对端Router ID表示对端路由器。

1
2
3
4
5
6
7
8
9
[RTB]router id 2.2.2.2
[RTB]ospf
[RTB-ospf-1]area 0
[RTB-ospf-1-area-0.0.0.0]network 2.2.2.2 0.0.0.0
[RTB-ospf-1-area-0.0.0.0]network 10.1.1.0 0.0.0.255
[RTB-ospf-1]area 1
[RTB-ospf-1-area-0.0.0.1]network 10.1.2.0 0.0.0.255
[RTB-ospf-1-area-0.0.0.1]vlink-peer 3.3.3.3
[RTB-ospf-1-area-0.0.0.1]return
1
2
3
4
5
6
7
8
9
[RTC]router id 3.3.3.3
[RTC]ospf
[RTC-ospf-1]area 1
[RTC-ospf-1-area-0.0.0.1]network 10.1.2.0 0.0.0.255
[RTC-ospf-1-area-0.0.0.1]vlink-peer 2.2.2.2
[RTC-ospf-1]area 2
[RTC-ospf-1-area-0.0.0.2]network 3.3.3.3 0.0.0.0
[RTC-ospf-1-area-0.0.0.2]network 10.1.3.0 0.0.0.255
[RTC-ospf-1-area-0.0.0.2]return
1
2
3
4
5
//验证路由表
[RTA]display ip routing-table

//验证OSPF端口信息
[RTC]display ospf vlink

Neighbor-id:
虚连接邻居的Router ID。