【网络协议】开放式最短路径优先协议OSPF详解(四)
前言
在本章的第一部分和第二部分中,我们探讨了OSPF的基本配置,并进一步学习了更多OSPF的概念,例如静态路由的重分发及其度量值。在第三部分中,我们讨论了多区域OSPF。在第四部分中,我们将关注OSPF与多访问网络,最后会通过一个更复杂的OSPF实验来结束。
【网络协议】开放式最短路径优先协议OSPF详解(一)
【网络协议】开放式最短路径优先协议OSPF详解(二)
【网络协议】开放式最短路径优先协议OSPF详解(三)
多访问网络
多访问网络是由两个以上的设备共享相同介质的网络。在下图所示的例子中,三台路由器和三台PC通过拓扑中心的两台交换机互连。这意味着路由器上连接到交换机的接口以及PC的接口都在同一个子网中。
另一方面,在点对点网络(Point-to-point networks)中,一个子网中只有两个设备。下图所示的两台路由器通过广域网链接(WAN link)互连,这就是点对点网络的一个例子。
在OSPF中,我们可以划分出以下五种网络类型:
- 点对点网络(Point-to-point)
- 点到多点网络(Point-to-multipoint)
- 广播多访问网络(Broadcast Multiaccess)
- 虚拟链路(Virtual links)
- 非广播多访问网络(Nonbroadcast Multiaccess, NBMA)
OSPF广播多访问网络中的问题
在广播多访问网络中,OSPF环境面临以下两个主要问题:
- 多重邻接关系(Multiple Adjacencies)
- LSA泛洪(Flooding of LSAs)
多重邻接关系
如前所述,在OSPF中,相邻的路由器通常会彼此建立邻接关系。在广播多访问网络中,这会成为一个主要问题。
举个例子:
在点对点网络中,邻居通常是直接相连的路由器。但在广播多访问网络中,例如下图所示,四台路由器通过同一子网直接相连。
这意味着,在此场景中,路由器将彼此泛洪LSA并相互建立邻接关系。
可以使用以下公式计算邻接关系数量:
n*(n-1)/2,其中n表示路由器的数量。
示例:
在下图中,有 4 台路由器。根据公式:
n*(n-1)/2 = 4*(4-1)/2 = 6 ,结果为6,蓝色箭头表示这些邻接关系。
在这个场景中,邻接关系的数量相对较少。但如果网络规模扩大,比如有100台路由器,可以想象会出现什么情况。这种情况会成为一个严重的问题,并对路由器的资源造成巨大负担。
LSA的泛洪(Flooding of LSAs)
如我们之前所学,OSPF使用触发更新(Triggered Updates),并将这些更新泛洪到所有相关路由器。
以上述场景为例,如果R1丢失了与其LAN接口的路由信息,该信息将被广播到R2、R3和R4。这些路由器又会将该信息泛洪到网络中的每一台路由器,除了信息的来源路由器(R1),以避免引发路由循环(Routing Loop)。
下图展示了这一过程。
绿色箭头表示R1上失效的网络。可以看到,这一信息被多次传播到R2、R3和R4。这种重复传播可能导致路由循环(Routing Loop)。
解决OSPF广播多访问问题的方案
在OSPF中,通过选举指定路由器(Designated Router, DR)和备份指定路由器(Backup Designated Router, BDR)来解决这些问题。
在第一次实例中,我们看到当R1上的一个网络故障时,所有路由器都会接收到关于丢失路由的更新。然而,通过选举指定路由器(DR),如上所示,R1只会通知DR路由器——R2,告知R2关于丢失的路由。然后,DR会更新多访问网络中的其他路由器。
注意: 在我们上面的场景中,我们没有包括备份指定路由器(BDR),然而BDR也会收到丢失路由的通知,但它不会更新其他路由器,除非DR出现故障,在这种情况下,BDR会被提升为DR角色。
在OSPF中,DR和BDR的选举是一个非常重要的因素,它解决了我们看到的问题。当DR和BDR被选举出来后,网络中的所有其他路由器将成为DROther,这意味着它们既不是DR也不是BDR。DROther路由器永远不会更新网络中的其他路由器。
DR和BDR的选举
DR和BDR是如何选举出来的?以下是适用的标准:
- 首先,选举具有最高OSPF优先级的路由器为DR。
- 其次,选举具有第二高OSPF优先级的路由器为BDR。
- 如果优先级相同,则根据最高路由器ID选举DR。
在上一节中,我们讨论了路由器ID的选取标准:
- 使用
router-id
命令配置的路由器ID - 最高的回环接口
- OSPF域中最高的活动接口
根据上述信息,我们可以确定以下拓扑中的DR和BDR。
根据上述拓扑,R2和R3是DR的候选路由器,因为它们在网络中具有最高的路由器优先级。然而,由于R2的路由器ID更高,因此它将成为DR,R3将成为BDR,仅在R2失败时才会使用R3。
提升BDR为DR
DR通常不会改变,除非发生以下情况之一:
- DR故障。
- 连接到多访问网络的DR接口故障。
- DR上的OSPF进程故障。
如果发生其中之一,BDR路由器会自动被提升为DR角色。然后,路由器会进行选举来确定新的BDR。如果之前失败的DR重新上线,它不会恢复为DR角色,而是会变为DROther角色。
路由器优先级
在大多数情况下,我们希望通过优先级选择DR路由器。在这种情况下,仅依赖路由器ID可能不足够。OSPF中的路由器优先级用于确定哪个路由器成为以太网段中的DR和BDR,如前所述。
更改路由器的OSPF优先级是确保选择正确路由器作为DR的关键。
要配置路由器的优先级,我们在参与OSPF的路由器接口上使用命令“ip ospf priority <0-255>
”。
注意: 优先级为0意味着该路由器永远不会成为DR。
现在我们已经了解了OSPF和多访问网络中的概念,接下来我们将进行一个实验,看看这些概念是如何工作的。
OSPF拓扑
下图显示了我们将要配置的拓扑。正如我们所看到的,我们有6个路由器,它们都连接到1个交换机,并且都位于192.168.1.0/24网络中的一个以太网段。
该拓扑中的每个路由器使用的IP地址与其路由器编号相对应。
在这个场景中,我们需要在所有路由器上配置OSPF,并且我们应该确定哪些路由器将被选举为DR和BDR。
R1、R3、R4和R6都具有回环接口,IP地址如图所示。
注意: 配置连接到交换机的快速以太网接口后,保持它们处于关闭状态(shutdown)。
以下表格显示了正在使用的路由器ID和OSPF优先级。
在我们的场景中,路由器的基本配置已经完成;我们的任务是配置OSPF并确定谁将被选举为DR和BDR。
配置OSPF
在这个场景中,我们需要做的第一件事是配置所有路由器上的OSPF。这意味着要使用network
命令。
在我们的例子中,我们使用的OSPF进程ID为1,并且使用区域0。
以下表格显示了6台路由器上OSPF配置的命令。
如上所示,所有网络命令已配置,但由于连接路由器和交换机的接口处于关闭模式,因此不会广告任何路由。
配置OSPF优先级
下一步是配置OSPF优先级,这需要在连接到多访问设备的特定接口上进行配置,使用以下命令:
在我们的场景中,所有路由器都有连接到交换机的相同接口,即FastEthernet 0/0。
因此,在这些接口上,我们将配置OSPF优先级,如上所示:
下面显示的是R1和R4的配置。
在所有路由器上配置完OSPF优先级后,使用“no shutdown
”命令启用连接到交换机的接口,这将使OSPF能够学习到网络中的路由。
下面显示的是在R1上执行“show ip route
”命令的输出。
如上图,R1已经从邻居路由器学习到所有的路由。
为了确认哪个路由器充当DR角色,我们在每个路由器上使用“show ip ospf neighbor
”命令。下面显示的是在R4上执行该命令的输出。
从输出中可以看到,R4已经与网络中的所有路由器建立了完整的邻居关系。此外,由于邻居1.1.1.1被标记为BDR,所有其他路由器被标记为DROTHER,因此路由器R4是该网络的DR。
在R3上执行“show ip ospf neighbor
”命令的输出应该显示谁是DR路由器。
注意:邻居4.4.4.4的状态为“FULL/DR”,邻居1.1.1.1的状态为“FULL/BDR”,其他路由器的状态为“2WAY/DROTHER”。
在像我们这样的多访问网络中,路由器只有在与DR和BDR建立完全邻居关系(FULL邻居关系)时,才能进行完整的通信。DROTHER路由器只会与其他路由器建立2WAY关系。
DR重新选举
现在,我们将尝试看看如果DR和BDR路由器下线并且无法正常工作,会发生什么情况。
1、DR宕机
如前所述,如果DR宕机,BDR会自动成为新的DR。我们可以通过关闭R4的FastEthernet0/0接口来测试这一点,因为R4是当前的DR。
正如我们从R6上运行的“show ip ospf neighbor”命令的输出中看到的(上图),邻居1.1.1.1成为新的DR,而它之前是网络中的BDR。
BDR的选举在邻居3.3.3.3和邻居5.5.5.5之间进行,这两个路由器的OSPF优先级相同。邻居5.5.5.5被选为新的BDR,因为它的路由器ID更高。
2、如果DR重新上线,会发生什么?
当我们通过在FastEthernet0/0接口上输入“no shutdown”命令启用R4的接口时,它会恢复作为DR的责任吗?R6上运行的“show ip ospf neighbor”命令的输出如下。
正如我们从上述输出中看到的,R1仍然会保持作为DR,而R4即使具有更高的优先级,仍将保持作为BDR。这是一个保护功能,以防路由器再次失败。
注意:当DR失败时,它只能在新的DR和新的BDR失败的情况下恢复其作为DR的角色,即使它具有最高优先级。
注意:在多访问网络中,优先级为0的路由器将永远不会成为DR或BDR。
相关文章:

【网络协议】开放式最短路径优先协议OSPF详解(四)
前言 在本章的第一部分和第二部分中,我们探讨了OSPF的基本配置,并进一步学习了更多OSPF的概念,例如静态路由的重分发及其度量值。在第三部分中,我们讨论了多区域OSPF。在第四部分中,我们将关注OSPF与多访问网络&#…...
C++STL中algorithm的介绍与使用
C STL中的<algorithm>库提供了一组模板函数,用于操作序列(如数组、向量等)。以下是一些常用的<algorithm>函数的详细介绍、使用方式和示例,以及在竞赛过程中的一些细节。 1. 非修改性算法 std::find 概念ÿ…...

Oracle exp和imp命令导出导入dmp文件
目录 一. 安装 instantclient-tools 工具包二. exp 命令导出数据三. imp 命令导入数据四. expdp 和 impdp 命令 一. 安装 instantclient-tools 工具包 ⏹官方网站 https://www.oracle.com/cn/database/technologies/instant-client/linux-x86-64-downloads.html ⏹因为我们在…...

GitLab集成Runner详细版--及注意事项汇总【最佳实践】
一、背景 看到网上很多用户提出的runner问题其实实际都不是问题,不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner,因为这类文章写得好的特别多,本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…...

ARM发布Armv9.5架构:迈向更强性能与灵活性的新时代
2024年11月30日,ARM正式发布了其最新的Armv9.5架构,这是Arm技术发展的又一重要里程碑。从表中信息来看,Armv9.5架构的发布标志着该公司的架构系列在性能、灵活性和可扩展性方面取得了进一步突破。本次发布不仅是技术上的提升,更是…...

网络安全:路由技术
概述 路由技术到底研究什么内容 研究路由器寻找最佳路径的过程 路由器根据最佳路径转发数据包 知识点,重要OSRF,BGP1.静态路由原理 路由技术分类 静态路由和动态路由技术 静态路由:是第一代路由技术,由网络管理员手工静态写路由/路径告知路…...
Vue3 子组件向父组件传递消息(Events)
子组件向父组件传递消息(Events) 子组件可以通过 $emit 触发事件,父组件可以监听这些事件并作出响应。 子组件: <template><button click"sendMessage">Send Message to Parent</button> </tem…...
如何清理Docker的overlay2目录下的文件
清理 Docker 的 overlay2 目录下的文件需要谨慎操作,因为这些文件通常是容器的存储层,直接删除可能会导致容器无法正常运行或数据丢失。以下是清理 overlay2 目录的步骤和建议: 1. 确认文件是否可以被清理 在清理之前,确认 c7ffc13c49a43f08ef9e234c6ef9fc5a3692deda3c5d4…...

《Vue3实战教程》19:Vue3组件 v-model
如果您有疑问,请观看视频教程《Vue3实战教程》 组件 v-model 基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始,推荐的实现方式是使用 defineModel() 宏: vue <!-- Child.vue --> <script setup> co…...

数字PWM直流调速系统设计(论文+源码)
2.1 系统方案设计 2.2.1开环控制方案 采用开环方案的系统架构如图2.1所示,这种方式不需要对直流电机的转速进行检测,在速度控制时单片机只需要直接发出PWM就可以实现直流电机速度的控制。这种方式整体设计难度较低,但是无法准确得知当前的…...
Spring Boot日志处理
文章目录 Spring Boot日志处理1. 日志存入数据库(AOP)2. 日志控制台打印与写入文件(logback) Spring Boot日志处理 1. 日志存入数据库(AOP) 引入aop依赖 <dependency><groupId>org.springfram…...

vue3+Echarts+ts实现甘特图
项目场景: vue3Echartsts实现甘特图;发布任务 代码实现 封装ganttEcharts.vue <template><!-- Echarts 甘特图 --><div ref"progressChart" class"w100 h100"></div> </template> <script lang"ts&qu…...
OpenCV相机标定与3D重建(41)从 3D 物点和它们对应的 2D 图像点估算初始相机内参矩阵函数initCameraMatrix2D()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从3D-2D点对应关系中找到一个初始的相机内参矩阵。 cv::initCameraMatrix2D 是 OpenCV 库中的一个函数,用于从 3D 物点和它们对应的…...

ELK日志平台搭建 (最新版)
一、安装 JDK 1. 下载 JDK 21 RPM 包 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm2. 安装 JDK 21,使用 rpm 命令安装下载的 RPM 包: sudo rpm -ivh jdk-21_linux-x64_bin.rpm3. 配置环境变量 编辑 /etc/profile 文件以配置 JAVA_HO…...

智能化人才招聘系统是怎样的?
随着企业规模的扩大和业务范围的拓展,人才招聘成为了企业发展的关键环节。然而,市面上的人才招聘系统琳琅满目,质量参差不齐,许多企业发现,并非所有系统都能满足他们的需求,特别是智能化的需求。今天&#…...

电脑主机后置音频插孔无声?还得Realtek高清晰音频管理器调教
0 缘起 一台联想电脑,使用Windows 10 专业版32位,电脑主机后置音频插孔一直没有声音,所以音箱是接在机箱前面版的前置音频插孔上的。 一天不小心捱到了音箱的音频线,音频线头断在音频插孔里面了,前置音频插孔因此用不…...
记一次音频无输出的解决方案
啊啊啊,刷个抖音就发现个死电脑死都不出声,捣鼓了一天才解决 打开wav文件时,提示错误找不到音频播放设备 0xc00d36fa 起初以为是声卡坏了,就到官网下载、更新了声卡驱动。无用什么驱动精灵也检测了,但也测不出啥来。…...

初学stm32 --- FSMC驱动LCD屏
目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序: FSMC地址映射 HADDR与FSMC_A关系 LCD的…...

Scala_【4】流程控制
第四章 分支控制if-else单分支双分支多分支返回值嵌套分支 For循环控制包含边界不包含边界循环守卫循环步长嵌套循环循环返回值 While循环Break友情链接 分支控制if-else 单分支 双分支 多分支 返回值 嵌套分支 For循环控制 Scala也为for循环这一常见的控制结构提供了非常多的…...
mysql带自动递增列的表删除数据后如何重置递增值
mysql带自动递增列的表删除数据后如何重置递增值 在 MySQL 中,如果你删除了表中的数据,自动递增列的值 不会自动重置。如果你希望在删除数据后重新设置自动递增列的值,可以使用以下几种方法: 1. 使用 ALTER TABLE 重置自动递增值…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...