OSPF动态路由协议笔记之(一) : 基本原理(上)
RIP是基于距离矢量算法的路由协议,应用在大型网络中存在收敛速度慢、度量值不科学、可扩展性差等问题。于是IETF提出了基于SPF算法的链路状态路由协议OSPF(Open Shortest Path First)。通过在大型网络中部署OSPF协议,弥补了RIP协议的诸多不足。
本笔记主要介绍OSPF(Open Shortest Path First,开放最短路径优先)动态路由协议的产生背景,以及基本工作原理(包括OSPF协议邻居建立过程,链路状态信息LSA,四种网络类型和度量方式)。
产生的背景
在OSPF产生之前,网络大部分运行RIP动态路由协议主要有三大特性:逐跳收敛,分布式路由计算,以“跳数”为度量。
① 逐跳收敛
如上图所示,N1网络发生变化,RTA向RTB发出更新,RTB收到更新之后进行本地计算,完成计算后再向RTC发送路由变化通知,如此循环。逐跳收敛的方式,造成了网络收发数据缓慢的问题。
在 “收到更新”==》“计算路由”==》“发送更新”的路由收敛过程中,RIP的局限性在于路由器需要在完成路由计算之后才可以向邻居发送路由变化通知。
OSPF路由协议将这个过程调整为:“收到更新”==》“发送更新”==》“计算路由”,即路由器从邻居收到路由更新后立刻向其他邻居路由器转发,然后再本地计算新的路由。这样的收敛方式可以大大降低全网路由收敛的时间。
② 传闻路由更新机制
RIP在计算路由完全依赖于从邻居路由器收到的路由信息,RTE仅依靠从RTD获取的信息计算路由,对RTA、RTB和RTC之间的网络情况并不了解。RIP在计算路由时,缺少对全局网络拓扑的了解。
因为RIP路由器仅从邻居路由器获取路由信息,所以对于非最优或者错误路由信息,RIP路由器并不能识别或屏蔽。解决此问题的关键最佳方式是路由器收集全网的信息,并基于这些信息独立计算路由。
③ 以“跳数”为度量
因为RIP基于跳数的度量方式,所以N1与N2网络互访时会选择RTA->RTB->RTD->RTE作为最优路径。显然RTB->RTC->RTD之间的以太链路要比RTB->RTD的串行链路带宽要高的多。使用基于跳数的度量方式,没有将链路花销等因素考虑进去,因此可能会产生次优路由。
基于跳数的度量方式并没有考虑数据包的链路转发延迟,如果采用以累积带宽为选路参考依据,可以更好的规避选择次优路径的风险。
链路状态路由协议OSPF
为了弥补RIP的缺点和不足,IETF提出了基于SPF算法的链路状态路由协议OSPF(Open Shortest Path First)。
OSPF协议拥有三个特点:
① 路由信息传递与路由计算分离
OSPF作为链路状态路由协议,不直接传递各路由器的路由表,而传递链路状态信息,各路由器基于链路状态信息独立计算路由。
② 基于SPF算法
所有路由器各自维护一个链路状态数据库。邻居路由器间先同步链路状态数据库,再各自基于SPF(Shortest Path First)算法计算最优路由,从而提高收敛速度。
③ 以“累计链路开销”作为选路参考值
在度量方式上,OSPF将链路带宽作为选路时的参考依据。 “累计带宽”是一种要比“累积跳数”更科学的计算方式。
Tips:
所谓Link State(链路状态)指的就是路由器的接口状态。在OSPF中路由器的某一接口的链路状态包含了如下信息:
① 该接口的IP地址及掩码
② 该接口的带宽
③ 该接口所连接的邻居
。。。。。。
OSPF路由协议的工作步骤
企业网络是由众多的路由器、交换机等网络设备之间互相连接组成的,类似一张地图。由于众多不同型号的路由器、不同类型的链路及其连接关系,造成了路由计算的复杂性。
OSPF的路由计算过程可以简化描述为:
Step 1:建立邻居关系
路由器之间发现并建立邻居关系。
Step 2:同步链路状态数据库
每台路由器产生并向邻居泛洪链路状态信息,同时收集来自其他路由器链路状态信息,完成LSDB(Link State Database)的同步。
Step 3:计算最优路由
每台路由器基于LSDB通过SPF算法,计算得到一棵以自己为根的SPT(Shortest Path Tree),再以SPT为基础计算去往各邻居连接网络的最优路由,并形成路由表。
接下来,本笔记会按照上述三个步骤详细的阐述OSPF的原理和实现。
OSPF基本工作原理
(1)OSPF邻居建立过程
在了解OSPF邻居建立的过程之前,我们必须先对以下两个基本概念有一定的认识。
① Router ID -- 运行OSPF路由器的唯一标识符
用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个Router ID。
企业网中的设备少则几台多则几十台甚至几百台,每台路由器都需要有一个唯一的ID用于标识自己。
Router ID是一个32位的无符号整数,其格式和IP地址的格式是一样的,Router ID选举规则如下:
Step 1:手动配置OSPF路由器的Router ID(通常建议手动配置);
Step 2:如果没有手动配置Router ID,则路由器使用Loopback接口中最大的IP地址作为Router ID;
Step 3:如果没有配置Loopback接口,则路由器使用物理接口中最大的IP地址作为Router ID。
OSPF的路由器Router ID重新配置后,可以通过重置OSPF进程来更新Router ID。
② Hello报文 -- 邻居发现、邻居建立、邻居保持
OSPF路由器之间在交换链路状态信息之前,首先需要彼此建立邻居关系,通过Hello报文实现。在OSPF邻居关系建立的过程中,Hello报文从中起到的作用包括:
Ⅰ 邻居发现:自动发现运行OSPF协议的邻居路由器。
OSPF协议通过Hello报文可以让互联的路由器间自动发现并建立邻居关系,为后续可达性信息的同步作准备。
Ⅱ 邻居建立:完成Hello报文中的参数协商,建立邻居关系。
在形成邻居关系过程中,路由器通过Hello报文完成一些参数的协商。
Ⅲ 邻居保持:通过Keepalive机制,检测邻居运行状态。
邻居关系建立后,周期性的Hello报文发送还可以实现邻居保持的功能,在一定时间内没有收到邻居的Hello报文,则会中断路由器间的OSPF邻居关系。
③ Down、Init、2-way -- OSPF建立邻居关系的三个状态
在建立邻居关系的过程中,路由器主要需要经历从Down到2-way状态,这个过程的最终状态是2-way状态,详细介绍分别如下:
Ⅰ Down:这是邻居的初始状态,表示没有从邻居收到任何信息。
Ⅱ Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己的Router ID不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。
Ⅲ 2-way:在此状态下,路由器发现自己的Router ID存在于收到的Hello报文的邻居列表中,已确认可以双向通信。
OSPF建立邻居关系
在理解Router ID,Hello报文,建立邻居关系的Down、Init、2-way状态的概念之后,接下来就可以开始介绍建立OSPF邻居关系的过程了:
邻居关系建立过程如下:
Step 1:RTA和RTB的Router ID分别为1.1.1.1和2.2.2.2。当RTA启动OSPF后,RTA会发送第一个Hello报文。此报文中邻居列表为空,且状态为Down,RTB收到RTA的这个Hello报文,状态置为Init。
Step 2:RTB发送Hello报文,此报文中邻居列表为空,RTA收到RTB的Hello报文,状态置为Init。
Step 3:RTB向RTA发送邻居列表为1.1.1.1的Hello报文,RTA在收到的Hello报文邻居列表中发现自己的Router ID,状态置为2-way。
Step 4:RTA向RTB发送邻居列表为2.2.2.2的Hello报文,RTB在收到的Hello报文邻居列表中发现自己的Router ID,状态置为2-way。
Tips:扩展知识
因为邻居都是未知的,所以Hello报文的目的IP地址不是某个特定的单播地址。邻居从无到有,OSPF采用组播的形式发送Hello报文(目的地址224.0.0.5)。对于不支持组播的网络,OSPF路由器如何发现邻居呢?
OSPF支持通过单播方式建立邻居关系。
对于不支持组播的网络可以通过手动配置实现邻居的发现与维护。
当网络规模越来越大或者设备频繁更新,相关联的OSPF路由器都需要更改静态配置,手动更改配置的工作量变大且容易出错。除了特殊场景,一般情况下不适用手动配置的方式。
(2)链路状态信息LSA
区别于RIP路由器之间交互的路由信息,OSPF路由器同步的是最原始的链路状态信息,而且对于邻居路由器发来的链路状态信息,仅作转发。最终所有路由器都将拥有一份相同且完整的原始链路状态信息。
每台运行OSPF协议的路由器所描述的信息中都应该包括:
l 链路的类型
l 接口IP地址及掩码
l 链路上所连接的邻居路由器
l 链路的带宽(开销)
Tips:扩展知识
Q:路由器只需要知道目的网络号/掩码、下一跳、开销(接口IP地址及掩码、链路上的邻居、链路的开销)即可,为什么要有链路的类型呢?
A:数据链路层协议类型多种多样,工作机制也各不相同。为适配多种数据链路层协议,必须考虑各类链路层协议在组网时的应用场景。
以下介绍OSPF划分了四种网络类型:P2P,P2MP,BMA,NBMA;以及如何以此来组成拓扑信息的一部分的:
① 网络类型 - P2P(点对点网络)
P2P网络是指一段链路上只能连接两台设备的环境。广播、组播数据包都可以转发。
不需要进行DR和BDR的选举。直接形成邻接关系。
P2P网络例子:两台通过PPP(Point-to-Point Protocol)链路相连的路由器网络。
当两台设备通过PPP链路进行连接,设备上采用的接口封装协议就是PPP,当激活OSPF时,OSFP会根据接口的数据链路层封装将它网络类型设置为P2P,采用HDLC封装时,缺省网络类型也为P2P。
在P2P网络类型中,5种OSPF报文都是通过组播地址224.0.0.5来发送的。在缺省状态下,接口会以10秒的周期去发送hello报文。
② 网络类型 - P2MP(点对多点网络)
多个点到点网络的集合。支持广播、组播。
不需要进行DR和BDR的选举。这种网络类型需要管理员手动配置。
将一个非广播网络看成是一组P2P网络,这样的非广播网络便成为了一个点到多点(P2MP)网络。在P2MP网络上,每个路由器的OSPF邻居可以使用反向地址解析协议(Inverse ARP)来发现。P2MP可以看作是多个P2P的集合,P2MP可以支持广播、组播的转发。
没有一种链路层协议默认属于P2MP类型网络,也就是说必须是由其他的网络类型强制更改为P2MP。常见的做法是将非完全连接的帧中继或ATM改为P2MP的网络。
OSPF在P2MP网络类型的接口上,以组播的形式发送hello报文,以单播的形式发送其他报文。缺省状态下hello报文的发送间隔为30秒。
③ 网络类型 - BMA(广播型多点接入网络)
由两台及两台以上的路由器通过共享介质互联,支持广播、组播。
需要进行DR和BDR的选举。BMA是一个支持广播的网络环境,允许多台设备接入,任意两台设备都可以进行二层通信。
BMA中以组播的形式发送hello报文,LSU报文,LSAck报文,以单播的形式发送DD报文和LSR报文。
所有的OSPF路由器都会侦听224.0.0.5这个组播地址,当要发送给所有路由器时,目的地址为224.0.0.5。DR和BDR会侦听224.0.0.6这个组播地址,当要发送给DR和BDR时目的地址为224.0.0.6。
缺省情况下,BMA发送hello报文的时间间隔为10秒。
④ 网络类型 - NBMA(非广播多点接入型网络)
两台或两台以上路由器通过VC互连。不支持广播、组播。
需要进行DR和BDR的选举。与BMA网络不同的是NBMA网络默认不支持广播与组播报文的转发。在NBMA网络上,OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置。
NBMA(non-broadcast multiple access)型网络的例子:通过全互连的帧中继链路相连的路由器网络。
在帧中继网络中,ospf没有办法通过发送hello包来建立邻居关系,只能通过使用单播方式来制定邻居,命令如下:peer x.x.x.x
NBMA虽然也允许多台设备接入,但是它并不具备广播功能。为了顺利的进行邻接关系的建立,一般用单播的形式去发送hello报文。
缺省情况下,hello报文会以30秒的周期被接口发送。
Tips:文中提到的DR和BDR选举,是用于防止LSA在OSPF网络重复泛洪,造成资源浪费。详细介绍会放到下一篇笔记中。
(3)邻居与邻接关系
邻居(Neighbor)关系与邻接(Adjacency)关系是两个不同的概念。OSPF路由器之间建立邻居关系后,进行LSDB同步,最终形成邻接关系。
在P2P网络及P2MP网络上,具有邻居关系的路由器之间会进一步建立邻接关系。
在广播型网络及NBMA网络上,非DR/BDR路由器之间只能建立邻居关系,不能建立邻接关系,非DR/BDR路由器与DR/BDR路由器之间会建立邻接关系,DR与BDR之间也会建立邻接关系。
邻接关系建立完成,意味着LSDB已经完成同步,接下来OSPF路由器将基于LSDB使用SPF算法计算路由。
(4)OSPF的度量方式
OSPF通过设置链路状态信息中的开销值(Cost)进行度量。
某接口cost=参考带宽/实际带宽。默认参考带宽为100M。当计算结果有小数位时,只取整数位;结果小于1时,cost取1。
若需要调整接口cost值有两种方式:
① 直接在接口下配置
需要注意的是,配置的cost是此接口最终的cost值,作用范围仅限于本接口。
② 修改OSPF的默认参考带宽值
作用范围是本路由器使能OSPF的接口。建议参考整个网络的带宽情况建立参考基线,所有路由器修改相同的参考带宽值,从而确保选路的一致性。
OSPF以“累计cost”为开销值,也就是流量从源网络到目的网络所经过所有路由器的出接口的cost总和,以RTA访问RTC Loopback 1接口192.168.3.3为例,其cost=G1’s cost+G3’s cost。
相比于RIP,OSPF的度量方式不仅考虑“跳数”,而且还考虑了“带宽”,比RIP更可靠的选择最优的转发路径。
到此,OSPF的建立邻居过程,以及OSPF的部分工作原理已经介绍完毕了。下一节笔记会重点对OSPF报文头部进行逐字段拆解,区分不同OSPF报文类型,再阐述LSDB(链路状态数据库)的同步以及DR和BDR选举的过程和作用。