【网络协议】开放式最短路径优先协议OSPF详解(一)
未经许可,不得转载。
OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。
文章目录
- 链路状态路由协议
- OSPF 的工作原理
- OSPF 数据包类型
- Dijkstra算法、管理距离与度量值
- OSPF的管理距离
- OSPF的度量值
- 链路状态路由协议的优势
- 拓扑结构
- 路由器OSPF命令
- **关于Process-ID**
- 网络命令
- Wildcard Mask(通配符掩码)
- 回到配置
- OSPF路由器ID(Router-ID)
- 配置路由器ID
- 配置回环接口
- 验证OSPF操作
- show ip ospf neighbor
- show ip route
- show ip ospf interface
- show ip protocols
- show ip ospf
- show ip ospf database
- 验证连接性
- 第1部分结束
链路状态路由协议
内部路由协议分为两类:距离向量路由协议和链路状态路由协议。OSPF 属于链路状态路由协议类别。
链路状态协议通过计算从源网络到目标网络路径的“代价”来工作,并使用 Edsger Dijkstra 开发的 SPF(Shortest Path First)算法。以下是链路状态路由协议(如 OSPF)的工作步骤:
1、所有配置了链路状态路由协议的路由器会学习其直接连接的网络。
2、共享链路的路由器会识别出相邻路由器,并建立关系。
3、建立关系后,路由器会与彼此共享其直接连接的路由。这是通过发送包含路由信息的数据包实现的。
4、接收到这些信息的邻居会将其传播给其他邻居。
5、当所有邻居都掌握了所有路由信息后,每个路由器会利用这些信息创建一张通往所有网络目标的“地图”。
6、在这张地图生成后,会运行 SPF(Shortest Path First)算法,以确定到特定远程网络的最佳路径。
这是链路状态路由协议(如 OSPF 和 IS-IS)的基本工作原理。我们将在 OSPF 学习中更详细地探讨这些步骤。
OSPF 的工作原理
在 OSPF 中,上述过程被遵循,但使用了不同的术语,以下是 OSPF 的关键概念。
OSPF 数据包类型
OSPF 有 5 种不同类型的数据包需要理解:
1.Hello 数据包
这些是配置了 OSPF 的路由器发送的第一类消息,使用专门为 OSPF 保留的多播 IP 地址 224.0.0.5
。Hello 数据包用于发现邻居并维护与邻居的关系(邻接关系)。
注意:Hello 数据包在多播和点对点网络中每 10 秒发送一次,而在非广播多路访问(NBMA)网络中每 30 秒发送一次。我们稍后会进一步探讨。
在 OSPF 中,Hello 数据包主要有以下三个任务:
- 发现和建立邻居邻接关系。
- 广播建立邻居关系所需的 OSPF 参数。
- 在多访问网络中选举 DR(指定路由器)和 BDR(备份指定路由器)。
2.DBD(数据库描述)数据包
这是一份包含特定路由器在路由域中学习到的路由摘要的列表。接收此数据包的路由器会将其与自身的链路状态数据库进行比较,以发现缺失的路由。
3.LSR(链路状态请求)数据包
当路由器发现自己缺少某些路由信息时,会根据收到的 DBD 数据包发送此数据包,向通知其缺失信息的路由器请求更详细的信息,以更新自身的链路状态数据库。
4.LSU(链路状态更新)数据包
包含特定路由的详细信息,包括下一跳信息和到达该路由的代价。收到 LSR 的路由器会通过此数据包回复详细信息。
5.LSAck(链路状态确认)数据包
用于确认路由器已收到 LSU 数据包。
目前我们不需要完全理解这些概念,我们将在本章后续内容中更深入地探讨它们。
Dijkstra算法、管理距离与度量值
如前所述,OSPF使用SPF(Shortest Path First)算法。路由器的OSPF链路状态数据库中包含的信息就像一张“地图”,用于计算到远程网络的最佳路径。然而,OSPF不会为路由保留备用路径。如果某条通往网络的路径失效,SPF算法会重新运行以确定备用或替代路径。
OSPF的管理距离
OSPF的管理距离为110。这意味着它比RIP等其他路由协议更优先,但其可信度不如EIGRP、静态路由或直接连接的路由。
OSPF的度量值
OSPF使用的度量值是成本(Cost)。成本可以根据链路上的带宽或管理员通过 ip ospf cost
命令配置的成本值来确定。更多细节将在后续讨论。
链路状态路由协议的优势
使用链路状态路由协议有以下几个主要优势:
1.拓扑图
如前所述,链路状态数据库中存储了一张包含整个域中所有路由的拓扑图。这是一个显著优势,因为找到冗余路径非常简单。路由器只需查阅“地图”中的备用路径,并使用SPF算法计算到达的成本。
2.快速收敛
与距离矢量路由协议不同,后者需要在将路由信息传递给其他路由器之前先计算路由信息,而链路状态路由协议会将接收到的路由信息泛洪到除接收接口以外的所有其他接口。域中的每台路由器都可以自行决定这些信息是否相关。
3.事件驱动的更新
与EIGRP类似,OSPF中的路由器不会定期向其他路由器发送更新,而是当网络发生变化时才发送更新。而且,发送的信息仅与该变化相关。
4.分层设计
使用区域(Area)是链路状态路由协议的一个巨大优势。区域的使用使得可以创建分层的IP地址格式。然而,这也意味着只能在区域边界上进行路由汇总。
现在我们已经了解了一些OSPF的基础概念,可以开始进行配置了。
拓扑结构
以下展示了本节OSPF配置的实验拓扑结构。
该网络由4台路由器组成,分别标记为R1至R4。此外,还有3个局域网(LAN)段分别连接到R1、R3和R4。使用的IP子网显示在拓扑图中,具体的IP地址方案如下所示。DCE接口的时钟速率设置为64,000。
在开始OSPFv2配置之前,设计上方的网络并完成以下配置:
- 为所有设备配置适当的主机名
- 为控制台线路和Telnet线路配置适当的密码
- 设置横幅信息
- 禁用IP域名查找功能
- 为接口分配IP地址、子网掩码、默认网关,并在需要的接口上设置时钟速率
- 启用设备并确保直接连接的网络之间的连通性
- 完成基本的OSPF配置
读者应自行完成基础配置,我们不会过多地停留在此部分,而是直接进入OSPF的基础配置。
路由器OSPF命令
要在路由器上启用OSPF,需要在全局配置模式下使用以下命令:
router ospf <process-ID>
关于Process-ID
1、Process-ID是一个逻辑上的标识号,范围为1到65535。
2、这个号码仅在本地路由器上有意义,用于标识路由器上运行的OSPF进程。
3、OSPF的邻居路由器无需此号码匹配即可形成邻接关系。
为了保持一致性,建议在拓扑中所有路由器上使用相同的Process-ID。在本拓扑中,我们将所有路由器的Process-ID设为10
。
例如,在R1上执行以下命令:
R1(config)#router ospf 10
该命令使我们进入OSPF特定配置模式,在此模式中可以配置OSPF的大多数选项。
网络命令
OSPF使用network
命令来公布路由,但格式略有不同:
router(config-router)#network <network_address> <wildcard_mask> area <area_ID>
Wildcard Mask为通配符掩码、Area ID为区域ID。
- OSPF使用区域将网络划分。区域内的所有路由器共享相同的拓扑映射。
- 在本章中,我们只涉及骨干区域
area 0
,这意味着所有路由器都将处于area 0
。 - 随着网络规模的增长,为了减少拓扑映射的规模,可以引入多区域的使用,这将在后续章节中讨论。
注意:必须在所有网络声明和路由器上将区域配置为area 0
。
Wildcard Mask(通配符掩码)
通配符掩码(或反码)是一种特殊的IP地址,用于OSPF判断要公布的特定子网。
计算方法:
- 写下全1子网掩码:
255.255.255.255
(广播地址) - 写下子网的掩码,例如
255.255.255.224
- 相减得到通配符掩码:
255.255.255.255 - 255.255.255.224 = 0.0.0.31
对于网络192.168.1.0/27
,我们将进行如下配置:
- 子网掩码:255.255.255.224
- 通配符掩码:0.0.0.31
在OSPF配置模式下执行:
router ospf 10
network 192.168.1.0 0.0.0.31 area 0
对于所有路由器,类似地替换对应的网络地址和通配符掩码完成配置。
因此,网络 192.168.1.0/27 的反掩码(或通配符掩码)为 0.0.0.31。
当路由器决定要公布的网络时,通配符掩码中的“0”表示需要匹配的部分,而任何高于0的值将被忽略。因此,在上述例子中,当在OSPF中公布网络 192.168.1.0/27 时,前三个八位组将被匹配,而第四个八位组只会部分匹配。
这意味着,当公布路由 192.168.1.0/27 时,路由器仅公布前三个八位组匹配的路由,而忽略第四个八位组。
注意:在OSPF中可以使用的最具体的通配符掩码是 0.0.0.0,这表示路由器只会公布特定的IP地址,而不是一个网络地址。
在OSPF中,我们需要公布希望参与OSPF的直接连接网络。
例如,要在OSPF中公布网络 192.168.1.0/28,我们需要在R1上输入以下命令:
R1(config-router)#network 192.168.1.0 0.0.0.15 area 0
回到配置
在本拓扑中,我们将在每个路由器上使用下表中的命令,公布所有直接连接的网络。
注意:在进行这些配置时,请确保计算所有的通配符掩码,以便清楚地理解这一概念。
在所有路由器上完成这些配置后,应该能够看到如下输出:
这表明OSPF正在正常工作,所有路由都已学习到。请注意,这一过程发生得非常快,这正是OSPF收敛的速度之快。
OSPF路由器ID(Router-ID)
在OSPF中,路由器ID是用于命名路由域中每个路由器的一种方式。它本质上是一个特殊选择的IP地址,用于标识OSPF中的路由器。在CISCO路由器中,路由器ID的选择基于以下标准:
1.使用OSPF配置模式下的命令 router-ID <IP_ADDRESS>
配置的IP地址。
2.如果未配置,则使用任何配置的回环接口(loopback interface)中最高的IP地址。
3.如果没有回环接口,则路由器使用任何活动物理接口中最高的IP地址。
注意:最高的活动物理接口是指能够转发数据包的接口。
关于路由器ID的用途及重要性将在后续讨论中进行介绍。
配置路由器ID
路由器ID在OSPF配置模式中配置,其提示符如下所示:
Router(config-router)#
用于配置路由器ID的命令如下:
router(config-router)#router-id <unique_ip_address>
例如,在R1上,我们将使用IP地址1.1.1.1
作为路由器ID,配置命令如下所示:
R1(config-router)#router-id 1.1.1.1
执行上述命令后,路由器将设置一个手动配置的路由器ID为1.1.1.1
。
对于四个路由器,我们将使用如下表格中的IP地址作为路由器ID:
配置回环接口
正如我们之前提到的,回环接口可以用作路由器ID。
回环接口是一个虚拟接口——这意味着它仅存在于路由器中,并未连接到网络中的任何其他物理设备。一旦配置,回环接口会自动转为UP状态。配置回环接口所需的命令是:
Router(config)#interface <loopback> <Loopback_interface_number>
执行此命令后,我们将进入接口配置模式,在这里我们可以配置其他选项,例如IP地址。
要在R1上配置一个IP地址为172.16.1.1/24的回环接口,可以输入以下命令:
注意:执行这些命令后,新的接口将在“show ip interface brief”命令的输出中显示。回环接口始终处于UP状态,并像物理接口一样工作。
在配置OSPF并保存后,使用中的路由器ID仍然是我们使用的最高活动物理接口,而使用router-id
命令配置的路由器ID仍然不会生效,如下所示的输出所示。
我们需要通过重新启动OSPF进程来使路由器ID生效,为此,我们必须在特权exec模式下输入命令“clear ip ospf process”,如下所示。
执行此命令后,系统会提示我们确认此命令,我们应该回答“YES”。
执行此命令后,所有路由器的新路由器ID将生效。
验证OSPF操作
配置完OSPF后,我们需要验证所有路由器上的配置是否正常工作。要验证OSPF,我们将使用以下命令:
- Show ip ospf neighbor
- Show ip ospf database
- Show ip route
- Show ip ospf interface
- Show ip protocols
- Show ip ospf
- Debug ip ospf adj
- Debug ip ospf hello
- Show ip ospf neighbor
show ip ospf neighbor
“show ip ospf neighbor”是验证和排除OSPF邻居关系故障时最常用的命令之一。使用该命令显示的一些信息如下所示:
- 邻居的路由器ID
- Pri – OSPF优先级
- State – LSA类型
- Dead time – 这表示OSPF等待的时间,直到它认为邻居因为缺失hello包而被认为是死亡。
- Address – 邻居的IP地址(共享链路的地址)
- Interface – 路由器与邻居连接的物理接口
在OSPF中,要形成邻接关系,邻居路由器必须满足以下条件:
- 链路上的子网掩码必须相同,即链路必须处于同一子网
- OSPF hello和dead定时器必须匹配
- OSPF网络类型必须匹配
- 网络声明必须正确
在我们的场景中,执行“show ip ospf neighbor”命令后的输出将在所有路由器上显示如下:
show ip route
在配置了OSPF的路由器上,show ip route
命令将显示路由器已学习到的所有路由、下一跳、行政距离、度量值以及路由的年龄。在R1上执行此命令的输出将如下所示。
注意:通过OSPF学习到的路由在前面会标记为“O”。
show ip ospf interface
此命令用于验证参与OSPF的接口,以及hello和dead定时器的间隔。通过指定接口的名称和编号,还可以显示特定接口的统计信息。在R2上执行此命令的输出如下所示。
OSPF的hello和dead定时器在上面输出中的红色框中突出显示。此外,网络类型显示为点对点,成本为64。
show ip protocols
“show ip protocols”命令可用于验证正在使用的路由协议。在本实例中,它将显示OSPF的进程ID、路由器ID、广告的网络、邻居、区域和区域类型,以及OSPF的管理距离。
此命令在R3上的输出如下所示。
show ip ospf
“show ip ospf”命令也是验证进程ID、路由器ID、区域、SPF统计信息以及其他在故障排除OSPF时有用信息的好方法。
此命令在R1上的输出如下所示,部分输出被省略。
show ip ospf database
此命令将显示在OSPF中所有具有相同OSPF数据库或“映射”的路由器。
此命令在R1上的输出如下所示。
其他可以用来验证和排除OSPF故障的命令是调试命令。这些命令将显示OSPF发生时的统计信息,因此可能会消耗大量的处理能力。
如Debug ip ospf adj、Debug ip ospf hello。
验证连接性
在我们配置了所有四台路由器的OSPF并验证所有路由器已收敛并获取到所有路由后,需要通过ping命令验证连接性:
- 从PC_A到PC_B的ping
- 从PC_B到PC_C的ping
- 从PC_A到PC_C的ping
如果所有的ping都成功,说明我们已成功配置OSPF;如果没有成功,请按照上述步骤排查并解决问题。
第1部分结束
至此,我们完成了OSPF的第一部分。我们学习了链路状态路由协议的概念,特别是OSPF,了解了OSPF的工作原理及其优点。我们还配置并验证了OSPF的基本操作。在下一部分,我们将学习更多OSPF的概念并进行更多配置。