在OSPF出现前,网络上广泛使用RIP(Routing Information Protocol)作为内部网关协议。由于RIP是基于距离矢量算法的路由协议,存在着收敛慢、路由环路、可扩展性差等问题,所以逐渐被OSPF取代。OSPF作为基于链路状态的协议,能够解决RIP所面临的诸多问题。此外,OSPF还有以下优点:
- OSPF采用组播形式收发报文,这样可以减少对其它不运行OSPF路由器的影响。
- OSPF支持无类型域间选路(CIDR)。
- OSPF支持对等价路由进行负载分担。
- OSPF支持报文加密。
由于OSPF具有以上优势,使得OSPF作为优秀的内部网关协议被快速接收并广泛使用。
6.2.1 OSPF的专业术语
- Router ID
一台路由器如果要运行OSPF协议,必须存在Router ID。Router ID是一个32比特无符号整数,是一台路由器在自治系统中的唯一标识。Router ID选举规则如下:
- 手动配置OSPF路由器的Router ID(建议手动配置)
- 如果没有手动配置Router ID,则路由器使用Loopback接口中最大的IP地址作为Router ID
- 如果没有配置Loopback接口,则路由器使用物理接口中最大的IP地址作为Router ID
- Router ID一旦选定,之后如果要更改的话就需要重启OSPF进程,在实际工程中,推荐手工指定OSPF路由设备的Router ID。
- 区域
区域是从逻辑上将设备划分为不同的组,每个组用区域号(Area ID)来标识。OSPF的区域ID是一个32bit的非负整数,它有两种表示方法:
- 点分十进制:比如Area 0.0.0.1
- 十进制:比如Area 1
- 度量值
OSPF使用Cost(开销)作为路由的度量值。每一个激活了OSPF的接口都会维护一个接口Cost值,缺省的接口Cost = "100 Mbit/s " /"接口带宽" 。其中100 "Mbit/s"为OSPF指定的缺省参考值,该值是可配置的。如图6-7所示,在R3的路由表中,到达10.0.1.1/32的OSPF路由的Cost值=1+64,即65。
图6-7 OSPF度量值
6.2.2 OSPF路由器的类型
OSPF的路由器类型如图6-8所示。
图6-8路由器类型
- 骨干路由器(Backbone Router):至少有一个接口属于骨干区域。
- 区域内路由器(Internal Router):所有接口都属于同一个OSPF区域
- 区域边界路由器ABR(Area Border Router):可以同时属于两个以上的区域,但其中一个必须是骨干区域。
- 自治系统边界路由器ASBR(AS Boundary Router):只要一台OSPF设备引入了外部路由的信息,它就成为ASBR。
6.2.3 OSPF的包文类型
OSPF用IP报文直接封装协议报文,协议号为89。OSPF分为5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文,如表1-1所示:
表1-1 OSPF包文类型
报文类型 | 作用 |
Hello | 周期性发送,用来发现和维持OSPF邻居关系 |
DD | 描述本地LSDB(Link State Database)的摘要信息,用于两台设备进行数据库同步。 |
LSR | 用于向对方请求所需的LSA。 设备只有在OSPF邻居双方成功交换DD报文后才会向对方发出LSR报文。 |
LSU | 用于向对方发送其所需要的LSA。 |
LSA | 用来对收到的LSA进行确认。 |
6.2.4 OSPF邻居状态
在OSPF网络中,为了交换路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念:
- 邻居关系:OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。
- 邻接关系:形成邻居关系后,如果两端设备成功交换DD报文和LSA,才建立邻接关系。
邻居和邻接状态是通过OSPF状态机表现的,OSPF共有8种邻居状态机,分别是Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full。 Down、2-way、Full是稳定状态,Attempt、Init、Exstart、Exchange、Loading是不稳定状态。不稳定状态是在转换过程中瞬间存在的状态,一般不会超过几分钟。
- Down:邻居会话的初始阶段,表明没有在邻居失效时间间隔内收到来自邻居路由器的Hello数据包。
- Attempt:该状态仅发生在NBMA网络中,表明对端在邻居失效时间间隔(dead interval)超时前仍然没有回复Hello报文。此时路由器依然每发送轮询Hello报文的时间间隔(poll interval)向对端发送Hello报文。
- Init:收到Hello报文后状态为Init。
- 2-way:收到的Hello报文中包含有自己的Router ID,则状态为2-way;如果不需要形成邻接关系则邻居状态机就停留在此状态,否则进入Exstart状态。
- Exstart:开始协商主从关系,并确定DD的序列号,此时状态为Exstart。
- Exchange:主从关系协商完毕后开始交换DD报文,此时状态为Exchange。
- Loading:DD报文交换完成即Exchange done,此时状态为Loading。
- Full:LSR重传列表为空,此时状态为Full。
6.2.5 OSPF网络类型
OSPF网络类型是一个非常重要的接口变量,这个变量将影响OSPF在接口上的操作,例如采用什么方式发送OSPF协议报文,以及是否需要选举DR、BDR等,接口默认的OSPF网络类型取决于接口所使用的数据链路层封装,OSPF支持4种网络类型:
- P2P(Point-to-Point,点到点)
- P2MP(Point to Multi-Point,点到多点)、
- BMA(Broadcast Multiple Access,广播式多路访问)
- NBMA(Non-Broadcast Multiple Access,非广播式多路访问)
P2P网络如图6-9所示,P2P指的是在一段链路上只能连接两台网络设备的环境,典型的例子是PPP链路,当接口采用PPP封装时,OSPF在该接口上采用的缺省网络类型为P2P。
图6-9 P2P网络示例
P2MP网络如图6-10所示, P2MP相当于将多条P2P链路的一端进行捆绑得到的网络,没有一种链路层协议会被缺省的认为是P2MP网络类型,该类型必须由其他网络类型手动更改,常用做法是将非全连通的NBMA改为点到多点的网络。
图6-10 P2MP网络示例
BMA网络如图6-11所示,BMA也被称为Broadcast,指的是一个允许多台设备接入的、支持广播的环境,典型的例子是Ethernet(以太网)。当接口采用Ethernet封装时,OSPF在该接口上采用的缺省网络类型为BMA。
图6-11 BMA网络示例
NBMA网络如图6-12所示,NBMA指的是一个允许多台网络设备接入且不支持广播的环境,典型的例子是帧中继(Frame-Relay)网络。
图6-12 NBMA网络示例
一般情况下,链路两端的OSPF接口网络类型必须一致,否则双方无法建立邻居关系,OSPF网络类型可以在接口下通过命令手动修改以适应不同网络场景,例如在一个广播域下只有两台OSPF路由器时,可以将BMA网络类型修改为P2P。
6.2.6 DR与BDR的选举
前文中提到的广播式多路访问(BMA)与非广播式多路访问(NBMA)都属于多路式访问网络(MA),我们经常提到的以太网就是一种典型的广播式多路访问网络,如图6-13所示,在MA网络中,如果每台OSPF路由器都与其他的所有路由器建立OSPF邻接关系,便会导致网络中存在过多的OSPF邻接关系,增加设备负担,也增加了网络中泛洪的OSPF报文数量,尤其是当拓扑发生变更时,网络中的LSA泛洪可能会造成带宽的浪费和设备资源的损耗。
图6-13 无DR/BDR MA网络中的邻接关系数量
为了减少MA网络中的泛洪,优化MA网络中OSPF邻接关系,OSPF中指定了三种OSPF路由器身份:DR、BDR和DRother,而且只允许DR、DRother与其他OSPF路由器建立邻接关系,DRother之间的邻居关系会停留在2-way状态,BDR的存在是为了保障网络可靠性,BDR会监控DR的状态,并在当前DR发生故障时接替其角色,如图6-14所示,DR与BDR的存在可以减少邻接关系的数量从而减少设备的负担。
图6-14 DR/BDR减少MA网络中的邻接关系
DR/BDR的选举规则为:先比较设备DR优先级,优先级的取值范围为0-255,数值越大越优先,其默认值为1,设置为0时,不参与DR/BDR选举,如果无法通过优先级选举出DR/BDR,则比较Router-ID,具有更高的OSPF Router-ID的路由器(的接口)被选举成DR,其次为BDR,值得注意的是的是DR具有非抢占性,也就是说在一个MA网络中,一旦选举出来了DR,在DR设备正常运行的情况下,就算具有更高优先级的设备加入了此MA网络,也不会被选举为DR。
不同网络类型中的DR/BDR的选举如表6-2所示:
表6-2 不同网络类型中的DR/BDR的选举
OSPF网络类型 | 常见链路层协议 | 是否选举DR | 是否和邻居建立邻接关系 |
P2P | PPP链路; HDLC链路 | 否 | 是 |
Broadcast | 以太网链路 | 是 | DRother之间为邻居关系,其他均为邻接关系 |
NBMA | 帧中继链路 | ||
P2MP | 需手工指定 | 否 | 是 |