OSPF
OSPF 协议是一种链路状态路由协议,包括单区域OSPF和多区域OSPF。OSPFv2 是适用于 IPv4 网络的OSPF协议版本。OSPFv3 是适用于 IPv6 网络的OSPF协议版本。
OSPF 的组件![](https://img-blog.csdnimg.cn/img_convert/cda3ed0bdb4ed8c0e66323cb1109a9b3.png#averageHue=#fdfdfc&id=iVmv8&originHeight=1250&originWidth=1046&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
链路状态数据库 (LSDB)
路由器在构建拓扑表时,会使用 Dijkstra SPF(最短路径优先)算法计算出的结果。SPF 算法基于到达目的地的累计开销。路由变化会触发路由更新(非30秒更新)。在 IPv4 中,两台相邻的 OSPF 路由器之间会使用 MD5 进行认证。在 IPv6 中,OSPFv3 自身并不包含任何认证功能。它会完全依赖 IPsec 来保护邻居之间的通信。路由器可以分为多个区域,以支持分层结构。
SPF 算法将每个路由器置于树的根部并计算到达每个节点的最短路径,从而创建 SPF 树。然后使用 SPF 树计算最佳路由。OSPF 将最佳路由放入转发数据库,用于创建路由表。
单区域和多区域 OSPF
OSPF 区域是在 链路状态数据库LSDB 中共享相同链路状态信息的一组路由器。我们可以按照以下两种方式来实施OSPF:
- 单区域 OSPF -所有路由器都属于同一个区域。最佳实践是使用区域 0。
- 多区域 OSPF - 以多区域、层级式的方式来实施OSPF。所有区域必须连接到骨干区域(区域 0)。互联各个区域的路由器称为区域边界路由器 (ABR)。
多区域 OSPF![](https://img-blog.csdnimg.cn/img_convert/dbf22ef2b6b2b43fc57a0d95d04da5ba.png#averageHue=#f9f8ec&id=czoNR&originHeight=956&originWidth=1022&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=)
OSPF数据包类型
OSPF会借助链路状态数据包的帮助,来确定转发数据包的最快可用路由。OSPF会使用链路状态数据包 (LSP) 来建立和维护与邻居的邻接关系,并交换路由更新。每种数据包都在 OSPF 路由进程中发挥着各自的作用:
第 4 类 LSU 数据包用于回复 LSR 数据包。一个 LSU 数据包中可以包含 11 种不同类型的 OSPFv2 LSA。
OSPF使用第一类Hello数据包完成以下工作:(Hello 数据包不断进行交换以维护路由器信息。)
- 发现 OSPF 邻居并建立相邻关系。
- 通告两台路由器建立相邻关系所必需统一的参数。
- 在多接入网络(如以太网)上选举出指定路由器(DR)和备用指定路由器(BDR)。点对点链路不需要 DR 或 BDR。
Hello数据包中长度为8位的路由器ID字段用来标识使发路由器。
链路状态工作原理
为了维护路由信息,OSPF 路由器需要完成一个通用的链路状态路由过程,并达到收敛状态:图中展示了一个由5台路由器构成的拓扑。路由器之间的每条链路上都有一个开销值标签。在 OSPF 中,开销是用来确定去往目的地的最优路径的。 路由器会按照以下步骤完成链路状态路由过程:
- 建立邻居邻接关系(路由器交换Hello数据包)
- 交换链路状态通告(路由器交换LSA)
例题:
- 构建链路状态数据库(R1创建了自己的拓扑表LSDB)
- 执行 SPF 算法(创建一个SPF树)
选择最优路由
OSPF运行状态
当 OSPF 路由器初次连接到网络时,它会尝试以下操作:
- 与邻居建立邻接关系
- 交换路由信息
- 计算最佳路由
- 实现收敛
图中详述了为了达到收敛状态,OSPF会经历的几种状态:1.4.2单元检测知识点
在思科路由器上,默认情况下 dead 间隔是 hello 间隔的 4 倍
单区域 OSPFv2 配置
全局配置命令 router ospf process-id 来启用 OSPFv2,之后路由器会进入路由器配置模式。
命令列表中只展示了本模块中使用的命令。
R1(config)# router ospf 10
R1(config-router)# ?
area OSPF area parameters
auto-cost Calculate OSPF interface cost according to bandwidth
default-information Control distribution of default information
distance Define an administrative distance
exit Exit from routing protocol configuration mode
log-adjacency-changes Log changes in adjacency state
neighbor Specify a neighbor router
network Enable routing on an IP network
no Negate a command or set its defaults
passive-interface Suppress routing updates on an interface
redistribute Redistribute information from another routing protocol
router-id router-id for this OSPF process
R1(config-router)#
process-id 值的取值范围是1到 65,535,由网络管理员选定。
process-id 值仅在本地有效,也就是说,不需要与其他 OSPF 路由器使用相同的值,也可以与邻居建立邻接关系。
最佳实践建议为所有 OSPF 路由器都是用相同的 process-id 值。
ospf参考拓扑
该示例展示了如何在 R1 上配置环回接口。假设管理员没有明确配置路由器 ID,R1也还没有学到路由器ID,那么它会使用 IPv4 地址 1.1.1.1 作为路由器 ID。假设R1还没有学到路由器ID。
R1(config-if)# interface Loopback 1
R1(config-if)# ip address 1.1.1.1 255.255.255.255
R1(config-if)# end
R1# show ip protocols | include Router ID
Router ID 1.1.1.1
我们可以使用路由器配置模式的命令 router-id rid 来手动分配路由器 ID。在本例中,管理员为R1分配了路由器ID 1.1.1.1。
R1(config)# router ospf 10
R1(config-router)# router-id 1.1.1.1
R1(config-router)# end
*May 23 19:33:42.689: %SYS-5-CONFIG_I: Configured from console by console
R1# show ip protocols | include Router ID
Router ID 1.1.1.1
注意: router-id 命令是首选的方法。但有些早期的IOS版本不支持 router-id 命令;因此在这些路由器上设置路由器ID的最好办法是使用环回接口。
我们可以使用 clear ip ospf process 命令来重置邻接关系。
点对点OSPF网络
网络命令语法
其中一种OSPF网络类型是点对点网络。当一个接口属于点对点网络时,我们可以使用 network 命令来设置这个接口。我们也可以使用 ip ospf 命令直接在接口上配置OSPF,这两条命令都可以确定有哪些接口参与了OSPFv2路由进程,并确定其所属的OSPF区域。
network 命令的基本语法如下所示:
Router(config-router)# network network-address wildcard-mask(通配符掩码) area area-id
The network-address wildcard-mask 语法用于在路由器上匹配的接口运行OSPF。被 network 命令的掩码匹配中的接口能够发送和接收 OSPF 数据包。
在配置OSPF区域时,管理员要在所有路由器的 area-id 上指定OSPF区域。 配置单区域 OSPFv2 时,我们必须在所有路由器的 network 命令中配置相同的 area-id 值。尽管可使用任何区域 ID,但比较好的做法是在单区域 OSPFv2 中使用区域 ID 0。如果网络以后修改为支持多区域 OSPFv2,此约定会使其变得更加容易。
使用network命令来配置 OSPF
在路由配置模式中,我们可以使用两种方法来指定哪些接口会参与OSPFv2路由进程。图中显示了我们要使用的拓扑。
基于网络地址
R1(config)# router ospf 10
R1(config-router)# network 10.10.1.0 0.0.0.255 area 0
R1(config-router)# network 10.1.1.4 0.0.0.3 area 0
R1(config-router)# network 10.1.1.12 0.0.0.3 area 0
R1(config-router)#
基于接口地址,例如:在R1上输入命令network 10.1.1.5 0.0.0.0 area 0,告知路由器在GE 0/0/0接口上启用OSPF路由进程。配置完成后,OSPFv2进程中会通告这个接口上的网络 (10.1.1.4/30)。
R1(config)# router ospf 10
R1(config-router)# network 10.10.1.1 0.0.0.0 area 0
R1(config-router)# network 10.1.1.5 0.0.0.0 area 0
R1(config-router)# network 10.1.1.14 0.0.0.0 area 0
R1(config-router)#
使用 ip ospf 命令来配置 OSPF
基于进入接口的方法,要想直接在接口上配置OSPF,可以使用接口配置命令 ip ospf。语法如下:
Router(config-if)# ip ospf process-id area area-id
在R1上,使用 no 的 network 命令来删除network命令的配置。然后进入每个接口并配置 ip ospf 命令,详见命令窗口所示。
R1(config)# router ospf 10
R1(config-router)# no network 10.10.1.1 0.0.0.0 area 0
R1(config-router)# no network 10.1.1.5 0.0.0.0 area 0
R1(config-router)# no network 10.1.1.14 0.0.0.0 area 0
R1(config-router)# interface GigabitEthernet 0/0/0
R1(config-if)# ip ospf 10 area 0
R1(config-if)# interface GigabitEthernet 0/0/1
R1(config-if)# ip ospf 10 area 0
R1(config-if)# interface Loopback 0
R1(config-if)# ip ospf 10 area 0
R1(config-if)#
配置被动接口
R1(config)# router ospf 10
R1(config-router)# passive-interface loopback 0
R1(config-router)# end
点对点网络
路由器的网络类型指定为BROADCAST。要想把它更改为点对点网络(POINT_TO_POINT),我们可以在所有希望禁用DR/BDR选举进程的接口上,使用接口配置命令 ip ospf network point-to-point。以下示例展示了R1上的配置。OSPF邻居的邻接状态会中断几毫秒。
R1(config)# interface GigabitEthernet 0/0/0
R1(config-if)# ip ospf network point-to-point
*Jun 6 00:44:05.208: %OSPF-5-ADJCHG: Process 10, Nbr 2.2.2.2 on GigabitEthernet0/0/0 from FULL to DOWN, Neighbor Down: Interface down or detached
*Jun 6 00:44:05.211: %OSPF-5-ADJCHG: Process 10, Nbr 2.2.2.2 on GigabitEthernet0/0/0 from LOADING to FULL, Loading Done
R1(config-if)# interface GigabitEthernet 0/0/1
R1(config-if)# ip ospf network point-to-point
*Jun 6 00:44:45.532: %OSPF-5-ADJCHG: Process 10, Nbr 3.3.3.3 on GigabitEthernet0/0/1 from FULL to DOWN, Neighbor Down: Interface down or detached
*Jun 6 00:44:45.535: %OSPF-5-ADJCHG: Process 10, Nbr 3.3.3.3 on GigabitEthernet0/0/1 from LOADING to FULL, Loading Done
R1(config-if)# end
环回接口和点对点网络
默认情况下,环回接口会被通告为一条掩码为 /32 的主机路由。例如,R1在向R2和R3进行通告时,会把10.10.1.0/24网络通告为10.10.1.1/32。为了模拟出真实的LAN环境,我们把环回接口0配置为点对点网络,这样R1就会向R2和R3通告完整的10.10.1.0/24网络了。
R1(config-if)# interface Loopback 0
R1(config-if)# ip ospf network point-to-point
9.7 多接入OSPF网络
ip ospf priority命令
设置接口优先级,我们可以使用命令 ip ospf priority value,其中值的取值范围为 0 到 255。优先级值为 0 的路由器不会成为 DR 或 BDR。接口上的优先级值为 1 到 255 的路由器会有机会成为 DR 或 BDR。
OSPF指定路由器
DR 会使用组播IPv4地址 224.0.0.5,这个地址代表所有 OSPF 路由器。DROTHER(既不是 DR 也不是 BDR 的路由器)。DROTHER 会使用组播地址 224.0.0.6(这个地址代表所有指定路由器)向 DR 和 BDR 发送OSPF数据包。只有DR和BDR会监听发往 224.0.0.6 的流量。
思科 OSPF 开销度量
思科定义的接口开销与接口的带宽成反比。因此带宽越高,开销就越低。计算 OSPF 开销的公式为:
Cost = reference bandwidth / interface bandwidth
默认的参考带宽为10的8次方 (100,000,000);因此计算公式如下所示:
Cost = 100,000,000 bps / interface bandwidth in bps
详细的开销计算方法见表格所示。由于 OSPF 的开销值必须是一个整数,因此FE(快速以太网)接口、GE(千兆以太网)接口和 10GE(万兆以太网)接口的开销值相同都是1。要想实现更精细的控制,您可以:
- 在每台 OSPF 路由器上使用 auto-cost reference-bandwidth 命令调整参考带宽。
- 需要时,在接口上使用 ip ospf cost 命令手动设置 OSPF 开销值。
Hello 数据包间隔
OSPFv2路由器会每10秒向组播地址224.0.0.5(代表所有OSPF路由器)发送Hello数据包。这是多接入网络和点对点网络上的默认计时器值。
Dead 间隔是路由器在宣告邻居进入 down(不可用)状态之前等待接收 Hello 数据包的时长。如果一个邻居的 Dead 间隔已超时,而路由器尚未收到这个邻居发来的 Hello 数据包,则它会从本地链路状态数据库 (LSDB) 中删除这个邻居。路由器会将该邻居连接断开的 LSDB 信息通过所有启用了 OSPF 的接口以泛洪的方式发送出去。思科设置的Dead间隔默认是Hello间隔的4倍。也就是说在多接入网络和点对点网络上,Dead间隔默认是40秒。
注意: 在非广播多接入(NBMA)网络上,Hello间隔默认是30秒,Dead间隔默认是120秒。NBMA 网络超出了这个模块的知识范围。
修改间隔
注意: 默认的Hello间隔和Dead间隔是根据最佳实践设置的,只有在极少数的情况下需要更改默认值。
使用下列接口配置模式命令可以手动修改 OSPFv2 Hello 间隔和 Dead 间隔:
Router(config-if)# ip ospf hello-interval seconds
Router(config-if)# ip ospf dead-interval seconds
我们可以使用 no ip ospf hello-interval 和 no ip ospf dead-interval 命令把间隔时间重置为它们的默认值。Hello间隔必须总配置为相同的值
在 OSPFv2 中传播默认静态路由
Ospf命令总结
- R1(config)# router ospf process-id 1-65535(启用 OSPFv2)
- R1(config)#router-id rid32位(明确配置路由器ID)
- R1(config)#interface Loopback 1(配置环回接口地址作为路由器ID)
R1(config-if)# ip address 1.1.1.1 255.255.255.255
- R1# clear ip ospf process(重置邻接关系)
- R1(config-router)#** network network-address wildcard-mask(通配符掩码) area area-id(network 命令的基本语法)**
- R1(config-if)#** ip ospf process-id area area-id(接口配置命令 ip ospf)**
- R1(config-router)# passive-interface 某个接口(配置被动接口,阻止路由器通过某个接口传输路由消息)
- R1(config)# interface GigabitEthernet 0/0/0
R1(config-if)# ip ospf network point-to-point(把路由器的网络类型指定更改为点对点网络)
- R1(config)# interface 某接口(配置接口优先级)
R1(config-if)# **ip ospf priority **value0-255 (value越高优先级越高)
R1(config-if)# end
- Router(config-router)# auto-cost reference-bandwidth(默认100) Mbps(调整参考带宽)
- R1(config)# interface 某接口
R1(config-if)# ip ospf cost value
- Router(config-if)# ip ospf hello-interval seconds(手动修改 OSPFv2 Hello 间隔)
- Router(config-if)# ip ospf dead-interval seconds(手动修改 OSPFv2 Dead 间隔)
- R2(config)# router ospf 10
R2(config-router)# default-information originate(表示 R2 是默认路由信息来源,并且在 OSPF 更新中传播默认静态路由)