上帝视角
OSPF出现背景
如上图就是一张简单的OSPF协议网络,那么为什么会出现OSPF协议呢?
开放式最短路径优先OSPF(Open Shortest Path First)协议是IETF定义的一种基于链路状态的内部网关路由协议。
为什么会出现OSPF?:因为RIP是一种基于距离矢量算法的路由协议,存在着
收敛慢;
易产生路由环路;
可扩展性差,最大只能支持15跳。
OSPF的出现很好地解决了上述3个问题,那么OSPF是如何解决上述3个问题的呢?我们一起来看下。
什么是OSPF协议?
OSPF是一种基于链路状态的路由协议,它从设计上保证了无路由环路。
那么什么是链路状态协议?
如果说距离矢量路由协议提供的是路标,那么链路状态路由协议提供的就是地图。每个运行链路状态协议的路由器上都有一张完整的网络图。
就好比你有一张地图怎么还会迷路?运行链路状态协议的每一台路由器都会有一张地图库从而避免了环路。
链路状态协议工作原理
每台运行链路状态路由协议的路由器都了解整个网络的链路状态信息(地图),这样才能计算出到达目的地的最优路径。
1、LSA泛洪:
运行链路状态路由协议的路由器都会进行链路状态公告LSA (Link State Advertisement)泛洪,LSA中包含了路由器已知的接口状态、接口IP地址、掩码、开销和网络类型等信息。
通俗点讲就是每台路由器都会将一些关于自己,关于本地直连链路以及这些链路的状态和关于所有直连邻居的信息传送给相邻的其他路由器。
2、建立LSDB:
收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库LSDB(Link State Database)。
通俗点讲就是每台路由器都会收到网络中其他的路由器发送过来的LSA信息,这些所有的LSA信息构成了LSDB。这里需要注意的是当网络稳定后,网络中的所有设备应该是有相同的LSDB的。
3、建立最短路径树:
运行OSPF协议的路由器在LSDB的基础上使用SPF算法进行运算,建立起到达每个网络的最短路径树。
4、路由计算:
通过最短路径树得出到达目的网络的最优路由,并将其加入到IP路由表中。
常见的链路状态协议有:
OSPF:开放式最短路径优先协议
IS-IS:中间系统到中间系统协议
OSPF协议特点
OSPF支持区域的划分,区域内部的路由器使用SPF最短路径算法保证了区域内部的无环路;
A、为什么划分区域?
划分OSPF区域可以缩小路由器的LSDB规模,减少网络流量。
区域内的详细拓扑信息不向其他区域发送,区域间传递的是抽象的路由信息,而不是详细的描述拓扑结构的链路状态信息。
每个区域都有自己的LSDB,不同区域的LSDB是不同的。路由器会为每一个自己所连接到的区域维护一个单独的LSDB。由于详细链路状态信息不会被发布到区域以外,因此LSDB的规模大大缩小了。
B、OSPF是如何划分区域的呢?
1、路由器的每个接口可以被划分在一个区域,一个路由器可以同时属于多个区域。
2、Area 0为骨干区域,其他区域为非骨干区域。每个非骨干区域都必须连接到骨干区域。
3、运行在区域之间的路由器叫做区域边界路由器ABR(Area Boundary Router),它包含所有相连区域的LSDB。
自治系统边界路由器ASBR(Autonomous System Boundary Router)是指和其他AS中的路由器交换路由信息的路由器,这种路由器会向整个AS通告AS外部路由信息。
C、为什么SPF算法可以保证区域内无环路?
SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离,每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图,该结构图类似于一棵树,在SPF算法中,被称为最短路径树。树形是无环路的。
OSPF利用区域间的连接规则保证了区域之间无路由环路。
为了避免区域间路由环路,非骨干区域之间不允许直接相互发布路由信息,所有的非骨干区域间通信都需要借助骨干区域。因此,每个区域都必须连接到骨干区域。
OSPF通过LSA(Link State Advertisement)的形式发布路由;
OSPF依靠在OSPF区域内各设备间交互OSPF报文来达到路由信息的统一;
OSPF报文封装在IP报文内,可以采用单播或组播的形式发送;
OSPF支持触发更新,能够快速检测并通告自治系统内的拓扑变化
OSPF协议router id
Router ID
Router ID是一个32位的值,它唯一标识了一个自治系统内的路由器,可以为每台运行OSPF的路由器上可以手动配置一个Router ID,或者指定一个IP地址作为Router ID。
如果没有手动配置Router ID,运行OSPF协议的路由器如何选取Router ID?
1、如果设备存在多个逻辑接口地址,则路由器使用逻辑接口中最大的IP地址作为Router ID;
2、如果没有配置逻辑接口,则路由器使用物理接口的最大IP地址作为Router ID。
注意:
1、在为一台运行OSPF的路由器配置新的Router ID后,需要在路由器上通过重置OSPF进程来更新Router ID。
2、通常建议手动配置Router ID,以防止Router ID因为接口地址的变化而改变。
OSPF协议邻居/邻接
邻居(Neighbor):
OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文用于发现邻居。
收到Hello报文的OSPF路由器会检查报文中所定义的一些参数,如果双方的参数一致,就会彼此形成邻居关系。
邻接(Adjacency):
形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。
只有当双方成功交换DD报文,并能交换LSA之后,才形成真正意义上的邻接关系。
OSPF协议网络类型
OSPF协议支持四种网络类型,分别是点到点网络,广播型网络,NBMA网络和点到多点网络。
1、点到点网络是指只把两台路由器直接相连的网络。一个运行PPP的64K串行线路就是一个点到点网络的例子。
2、广播型网络是指支持两台以上路由器,并且具有广播能力的网络。一个含有三台路由器的以太网就是一个广播型网络的例子。
OSPF可以在不支持广播的多路访问网络上运行,此类网络包括在hub-spoke拓扑上运行的帧中继(FR)和异步传输模式(ATM)网络,这些网络的通信依赖于虚电路。
OSPF定义了两种支持多路访问的网络类型:非广播多路访问网络(NBMA)和点到多点网络(Point To Multi-Points)。
3、NBMA:在NBMA网络上,OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置。NBMA方式要求网络中的路由器组成全连接。
缺省情况下,OSPF认为帧中继、 ATM的网络类型是NBMA。
4、P2MP:将整个网络看成是一组点到点网络。对于不能组成全连接的网络应当使用点到多点方式。
注意:
现网中遇到的大部分属于点到点网络和广播型网络,因为帧中继、 ATM网络基本已经淘汰了。
DR&BDR选举
为减小广播型网络和NBMA网络中OSPF流量,OSPF会选择一个指定路由器(DR)和一个备份指定路由器(BDR)。
选举DR&BDR的条件:
每一个含有至少两个路由器的广播型网络和NBMA网络都有一个DR和BDR。在点到点网络和P2MP不需要选举DR&BDR。
DR&BDR的工作原理
1、当指定了DR后,所有的路由器都与DR建立起邻接关系,DR成为该广播网络上的中心点;
2、BDR在DR发生故障时接管业务,一个广播网络上所有路由器都必须同BDR建立邻接关系。
为什么需要选举DR&BDR?
1、DR和BDR可以减少邻接关系的数量,从而减少链路状态信息以及路由信息的交换次数,这样可以节省带宽,降低对路由器处理能力的压力。
2、一个既不是DR也不是BDR的路由器只与DR和BDR形成邻接关系并交换链路状态信息以及路由信息,这样就大大减少了大型广播型网络和NBMA网络中的邻接关系数量。
DR&BDR的选举
在邻居发现完成之后,路由器会根据网段类型进行DR选举。
1、在广播和NBMA网络上,路由器会根据参与选举的每个接口的优先级进行DR选举。
优先级取值范围为0-255,值越高越优先。缺省情况下,接口优先级为1。如果一个接口优先级为0,那么该接口将不会参与DR或者BDR的选举。
2、如果优先级相同时,则比较Router ID,值越大越优先被选举为DR。
为了给DR做备份,每个广播和NBMA网络上还要选举一个BDR。BDR也会与网络上所有的路由器建立邻接关系。
为了维护网络上邻接关系的稳定性,如果网络中已经存在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之间建立的是邻居关系。
此例中,邻接关系数量的减少效果并不明显。但是,当网络上部署了大量路由器时,比如100台,那么情况就大不一样了。
OSPF协议5种报文
OSPF直接运行在IP协议之上,使用IP协议号89。
运行OPSF协议的路由器通过5种报文的交互从邻居状态达到邻接状态,完成LSA的泛洪,使网络的路由器LSDB达到一致,每个路由器按照自己LSDB根据SPF算法计算路径,生成最优路由加入路由表。
下面我们一起看下这个五种报文类型,每种报文都使用相同的OSPF报文头。
1、Hello报文:
最常用的一种报文,用于发现、维护邻居关系。
在广播和NBMA(None-Broadcast Multi-Access)类型的网络中选举指定路由器DR(Designated Router)和备份指定路由器BDR(Backup Designated Router)。
2、DD报文:
两台路由器进行LSDB数据库同步时,用DD报文来描述自己的LSDB。
DD报文的内容包括LSDB中每一条LSA的头部(LSA的头部可以唯一标识一条LSA)。LSA头部只占一条LSA的整个数据量的一小部分,所以,这样就可以减少路由器之间的协议报文流量。
3、LSR报文:
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地LSDB所缺少的,这时需要发送LSR报文向对方请求缺少的LSA,LSR只包含了所需要的LSA的摘要信息。
4、LSU报文:用来向对端路由器发送所需要的LSA。
5、LSACK报文:用来对接收到的LSU报文进行确认。
OSPF协议状态机
运行OPSF协议的路由器通过5种报文的交互从邻居状态达到邻接状态,中间可能会经历以下8种状态:
Down:这是邻居的初始状态,表示没有从邻居收到任何信息。
Attempt:此状态只在NBMA网络上存在,表示没有收到邻居的任何信息,但是已经周期性的向邻居发送报文,发送间隔为HelloInterval。如果RouterDeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。
Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中,尚未与邻居建立双向通信关系。
2-Way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的最高级状态。
ExStart:这是形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向邻居发送DD报文。主从关系是在此状态下形成的,初始DD序列号也是在此状态下决定的。在此状态下发送的DD报文不包含链路状态描述。
Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地LSDB的内容。
Loading:相互发送LSR报文请求LSA,发送LSU报文通告LSA。
Full:路由器的LSDB已经同步
OSPF协议详细工作原理
结合OSPF协议的5种报文和8种邻居状态机来一起看下OPSF的工作过程:
1、邻居发现:
运行OSPF协议的路由器会发送Hello报文,用来发现和维持OSPF邻居关系;
Hello报文结构:
Hello报文中的重要字段解释如下:
Network Mask:32比特,发送Hello报文的接口的网络掩码。
HelloInterval:16比特,发送Hello报文的时间间隔,单位为秒。默认是10S。
Options:8比特,标识发送此报文的OSPF路由器所支持的可选功能。
可选项:
E:允许Flood AS-External-LSAs
MC:转发IP组播报文
N/P:处理Type-7 LSAs
DC:处理按需链路
Router Priority:8比特,发送Hello报文的接口的Router Priority,用于选举DR和BDR。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。
RouterDeadInterval:32比特,失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效;单位为秒,通常为四倍HelloInterval。默认是40S。
Designated Router:32比特,发送Hello报文的路由器所选举出的DR的IP地址。如果设置为0.0.0.0,表示未选举DR路由器。
Backup Designated Router:32比特,发送Hello报文的路由器所选举出的BDR的IP地址。如果设置为0.0.0.0,表示未选举BDR。
Neighbor:32比特,邻居的Router ID列表,表示本路由器已经从这些邻居收到了合法的Hello报文。
如果路由器发现所接收的合法Hello报文的邻居列表中有自己的Router ID,则认为已经和邻居建立了双向连接,表示邻居关系已经建立。
验证一个接收到的Hello报文是否合法包括:
1、如果接收端口的网络类型是广播型,点到多点或者NBMA,所接收的Hello报文中Network Mask字段必须和接收端口的网络掩码一致,如果接收端口的网络类型为点到点类型或者是虚连接,则不检查Network Mask字段;
2、所接收的Hello报文中Hello Interval字段必须和接收端口的配置一致;
3、所接收的Hello报文中Router Dead Interval字段必须和接收端口的配置一致;
4、所接收的Hello报文中Options字段中的E-bit(表示是否接收外部路由信息)必须和相关区域的配置一致。
2、LSDB数据库同步:
路由器在建立完成邻居关系之后,便开始进行LSDB数据库同步。
路由器使用DD报文来进行主从路由器的选举和数据库摘要信息的交互。DD报文包含LSA的头部信息,用来描述LSDB的摘要信息。
具体过程如下:
主从路由器的选举:
1、邻居状态变为ExStart以后,RTA向RTB发送第一个DD报文,在这个报文中,DD序列号被设置为X(假设),RTA宣告自己为主路由器。
2、RTB也向RTA发送第一个DD报文,在这个报文中,DD序列号被设置为Y(假设)。RTB也宣告自己为主路由器。
由于RTB的Router ID比RTA的大,所以RTB应当为真正的主路由器。
数据库摘要信息的交互:
3、RTA发送一个新的DD报文,在这个新的报文中包含LSDB的摘要信息(LSDB的摘要信息可以类比成一本书的目录),序列号设置为RTB在步骤2里使用的序列号(表示承认RTB为真正的主路由器),因此RTB将邻居状态改变为Exchange。
4、邻居状态变为Exchange以后,RTB发送一个新的DD报文,该报文中包含LSDB的描述信息,DD序列号设为Y+1(上次使用的序列号加1)。
5、即使RTA不需要新的DD报文描述自己的LSDB,但是作为从路由器,RTA需要对主路由器RTB发送的每一个DD报文进行确认。所以,RTA向RTB发送一个内容为空的DD报文,序列号为Y+1。
3、建立完全邻接关系:
6、发送完最后一个DD报文之后,RTA将邻居状态改变为Loading;邻居状态变为Loading之后,RTA开始向RTB发送LSR报文,请求那些在Exchange状态下通过DD报文发现的,而且在本地LSDB中没有的链路状态信息。
RTB收到最后一个DD报文之后,改变状态为Full(假设RTB的LSDB是最新最全的,不需要向RTA请求更新)。
7、RTB收到LSR报文之后,向RTA发送LSU报文,在LSU报文中,包含了那些被请求的链路状态的详细信息。RTA收到LSU报文之后,将邻居状态从Loading改变成Full。
8、RTA向RTB发送LSACK报文,用于对已接收LSA的确认。
此时,RTA和RTB之间的邻居状态变成Full,表示达到完全邻接状态。
OSPF协议5种报文头格式
OSPF用IP报文直接封装协议报文,协议号为89。OSPF分为5种报文,Hello报文、DD报文、LSR报文、LSU报文和LSAck报文。
OSPF报文头格式:
OSPF这五种报文具有相同的报文头格式,长度为24字节。
1、Type: 1字节 ,表示OSPF报文的类型,有下面几种类型:Hello报文;DD报文;LSR报文;LSU报文;LSAck报文。
2、Packet length :2字节,OSPF报文的总长度,包括报文头在内,单位为字节。
3、Router ID :4字节,发送该报文的路由器标识。
4、Area ID: 4字节 ,发送该报文的所属区域。
5、Checksum :2字节,校验和,包含除了认证字段的整个报文的校验和。
6、AuType :2字节 ,验证类型值有如下几种表示, 0表示不验证;1表示简单认证;3表示MD5认证。
7、Authentication :8字节 ,鉴定字段,其数值根据验证类型而定。当验证类型为0时未作定义;类型为1时此字段为密码信息;类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。
OSPF Hello报文格式
Hello报文是最常用的一种报文,其作用为建立和维护邻接关系,周期性的在使能了OSPF的接口上发送。报文内容包括一些定时器的数值、DR、BDR以及自己已知的邻居。
报文的字段解释上一章解已经介绍过:5种报文、8种邻居状态机详解OSPF工作原理
OSPF DD 报文格式
两台路由器在邻接关系初始化时,用DD报文(Database Description
Packet)来描述自己的LSDB,进行数据库的同步。报文内容包括LSDB中每一条LSA的Header(LSA的Header可以唯一标识一条LSA)。
LSA Header只占一条LSA的整个数据量的一小部分,这样可以减少路由器之间的协议报文流量,对端路由器根据LSA Header就可以判断出是否已有这条LSA。
在两台路由器交换DD报文的过程中,一台为Master,另一台为Slave。由Master规定起始序列号,每发送一个DD报文序列号加1,Slave方使用Master的序列号作为确认。
1、Interface MTU: 16比特 ,在不分片的情况下,此接口最大可发出的IP报文长度。
2、Options: 8比特 ,可选项
3、DD sequence number :32比特 DD报文序列号。主从双方利用序列号来保证DD报文传输的可靠性和完整性。
4、LSA Headers :可变 ,该DD报文中所包含的LSA的头部信息。
OSPF LSR报文格式
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的和哪些LSA是已经失效的,这时需要发送LSR报文(Link State Request Packet)向对方请求所需的LSA。内容包括所需要的LSA的摘要。
LSR报文格式如下图所示,其中LS type、Link State ID和Advertising Router可以唯一标识出一个LSA,当两个LSA一样时,需要根据LSA中的LS sequence number、LS checksum和LS age来判断出所需要LSA的新旧。
1、LS type:32比特,LSA的类型号。
2、Link State ID:32比特,根据LSA中的LS Type和LSA description在路由域中描述一个LSA。
3、Advertising Router:32比特,产生此LSA的路由器的Router ID。
OSPF LSU报文格式
用来向对端Router发送其所需要的LSA或者泛洪自己更新的LSA,内容是多条LSA(全部内容)的集合。
LSU报文(Link State Update Packet)在支持组播和广播的链路上是以组播形式将LSA泛洪出去。为了实现Flooding的可靠性传输,需要LSAck报文对其进行确认。对没有收到确认报文的LSA进行重传,重传的LSA是直接发送到邻居的。
Number of LSAs:32比特,LSA的数量。
OPSF LSAck报文格式
用来对接收到的LSU报文进行确认。内容是需要确认的LSA的Header(一个LSAck报文可对多个LSA进行确认)。
LSAck(Link State Acknowledgment Packet)报文根据不同的链路以单播或组播的形式发送。
LSAs Headers:可变,通过LSA的头部信息确认收到该LSA。
网友评论