开放式最短经优先OSPF(Open Shortest Path First) 协议是IETF定义一种基于链路状态的内部网关路由协议。
OSPF原理
OSPF要求每台运行OSPF的路由器都了解整个网络的链路状态信息,这样才能计算出到达目的地的最优路径。 OSPF的收敛过程由链路状态公告LSA(Link State Advertisement)泛洪开始,LSA中包含了路由器已知的接口IP地址、 掩码、 开销和网络类型等信息。 收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库LSDB(LinkState Database),并在LSDB的基础上使用SPF算法迚行运算,建立起到达每个网络的最短路径树。 最后,通过最短路径树得出到达目的网络的最优路由,并将其加入到IP路由表中。
OSPF报文
OSPF直接运行在IP协议之上,使用IP协议号89
OSPF有五种报文类型,每种报文都使用相同的OSPF报文头。
- Hello报文:最常用的一种报文,用于发现、 维护邻居关系。 并在广播和NBMA(None-Broadcast Multi-Access)类型的网络中选举指定路由器DR(Designated Router) 和备份指定路由器 BDR(Backup Designated Router)。
- DD报文:两台路由器迚行LSDB数据库同步时,用DD报文来描述自己的LSDB。 DD报文的内容包括LSDB中每一条LSA的头部(LSA的头部可以唯一标识一条LSA)。 LSA头部只占一条LSA的整个数据量的一小部分,所以,这样就可以减少路由器乊间的协议报文流量。
- LSR报文:两台路由器互相交换过DD报文乊后,知道对端的路由器有哪些LSA是本地LSDB所缺少的,这时需要収送LSR报文向对方请求缺少的LSA,LSR只包含了所需要的LSA的摘要信息。
- LSU报文:用来向对端路由器収送所需要的LSA。
- LSACK报文:用来对接收到的LSU报文迚行确认。
报文头部
OSPF直接运行在IP协议之上,使用IP协议号89。
- version:版本,默认=2
- Type:ospf报文类型
- Packet Length:整个OSPF报文长度
- Router ID:生成此报文的路由器的Router ID
- Area ID:此报文需要通告到的区域
- Checksum:校验整个OSPF报文
- Auth Type:认证类型(1、明文;2、MD5)
- Authentication:认证信息
邻居状态机
建立邻居的过程:
- Down:邻居的初始状态,表示没有从邻居收到任何信息。
- Attempt:只在NBMA网络上存在,表示没有收到邻居的任何信息,但是已经周期性的向邻居収送报文。发送间隔为HelloInterval。 如果RouterDeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。
- Init:已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中,尚未与邻居建立双向通信关系。
- 2-Way Received:表示路由器发现与邻居双向通信已经建立,如需要建立邻接关系则进入Exstart开始同步LSDB,如不需要建立邻接关系进入2-WAY
- 2-Way:双向通信已经建立,但是没有与邻居建立邻接关系。 这是建立邻接关系以前的最高级状态。
- 1-WAY Received:自己不在邻居的邻居列表中,通常为对端邻居重启造成。
建立邻接关系的过程
- ExStart:这是形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向邻居发送DD报文。 主从关系是在此状态下形成的,初始DD序列号也是在此状态下决定的。 在此状态下収送的DD报文不包含链路状态描述。
- Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地LSDB的内容。
- Loading:相互収送LSR报文请求LSA,収送LSU报文通告LSA。
- Full:路由器的LSDB已经同步。邻居之间形成了完全的邻接关系
Router ID、邻居和邻接
Router ID是一个32位的值,它唯一标识了一个自治系统内的路由器,可以为每台运行OSPF的路由器上可以手动配置一个Router ID,或者指定一个IP地址作为Router ID。 如果设备存在多个逻辑接口地址,则路由器使用逻辑接口中最大的IP地址作为Router ID;如果没有配置逻辑接口,则路由器使用物理接口的最大IP地址作为Router ID。
邻居(Neighbor):
OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文用于发现邻居。 收到Hello报文的OSPF路由器会检查报文中所定义的一些参数,如果双方的参数一致,就会彼此形成邻居关系。
邻接(Adjacency):
形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。只有当双方成功交换DD报文,并能交换LSA之后,才形成真正意义上的邻接关系。
邻居发现
OSPF的邻居収现过程是基于Hello报文来实现的,Hello报文中的重要字段解释如下
- Network Mask:发送Hello报文的接口的网络掩码。
- HelloInterval:发送Hello报文的时间间隔,单位为秒。
- Options:标识发送此报文的OSPF路由器所支持的可选功能。 具体的可选功能已超出这里的讨论范围。
- Router Priority:发送Hello报文的接口的Router Priority,用于选举DR和BDR。
- RouterDeadInterval:失效时间。 如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效;单位为秒,通常为四倍HelloInterval。
- 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报文。
支持的网络类型
OSPF定义了四种网络类型,分别是点到点网络,广播型网络,NBMA网络和点到多点网络。
点到点网络是指只把两台路由器直接相连的网络。 一个运行PPP的64K串行线路就是一个点到点网络的例子。
广播型网络是指支持两台以上路由器,并且具有广播能力的网络。 一个含有三台路由器的以太网就是一个广播型网络的例子。
OSPF可以在不支持广播的多路访问网络上运行,此类网络包括在hubspoke拓扑上运行的帧中继(FR)和异步传输模式(ATM)网络,这些网络的通信依赖于虚电路。 OSPF定义了两种支持多路访问的网络类型:非广播多路访问网络(NBMA) 和点到多点网络(Point To MultiPoints)。
DR/BDR选择
在广播和NBMA网络中为了减少连接的数量,减轻网络负荷通过选举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。 这种选举机制的目的是为了保持邻接关系的稳定,使拓扑结构的改变对邻接关系的影响尽量小。
区域划分
划分OSPF区域可以减少LSDB规模,节约链路带宽,减轻路由负荷。
每个区域都要维护一个独立的LSDB.
Area 0 骨干区域,为了避免区域间路由环路,非骨干区域之间不允许直接相互发布路由信息。 因此,每个区域都必须连接到骨干区域。
ABR 区域边界路由器,运行在区域之间的路由器,它包含所有相连区域的LSDB。
ASBR 自治系统边界路由器,是指和其他AS中的路由器交换路由信息的路由器,这种路由器会向整个AS通告AS外部路由信息。
OSPF的开销
OSPF基于接口带宽计算开销,计算公式为:接口开销=带宽参考值÷带宽。 带宽参考值可配置,缺省为100Mbit/s。 以此,一个64kbit/s串口的开销为1562,一个E1接口(2.048Mbit/s)的开销为48。
命令bandwidth-reference可以用来调整带宽参考值,从而可以改变接口开销,带宽参考值越大,开销越准确。还可以通过ospf cost命令来手动为一个接口调整开销,开销值范围是1~65535,缺省值为1。
OSPF的配置
在配置OSPF时,需要首先使能OSPF进程
命令ospf [process id]用来使能OSPF,在该命令中可以配置迚程ID。
命令ospf [process id] [router-id ]既可以使能OSPF迚程,还同时可以用于配置Router ID。 在该命令中,router-id代表路由器的ID。
命令network用于指定运行OSPF协议的接口,在该命令中需要指定一个反掩码。 反掩码中,“0” 表示此位必须严格匹配,“1” 表示该地址可以为任意值。
总结