本文简要分析OSPF协议的原理和应用,利用Cisco Packet Tracer仿真器搭建环境,对OSPF协议进行实验配置,供学习记录。
按照作用于AS的范围,常见路由协议可划分为两类:
下面对内部网关协议中的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路由器负责各自区域的链路状态通告 (Link State Adervertisement, LSA) 传递及路由计算。
划分多区域的优势在于收敛快、易于维护管理、方便扩展,区域的划分基于网段 (路由器接口),区域类型分为两类:
常规区域只能和骨干区域交换LSA,常规区域相互之间无法交换LSA,因此所有的常规区域应该直接和骨干区域相连,骨干区域的功能类似中转站,将常规区域间的LSA信息进行转发和交换。
根据路由器接口所在区域的类型,相应地路由器分为四类:
Router-ID是OSPF路由器的唯一身份标识,Router-ID格式与IP一致,可以手动进行配置,如果不配置系统则会自动将路由器环回接口 (Loopback Interface) 中最大的IP作为Router-ID,只要路由器在线,环回接口就处于活动状态,如果没有环回接口,则选择活动的物理接口中最大的IP作为Router-ID。
在一个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支持四种网络类型:
(注意网络类型不同于物理拓扑,其划分主要基于网络在链路层运行的协议)
OSPF路由器在同步LSDB过程中,分为七种状态:
非骨干区域和骨干区域之间通过ABR中转LSA,其他路由器需要向ABR建立一条虚链路 (虚链路只能跨一个区域),否则无法同步LSDB信息。如下所示,RT2与RT3建立虚链接后,使得Area2与Area0之间形成逻辑连接,否则LSDB信息无法同步。
骨干区域必须是一个整体,虚链路也可以将隔开的两个骨干区域相连接,如下所示,RT2与RT3建立虚链接后,Area0在逻辑上成为一个整体。
LSA类型 | 名称 | 作用 | 路由表符号及类型 |
---|---|---|---|
Type1 | Router LSA | 所有路由器都会产生,只在本区域内泛洪,用于通告路由器所有接口状态及开销 | O: 区域内路由 |
Type2 | Network LSA | 由一个多路访问网络中的DR产生,只在本区域内泛洪,用于向区域内的其它路由器通告网络信息以及接入此网络的路由器 | O: 区域内路由 |
Type3 | Network Summary LSA | 由ABR产生,用于通告与ABR相连的区域内所有路由器的路由信息,区域间路由指向通告LSA的ABR | IA: 区域间路由 |
Type4 | ASBR Summary LSA | 由ABR产生,用于通告ASBR的地址 (Router-ID),在整个AS的标准区域内泛洪 | IA: 区域间路由 |
Type5 | AS External LSA | 由ASBR产生,用于通告与ASBR相连的其他AS的路由信息,在整个AS的标准区域内泛洪 | E1/E2: 1/2类外部路由 |
Type7 | NSSA External LSA | 由连接到NSSA的ASBR产生,通告内容和Type5 LSA基本相同,区别在于只在产生此LSA的NSSA区域内部泛洪,可以通过ABR转换为Type5 LSA | N1/N2: 1/2类NSSA外部路由 |
以常见的BMA类型网络为例,OSPF基本工作过程如下:
① 建立邻居关系:OSPF路由器初始化时,在同一区域的相邻路由器之间通过HELLO报文发现并建立邻居关系,路由器状态为2-way;
② 同步LSDB (建立邻接关系):互为邻居关系的路由器首先选举出DR/BDR,然后DROTHER和DR/BDR之间相互发送数据库描述报文 (Database Description, DD),如果发现DD描述信息和自身的LSDB信息不一致,则返回数据库状态请求报文 (Link State Request, LSR),收到LSR的路由器会发送数据库状态更新报文 (Link State Update, LSU),LSU内含完整的LSA信息,其中包括接口地址、带宽、邻居等链路状态信息,收到LSA的路由器会返回LSAck,并将信息保存在自身LSDB中,从而完成LSDB的同步,以上报文全部基于组播发送。邻接关系就是邻居路由器之间为完成LSDB同步而发生的LSA交互过程 (DROTHER只和DR/BDR之间建立邻接关系,DROTHER之间不会建立邻接关系),同步后单个区域内所有的路由器都会形成相同的LSDB,路由器状态为Full;
③ 构建路由表:路由器结合自身LSDB信息,使用SPF算法生成最短路径树,构建出各自的区域内路由表;区域间路由则依靠ABR完成,ABR会查找其相邻区域内的路由表,如果存在其他区域的路由信息,则每一条表项生成一条Type3类型的LSA,然后将Type3 LSA泛洪到其他相邻区域 (此类型LSA只有路由信息,不包含链路状态信息,不参与SPF计算),在泛洪区域的路由器会根据Type3 LSA生成区域间路由信息,路由的下一跳指向发布LSA的ABR,路由信息直接加入路由表项;
④ 路由信息维护:一方面,邻居之间根据配置固定时间交换HELLO数据包作为心跳消息,并且每隔30分钟DR会定期重发一次DD包进行LSDB的同步;另一方面,当网络拓扑中节点状态发生了变化,比如有节点故障或者新增节点,那么发生变化的节点将立刻向DR发送LSU更新LSA信息,再由DR向DROTHER发送LSU更新其他路由器的LSA信息,完成LSDB同步,最后会重新计算生成新的路由表项。
优点:
缺点:
(VLAN、DHCP、NAT等基础配置略过,只记录路由配置部分)
# R0配置
R0(config)# ip route 0.0.0.0 0.0.0.0 1.1.1.1 // 边界路由器设置静态路由指向ISP的路由器
# R1配置
R1(config)# interface loopback 0 // 配置环回接口,接口地址用于配置Router-ID,范围 0-2147483647
R1(config-if)# ip address 10.10.10.1 255.255.255.255
R1(config-if)# exit
R1(config)# router ospf 1 // 启动OSPF进程,范围 1-65535
R1(config-router)# router-id 10.10.10.1 // 配置Router-ID
R1(config-router)# network 1.1.1.0 0.0.0.255 area 2 // 宣告直连网段和所属区域,用反向掩码表示子网掩码
R1(config-router)# network 2.2.2.0 0.0.0.255 area 2
R1(config-router)# network 10.10.10.1 0.0.0.0 area 2
R1(config-router)# exit
# R2配置
R2(config)# interface loopback 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 // 建立虚连接,指向跨越区域ABR的Router-ID
R2(config-router)# network 2.2.2.0 0.0.0.255 area 2
R2(config-router)# network 3.3.3.0 0.0.0.255 area 1
R2(config-router)# network 10.10.10.2 0.0.0.0 area 1
R2(config-router)# exit
# R3配置
R3(config)# interface loopback 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 area 1
R3(config-router)# network 4.4.4.0 0.0.0.255 area 0
R3(config-router)# network 10.10.10.3 0.0.0.0 area 1
R3(config-router)# exit
# R4配置
R4(config)# interface loopback 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 area 0
R4(config-router)# network 5.5.5.0 0.0.0.255 area 0
R4(config-router)# network 10.10.10.4 0.0.0.0 area 0
R4(config-router)# exit
# R5配置
R5(config)# ip route 0.0.0.0 0.0.0.0 5.5.5.2
配置后可用命令查看路由信息:
# 查看OSPF配置信息
Router# show ip ospf ?
# 查看所有路由表项
Router# show ip route
# 查看OSPF路由表项
Router# show ip route ospf
# 查看IP路由协议配置参数和运行情况
Router# show ip protocols