分类
协议

OSPF协议原理

OSPF,Open Shortest Path First,开放式最短路径优先协议是IETF定义的一种基于链路状态的内部网关路由协议。
RIP是一种基于距离矢量算法的路由协议,存在着收敛慢易产生路由环路可扩展性差等问题,目前已逐渐被OSPF取代。

开放式最短路径优先(OSPF)示意图
  1. OSPF是一种基于链路状态的路由协议,它从设计上就保证了无路由环路
  2. OSPF支持区域的划分,区域内部的路由器使用SPF最短路径算法保证了区域内部的无环路。OSPF还利用区域间的连接规则保证了区域之间无路由环路
  3. OSPF支持触发更新,能够快速检测并通告自治系统内的拓扑变化。
  4. OSPF可以解决网络扩容带来的问题。当网络上路由器越来越多,路由信息流量急剧增长的时候,OSPF可以将每个自治系统划分为多个区域,并限制每个区域的范围。OSPF这种分区域的特点,使得OSPF特别适用于大中型网络。
  5. OSPF可以提供认证功能。OSPF路由器之间的报文可以配置成必须经过认证才能进行交换。

OSPF原理介绍

OSPF原理示意图
  1. OSPF要求每台运行OSPF的路由器都了解整个网络的链路状态信息,这样才能计算出到达目的地的最优路径。
  2. OSPF的收敛过程由链路状态公告LSA(Link State Advertisement)泛洪开始,LSA中包含了路由器已知的接口IP地址、掩码、开销和网络类型等信息。
  3. 收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库LSDB(Link State Database),并在LSDB的基础上使用SPF算法进行运算,建立起到达每个网络的最短路径树。
  4. 最后,通过最短路径树得出到达目的网络的最优路由,并将其加入到IP路由表中

OSPF报文
OSPF报文封装在IP报文中,协议号为89。OSPF报文

OSPF报文类型有5种,每种报文都使用相同的OSPF报文头,长度为24字节:

字段长度含义
Version1字节版本,OSPF的版本号。对于OSPFv2来说,其值为2。
Type1字节类型,OSPF报文的类型,有下面几种类型: 
1:Hello报文;
2:DD报文;
3:LSR报文;
4:LSU报文;
5:LSAck报文。
Packet length2字节OSPF报文的总长度,包括报文头在内,单位为字节。
Router ID4字节发送该报文的路由器标识。
Area ID4字节发送该报文的所属区域。
Checksum2字节校验和,包含除了认证字段的整个报文的校验和。
AuType2字节验证类型,值有如下几种表示:
0:不验证;
1:简单认证;
2:MD5认证。
Authentication8字节鉴定字段,其数值根据验证类型而定。
当验证类型为0时未作定义;
类型为1时此字段为密码信息;
类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。
MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。 
OSPF报文头字段

Hello报文
最常用的一种报文,用于发现、维护邻居关系。并在广播和NBMA(None-Broadcast Multi-Access)类型的网络中选举指定路由器DR(Designated Router)和备份指定路由器BDR(Backup Designated Router)。Hello报文

DD(Database Description)报文
两台路由器进行LSDB数据库同步时,用DD报文来描述自己的LSDB。DD报文的内容包括LSDB中每一条LSA的头部(LSA的头部可以唯一标识一条LSA)。LSA头部只占一条LSA的整个数据量的一小部分,所以,这样就可以减少路由器之间的协议报文流量。DD报文

LSR(Link State Request)报文
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地LSDB所缺少的,这时需要发送LSR报文向对方请求缺少的LSA,LSR只包含了所需要的LSA的摘要信息。LSR报文

LSU(Link State Update)报文
用来向对端路由器发送所需要的LSA。LSU报文

LSAck(Link State Acknowledgment)报文
用来对接收到的LSU报文进行确认。LSAck报文


邻居状态机
邻居和邻接关系建立的过程如下:
Down
这是邻居的初始状态,表示没有在邻居失效时间间隔内收到来自邻居路由器的Hello数据包。
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邻居状态机


Router ID、邻居和邻接
Router ID:是一个32位的值,它唯一标识了一个自治系统内的路由器,管理员可以为每台运行OSPF的路由器手动配置一个Router ID。
如果未手动指定,设备会按照以下规则自动选举Router ID:
如果设备存在多个逻辑接口地址,则路由器使用逻辑接口中最大的IP地址作为Router ID;
如果没有配置逻辑接口,则路由器使用物理接口的最大IP地址作为Router ID。
在为一台运行OSPF的路由器配置新的Router ID后,可以在路由器上通过重置OSPF进程来更新Router ID。
通常建议手动配置Router ID,以防止Router ID因为接口地址的变化而改变。
运行OSPF的路由器之间需要交换链路状态信息和路由信息,在交换这些信息之前路由器之间首先需要建立邻接关系。
邻居(Neighbor):OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文用于发现邻居。
收到Hello报文的OSPF路由器会检查报文中所定义的一些参数,如果双方的参数一致,就会彼此形成邻居关系,状态到达2-way 即可称为建立了邻居关系。
邻接(Adjacency):形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。
只有当双方成功交换DD报文,并同步LSDB后,才形成真正意义上的邻接关系。
本例中,RTA通过以太网连接了三个路由器,所以RTA有三个邻居,但不能说RTA有三邻接关系。Router-ID、邻居和邻接


邻居发现

邻居发现

Hello报文用来发现和维持OSPF邻居关系。Hello报文格式

OSPF的邻居发现过程是基于Hello报文来实现的,Hello报文中的重要字段解释如下:
Network Mask:发送Hello报文的接口的网络掩码。
Hello Interval:发送Hello报文的时间间隔,单位为秒。
Options:标识发送此报文的OSPF路由器所支持的可选功能。具体的可选功能已超出这里的讨论范围。
Router Priority:发送Hello报文的接口的Router Priority,用于选举DR和BDR。
Router Dead Interval:失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效;单位为秒,通常为四倍Hello Interval。
Designated Router:发送Hello报文的路由器所选举出的DR的IP地址。如果设置为0.0.0.0,表示未选举DR路由器。
Backup Designated Router:发送Hello报文的路由器所选举出的BDR的IP地址。如果设置为0.0.0.0,表示未选举BDR。
Neighbor:邻居的Router ID列表,表示本路由器已经从这些邻居收到了合法的Hello报文。

Hello报文字段

如果路由器发现所接收的合法Hello报文的邻居列表中有自己的Router ID,则认为已经和邻居建立了双向连接,表示邻居关系已经建立。
验证一个接收到的Hello报文是否合法包括:
如果接收端口的网络类型是广播型,点到多点或者NBMA,所接收的Hello报文中Network Mask字段必须和接收端口的网络掩码一致,如果接收端口的网络类型为点到点类型或者是虚连接,则不检查Network Mask字段;
所接收的Hello报文中Hello Interval字段必须和接收端口的配置一致;
所接收的Hello报文中Router Dead Interval字段必须和接收端口的配置一致;
所接收的Hello报文中Options字段中的E-bit(表示是否接收外部路由信息)必须和相关区域的配置一致。


数据库同步
路由器使用DD报文来进行主从路由器的选举和数据库摘要信息的交互。
DD报文包含LSA的头部信息,用来描述LSDB的摘要信息。数据库同步

如图所示,路由器在建立完成邻居关系之后,便开始进行数据库同步,具体过程如下:
邻居状态变为ExStart以后,RTA向RTB发送第一个DD报文,在这个报文中,DD序列号被设置为X(假设),RTA宣告自己为主路由器。RTA宣告自己为主路由器

RTB也向RTA发送第一个DD报文,在这个报文中,DD序列号被设置为Y(假设)。RTB也宣告自己为主路由器。
由于RTB的Router ID比RTA的大,所以RTB应当为真正的主路由器。RTB也宣告自己为主路由器

RTA发送一个新的DD报文,在这个新的报文中包含LSDB的摘要信息,序列号设置为RTB在步骤2里使用的序列号,因此RTB将邻居状态改变为Exchange。RTB将邻居状态改变为Exchange

邻居状态变为Exchange以后,RTB发送一个新的DD报文,该报文中包含LSDB的描述信息,DD序列号设为Y+1(上次使用的序列号加1)。RTB发送一个新的DD报文

即使RTA不需要新的DD报文描述自己的LSDB,但是作为从路由器,RTA需要对主路由器RTB发送的每一个DD报文进行确认。
所以,RTA向RTB发送一个内容为空的DD报文,序列号为Y+1。RTA向RTB发送一个内容为空的DD报文

发送完(上面这个)最后一个DD报文之后,RTA将邻居状态改变为Loading;
RTB收到最后一个DD报文之后,改变状态为Full(假设RTB的LSDB是最新最全的,不需要向RTA请求更新)。


建立完全邻接关系
LSR用于向对方请求所需的LSA。
LSU用于向对方发送其所需要的LSA。
LSACK用于向对方发送收到LSA的确认。建立完全邻接关系

邻居状态变为Loading之后,RTA开始向RTB发送LSR报文,请求那些在Exchange状态下通过DD报文发现的,而且在本地LSDB中没有的链路状态信息。RTA开始向RTB发送LSR报文

RTB收到LSR报文之后,向RTA发送LSU报文,在LSU报文中,包含了那些被请求的链路状态的详细信息。RTA收到LSU报文之后,将邻居状态从Loading改变成Full。TB收到LSR报文之后,向RTA发送LSU报文

RTA向RTB发送LSACK报文,用于对已接收LSA的确认。RTA向RTB发送LSACK报文

此时,RTA和RTB之间的邻居状态变成Full,表示达到完全邻接状态。


OSPF支持的网络类型
缺省情况下,OSPF认为以太网的网络类型是广播类型,PPP、HDLC的网络类型是点到点类型。

广播类型、点到点类型

OSPF定义了四种网络类型,分别是点到点网络,广播型网络,NBMA网络和点到多点网络。
点到点网络是指只把两台路由器直接相连的网络。一个运行PPP的64K串行线路就是一个点到点网络的例子。
广播型网络是指支持两台以上路由器,并且具有广播能力的网络。一个含有三台路由器的以太网就是一个广播型网络的例子。
缺省情况下,OSPF认为帧中继、 ATM的网络类型是NBMA。

NBMA类型、P2MP类型

OSPF可以在不支持广播的多路访问网络上运行,此类网络包括在hub-spoke拓扑上运行的帧中继(FR)和异步传输模式(ATM)网络,这些网络的通信依赖于虚电路。OSPF定义了两种支持多路访问的网络类型:非广播多路访问网络(NBMA)和点到多点网络(Point To Multi-Points)。
NBMA:在NBMA网络上,OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置。NBMA方式要求网络中的路由器组成全连接。
P2MP:将整个网络看成是一组点到点网络。对于不能组成全连接的网络应当使用点到多点方式,例如只使用PVC的不完全连接的帧中继网络。


DR&BDR
DR可以减少广播型网络中的邻接关系的数量。DR可以减少广播型网络中的邻接关系的数量

每一个含有至少两个路由器的广播型网络和NBMA网络都有一个DR和BDR。
DR和BDR可以减少邻接关系的数量,从而减少链路状态信息以及路由信息的交换次数,这样可以节省带宽,降低对路由器处理能力的压力
一个既不是DR也不是BDR的路由器只与DR和BDR形成邻接关系并交换链路状态信息以及路由信息,这样就大大减少了大型广播型网络和NBMA网络中的邻接关系数量。
在没有DR的广播网络上,邻接关系的数量可以根据公式n(n-1)/2计算出,n代表参与OSPF的路由器接口的数量。
在本例中,所有路由器之间有6个邻接关系【4*3÷2】。
当指定了DR后,所有的路由器都与DR建立起邻接关系,DR成为该广播网络上的中心点。
BDR在DR发生故障时接管业务,一个广播网络上所有路由器都必须同BDR建立邻接关系。
本例中使用DR和BDR将邻接关系从6减少到了5,RTA和RTB都只需要同DR和BDR建立邻接关系,RTA和RTB之间建立的是邻居关系。
此例中,邻接关系数量的减少效果并不明显。但是,当网络上部署了大量路由器时,比如100台,那么情况就大不一样了。

DR&BDR选举
DR是基于端口的DR优先级的值进行选举的。DR和BDR选举

在邻居发现完成之后,路由器会根据网段类型进行DR选举。
在广播和NBMA网络上,路由器会根据参与选举的每个接口的优先级进行DR选举。优先级取值范围为0-255,值越高越优先。缺省情况下接口优先级为1。
如果一个接口优先级为0,那么该接口将不会参与DR或者BDR的选举。如果优先级相同时,则比较Router ID,值越大越优先被选举为DR。
为了给DR做备份,每个广播和NBMA网络上还要选举一个BDR。BDR也会与网络上所有的路由器建立邻接关系。
为了维护网络上邻接关系的稳定性,如果网络中已经存在DR和BDR,则新添加进该网络的路由器不会成为DR和BDR,不管该路由器的Router Priority是否最大。
如果当前DR发生故障,则当前BDR自动成为新的DR,网络中重新选举BDR;如果当前BDR发生故障,则DR不变,重新选举BDR。
这种选举机制的目的是为了保持邻接关系的稳定,使拓扑结构的改变对邻接关系的影响尽量小。
总结
首先根据接口下的优先级进行比较,数值越大越优;默认值为1;数值设为0表示放弃参选;
当接口优先级相同时,比较Router-ID,数值越大越优;
DR和BDR的选举,不抢占;
DR失效,BDR成为DR;BDR失效,DR不变,重选BDR。


OSPF区域
每个区域都维护一个独立的LSDB。
Area 0是骨干区域,其他区域都必须与此区域相连。

OSPF区域示意图

OSPF支持将一组网段组合在一起,这样的一个组合称为一个区域。
划分OSPF区域可以缩小路由器的LSDB规模,减少网络流量。
区域内的详细拓扑信息不向其他区域发送,区域间传递的是抽象的路由信息,而不是详细的描述拓扑结构的链路状态信息。
每个区域都有自己的LSDB,不同区域的LSDB是不同的。
路由器会为每一个自己所连接到的区域维护一个单独的LSDB。由于详细链路状态信息不会被发布到区域以外,因此LSDB的规模大大缩小了。
Area 0为骨干区域,为了避免区域间路由环路,非骨干区域之间不允许直接相互发布路由信息。因此,每个区域都必须连接到骨干区域。
运行在区域之间的路由器叫做区域边界路由器ABR(Area Boundary Router),它包含所有相连区域的LSDB。
自治系统边界路由器ASBR(Autonomous System Boundary Router)是指和其他AS中的路由器交换路由信息的路由器,这种路由器会向整个AS通告AS外部路由信息。
在规模较小的企业网络中,可以把所有的路由器划分到同一个区域中,同一个OSPF区域中的路由器中的LSDB是完全一致的。
OSPF区域号可以手动配置,为了便于将来的网络扩展,推荐将该区域号设置为0,即骨干区域。


OSPF开销
OSPF的开销计算公式为带宽参考值/带宽 。
可以通过bandwidth-reference命令来设置带宽参考值。

OSPF开销

OSPF基于接口带宽计算开销,计算公式为:接口开销=带宽参考值÷带宽。带宽参考值可配置,缺省为100Mbit/s。
以此,一个64kbit/s串口的开销为1562(100000÷64≈1562),一个E1接口(2.048 Mbit/s)的开销为48(100÷2.048≈48)。
命令bandwidth-reference可以用来调整带宽参考值,从而可以改变接口开销,带宽参考值越大,开销越准确。
在支持10Gbit/s速率的情况下,推荐将带宽参考值提高到10000Mbit/s来分别为10 Gbit/s、1 Gbit/s和100Mbit/s的链路提供1、10和100的开销。
注意,配置带宽参考值时,需要在整个OSPF网络中统一进行调整。
另外,还可以通过ospf cost命令来手动为一个接口调整开销,开销值范围是1~65535,缺省值为1。通过ospf-cost命令来手动为一个接口调整开销

缺省参考带宽是100,GE口带宽是1000,100÷1000=0.1,当计算结果小于1,取1;
修改参考带宽为10000,即10G,10000÷1000=10修改参考带宽为10000,即10G,10000÷100010

接口下修改OSPF开销值接口下修改OSPF开销值

配置验证配置验证


OSPF认证
华为ARG3系列路由器运行OSPF时,支持两种认证方式:区域认证和接口认证。

OSPF认证示意图

OSPF支持简单认证及加密认证功能,加密认证对潜在的攻击行为有更强的防范性。
OSPF认证可以配置在接口或区域上,配置接口认证方式的优先级高于区域认证方式。
接口或区域上都可以运行ospf authentication-mode { simple [ [ plain ] | cipher ] | null } 命令来配置简单认证,参数simple表示使用明文传输密码,参数plain表示密码以明文形式存放在设备中,参数cipher表示密码以密文形式存放在设备中,参数null表示不认证。
命令ospf authentication-mode { md5 | hmac-md5 } [ key-id { plain | [ cipher ] } ] 用于配置加密认证,MD5是一种保证链路认证安全的加密算法(具体配置已在举例中给出),参数key-id表示接口加密认证中的认证密钥ID,它必须与对端上的key-id一致。
OSPF区域认证
[R5]ospf 1
[R5-ospf-1]area 1
[R5-ospf-1-area-0.0.0.1]authentication-mode simple plain huawei
OSPF接口认证
[R2]interface GigabitEthernet0/0/0
[R2-GigabitEthernet0/0/0]ospf authentication-mode md5 1 cipher huawei213#
在不使用抓包工具的时候,也可以使用终端监视查看信息
terminal monitor
terminal debugging
debugging ospf packet
关闭终端提示、关闭debugging的命令如下
undo debugging all
undo terminal monitor

发表评论

电子邮件地址不会被公开。 必填项已用*标注