本文简要分析OSPF协议的原理和应用,利用Cisco Packet Tracer仿真器搭建环境,对OSPF协议进行实验配置,供学习记录。
按照作用于AS的范围,常见路由协议可划分为两类:
- 内部网关协议 (Interior Gateway Protocols, IGP):具体包括RIP、OSPF、IS-IS、EIGRP等,一般由单个ISP运营于一个AS内,有统一的自治系统号,目前大型企业内部多使用OSPF、IS-IS,小型企业内部使用RIP或静态路由
- 外部网关协议 (Exterior Gateway Protocols, EGP):BGP是目前唯一使用的一种EGP协议,它是AS间的路由协议,一般用于不同ISP之间交换路由信息,以及大型企业、政府等具有较大规模的私有网络
下面对内部网关协议中的OSPF进行介绍:
一、基本原理
OSPF(Open Shortest Path First) 是一种链路状态路由协议,它克服了距离矢量路由协议依赖邻居进行路由决策的缺点,报文基于IP,多部署于中大型园区、企业或城域网中。
OSPF提出了“区域”的概念,将AS划分成多个逻辑区域,每个区域中所有路由器通过组播的方式 (224.0.0.5 或 225.0.0.6) 宣告链路状态建立并维护着一个相同的链路状态数据库 (Link State DataBase, LSDB),其中存放着接口的相关信息 (IP地址、带宽以及所连接的邻居等),OSPF路由器通过各自的LSDB,利用最短路径优先算法 (Shortest Path First, SPF, 也称为Dijkstra算法) 生成最短路径树并构造路由表,其路径开销 (Cost) 计算基于接口的带宽,每个区域的OSPF路由器负责各自区域的LSA传递及路由计算。
(一) 区域类型
划分多区域的优势在于收敛快、易于维护管理、方便扩展,区域的划分基于网段 (路由器接口),区域类型分为两类:
- 骨干区域 (传输区域):Area 0,1个AS中一般只存在1个Area 0区域
- 非骨干区域 (常规区域):Area x,1个AS中可以有多个Area x区域,根据能够学习的路由信息种类进而细分为四类:
标准区域 (Standard Area):正常传输数据的区域 末节区域 (Stub Area):禁用外部AS的信息 完全末节区域 (Totally Stub Area):禁用外部AS和区域间信息 非纯末节区域 (NSSA):禁用非直连的外部AS信息
常规区域只能和骨干区域交换LSA,常规区域相互之间无法交换LSA,因此所有的常规区域应该直接和骨干区域相连,骨干区域的功能类似中转站,将常规区域间的LSA信息进行转发和交换。
(二) 路由器类型
根据路由器接口所在区域的类型,相应地路由器分为四类:
- 内部路由器 (Internal Router, IR):所有接口都在同一个区域内,只维护本区域的LSDB
- 区域边界路由器 (Area Border Routers, ABR):同时属于两个以上的区域,其中必须包括骨干区域 (物理连接或通过虚链路连接),用于连接骨干区域和非骨干区域
- 骨干路由器 (BackBone Router, BR):所有ABR和位于骨干区域内的路由器都属于骨干路由器,只维护骨干区域的LSDB,
- 自治系统边界路由器 (AS Boundary Routers, ASBR):与其他AS交换路由信息的路由器,可以使用多种路由协议,可以是ABR,也可以是内部路由器
基本区域划分和路由器类型如下图所示:
(三) Router-ID
Router-ID是OSPF路由器的唯一身份标识,Router-ID格式与IP一致,可以手动进行配置,如果不配置系统则会自动将路由器环回接口 (Loopback Interface) 中最大的IP作为Router-ID,只要路由器在线,环回接口就处于活动状态,如果没有环回接口,则选择活动的物理接口中最大的IP作为Router-ID。
(四) DR / BDR / DROTHER
在一个OSPF区域中,当路由器之间建立邻居关系后,为避免LSA信息重复发送,选举一个路由器作为指定路由器 (Designated Router, DR),再选举一个路由器作为备份指定路由器 (Backup Designated Router, BDR),其他的路由器为非指定路由器 (DROTHER)。在LSA信息更新时,此区域内发生更新的路由器将LSA发送到DR,再由DR发送到其他区域内的路由器,一个区域内邻居路由器只和DR交换LSA信息,这样节省了网络流量。在DR出现故障时,BDR起着备份的作用,确保网络的可靠性。
DR和BDR的选举首先通过是通过时间,最先启动的OSPF路由器会启动一个定时器 (CISCO 40s),定时器结束前如果没有其他的OSPF启动,则这唯一的OSPF路由器当选为DR;当有多个OSFP路由器时则先比较优先级,优先级高的选为DR,次高的为BDR;如果优先级相同则通过比较Router-ID大小,Router-ID大的选为DR,次高的为BDR;其他的OSPF路由器为DROTHER。
(五) 路由器状态
OSPF路由器在同步LSDB过程中,分为七种状态:
- Down:接口没有启用OSPF的状态,邻居失效后变为该状态
- Init:初始化状态,发送完HELLO包,状态就从Down变为Init
- 2-way:接收到了对方的HELLO包之后,从Initial变为2-way邻居状态,开启40秒定时器,相互间周期发送HELLO报文(10秒发一次),给足够的时间深度发现其他路由器发送的HELLO包,等待40秒定时器超时
- Exstart:定时器40秒超时后,状态变为Exstart,但是在变为Exstart状态前,会完成DR和BDR的选举,进入Exstart状态后立即选举主从路由器,引导接下来报文的发送
- Exchange:主从关系确认后,开始交换DBD报文 (本地LSA摘要信息),告知对端本地所有的LSA摘要信息
- Loading:发送完LSA摘要信息后,再通过发送LSR、LSU、LSACK报文更新LSA,学习对端路由器的LSA详细信息
- Full:LSA详细信息学习完毕后,状态变为Full邻接状态,LSDB完成同步,此时在单个域内所有路由器的LSDB相同
(六) 虚链路
非骨干区域和骨干区域之间通过ABR中转LSA,其他路由器需要向ABR建立一条虚链路 (虚链路只能跨一个区域),否则无法同步LSDB信息。如下所示,RT2与RT3建立虚链接后,使得Area2与Area0之间形成逻辑连接,否则LSDB信息无法同步。 骨干区域必须是一个整体,虚链路也可以将隔开的两个骨干区域相连接,如下所示,RT2与RT3建立虚链接后,Area0在逻辑上成为一个整体。
(七) 常见LSA类型
LSA类型 | 名称 | 作用 | 路由表符号 |
---|
Type1 | Router LSA | 所有路由器都会产生,只在本区域内泛洪,用于通告路由器自身所有的链路和接口的状态以及开销 | O | Type2 | Network LSA | 由一个多路访问网络中的DR产生,只在本区域内泛洪,用于通告DROTHER路由信息以及与之相连的路由器包括DR本身 | O | Type3 | Network Summary LSA | 由ABR产生,用于通告与ABR相连的区域内所有路由器的路由信息,不同区域的路由将指向通告LSA的ABR | IA | Type4 | ASBR Summary LSA | 由ABR产生,用于通告ASBR路由器地址,在整个AS的标准区域内泛洪 | IA | Type5 | AS External LSA | 由ASBR产生,用于通告与ASBR相连的其他AS的路由信息,在整个AS的标准区域内泛洪 | E1/E2 | Type7 | NSSA External LSA | 由连接到NSSA的ASBR产生,通告内容和类型5 LSA基本相同,区别在于只在产生此LSA的NSSA区域内部泛洪,可以通过ABR转换称类型5 LSA | N1/N2 |
(八) 工作过程
① 建立邻居关系:OSPF路由器初始化时,在同一区域的相邻路由器之间通过HELLO报文发现并建立邻居关系,路由器状态为2-way;
② 同步LSDB (建立邻接关系):互为邻居关系的路由器首先选举出DR/BDR,然后通过数据库描述报文 (DataBase Description, DBD) 相互发送链路状态通告 (Link State Adervertisement, LSA),包括接口地址、带宽、邻居等链路状态信息,收到LSA的路由器将信息保存在LSDB中,然后继续发送相同的LSA到该路由器的邻居,而邻接关系就是邻居路由器之间为完成LSDB同步而发生的LSA交互过程 (通常是同一个区域的DR和DROTHER之间) ,当LSA传播到整个区域后,单个区域内所有的路由器都会形成相同的LSDB,路由器状态为Full;
③ 构建路由表:同一个区域内的路由器通过Type1和Type 2 LSA通告同步LSDB,同步后同一个区域内的LSDB是相同的,路由器会结合自身LSDB信息,使用SPF算法生成最短路径树,构建出各自的区域内路由表;区域间路由则依靠ABR完成,ABR会查找其相邻区域内的路由表,每一条表项生成一条Type3类型的LSA,然后将Type3 LSA泛洪到其他相邻区域 (此类型LSA只有路由信息,不包含链路状态信息,不参与SPF计算),在泛洪区域的路由器会根据Type3 LSA生成区域间路由信息,路由的下一跳指向发布LSA的ABR,路由信息直接加入路由表项;
④ 路由信息维护:邻居之间根据配置固定时间交换hello数据包作为心跳消息,并且每隔30分钟重传一次LSA。如果网络拓扑稳定,那么OSPF将是稳定的。如果网络拓扑发生了变化,比如有节点故障或者新增节点,那么将重新开始交换信息并计算路由。
(九) 优缺点分析
优点:
- 收敛速度快,能够在最短的时间内将路由变化传递到整个自治系统
- 没有跳数限制,支持大量网络节点,适用于大规模网络
- 采用路径开销 (Cost) 作为度量标准,路径开销计算基于接口的带宽
- 划分区域进行管理,减少大规模网络中协议运行的流量和开销
缺点:
- 配置复杂,需要区分不同的网络区域和路由器类型
- 路由负载均衡性较差,通常只路由最佳路径,而不能均衡不同路径间的流量
二、实验配置
(一) 实验拓扑
(二) 配置命令
(VLAN、DHCP、NAT等基础配置略过,只记录路由配置部分)
# R0配置
R0(config)# ip route 0.0.0.0 0.0.0.0 1.1.1.1
# R1配置
R1(config)# interface lookback 0
R1(config-if)# ip address 10.10.10.1 255.255.255.255
R1(config-if)# exit
R1(config)# router ospf 1
R1(config-router)# router id 10.10.10.1
R1(config-router)# network 1.1.1.0 0.0.0.255 area2
R1(config-router)# network 2.2.2.0 0.0.0.255 area2
R1(config-router)# network 10.10.10.1 0.0.0.0 area2
R1(config-router)# exit
# R2配置
R2(config)# interface lookback 0
R2(config-if)# ip address 10.10.10.2 255.255.255.255
R2(config-if)# exit
R2(config)# router ospf 1
R2(config-router)# router id 10.10.10.2
R2(config-router)# area 1 virtual-link 10.10.10.3
R2(config-router)# network 2.2.2.0 0.0.0.255 area2
R2(config-router)# network 3.3.3.0 0.0.0.255 area1
R2(config-router)# network 10.10.10.2 0.0.0.0 area1
R2(config-router)# exit
# R3配置
R3(config)# interface lookback 0
R3(config-if)# ip address 10.10.10.3 255.255.255.255
R3(config-if)# exit
R3(config)# router ospf 1
R3(config-router)# router id 10.10.10.3
R3(config-router)# area 1 virtual-link 10.10.10.2
R3(config-router)# network 3.3.3.0 0.0.0.255 area1
R3(config-router)# network 4.4.4.0 0.0.0.255 area0
R3(config-router)# network 10.10.10.3 0.0.0.0 area1
R3(config-router)# exit
# R4配置
R4(config)# interface lookback 0
R4(config-if)# ip address 10.10.10.4 255.255.255.255
R4(config-if)# exit
R4(config)# router ospf 1
R4(config-router)# router id 10.10.10.4
R4(config-router)# network 4.4.4.0 0.0.0.255 area0
R4(config-router)# network 5.5.5.0 0.0.0.255 area0
R4(config-router)# network 10.10.10.4 0.0.0.0 area0
R4(config-router)# exit
# R5配置
R5(config)# ip route 0.0.0.0 0.0.0.0 5.5.5.2
配置后可用命令查看路由信息:
# 查看OSPF配置信息
Router(config)# show ip ospf ?
# 查看路由表,可见OSPF同步的路由表项目
Router(config)# show ip route
|