OSPF 开放式最短路径优先协议

2024-08-23 14:36

本文主要是介绍OSPF 开放式最短路径优先协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是OSPF?

开放式最短路径优先OSPF,在大型网络结构当中路由器对IP的路由需要使用到RIP或者OSPF协议实现对链路的收敛,使得路由器能够准确的将IP数据包路由到准确的下一跳地址,接下来介绍一下OSPF实现链路收敛的原理方式。

OSPF相较于rip的优势

  • RIP使用跳点数量作为路径的评判标准,未考虑到链路带宽等其他因素。  OSPF使用cost(标准(指定)带宽/实际带宽)作为链路的评判标准,更加具有合理性。
  • RIP最大记录长度为15跳,在大型网络拓扑当中具有局限性。OSPF使用LSDB数据库的记录形式,没有跳点长度限制。
  • RIP更新次数频繁,每三十秒就对链路发送更新消息,占用网络资源。 OSPF只在路由发生变化或者三十分钟进行一次更新。
  • 收敛速度慢。 OSPF收敛速度快。

OSPF关系的组成

在OSPF当中有以下几种概念:DR BDR 邻接 邻居 Router ID 接下来我将具体讲解不同概念在OSPF当中的作用。

DR

同一个网段当中只能有一个组长、副组长

DR一个OSPF域当中的组长,用于负责对域内路由器LSA信息更新的发生以及给新接入的路由器进行数据同步等操作。

BDR

BDR指ospf域当中的副组长,始终与组长保持数据同步当组长出现故障后会顶替组长进行域内路由条目管理。

邻居

邻居关系是指两个相互连接的路由互为邻居关系。 路由器通过发送HELLO数据包来获取邻居信息。

邻接

邻接关系指DR、BDR与域内成员建立的邻居关系成为邻接关系,只有邻接关系才能实现LSA传输

Router ID

当一个路由器加入到OSPF域内后都会拥有一个RouterID用于在域内做唯一身份标识。这是一个4x8二进制数与IP相同,如果不由人员指定就会自动获取一个接口的IP作为该RouterID。

通常情况下会使用最大的本机回环地址作为RouterID,其次考虑使用最大的接口IP地址作为RouterID。

LSDB、LSA

LSDB指链路状态数据库,其中存放的是LSA,LSA指链路状态公告,路由器可以通过LSA获取整个域内的所有链路cost信息。从而实现选取最优路径。

cost

cost指路径开销,通常值为指定带宽/实际带宽,路径开销的值1越小,该路径的优先级越大,用户可以自己选择配置cost值,实现指定路径。

数据同步与常规LSA泛洪

两个组播地址

组播地址用于组员与组长有路由变更时发送组播让组员和组长实现LSDB更新

224.0.0.5   组员监听

224.0.0.6   组长监听

数据同步

当路由器接入一个OSPF域当中之后,会首先通过HELLO数据包发现域内的DR。

  • 在邻居关系建立后,路由器会与DR进行LSA数据库同步。这一过程称为数据库描述(DBD)交换
  • 路由器通过DBD报文交换其持有的LSA摘要信息。此时,如果路由器发现自己缺少某些LSA,它会通过发送**链路状态请求(LSR, Link State Request)**报文来请求特定的LSA。
  • DR会根据请求,将缺少的LSA发送给请求的路由器,使用**链路状态更新(LSU, Link State Update)**报文来进行传输。

LSA泛洪

LSA泛洪用于实现当域内某一台路由出现路由更新的情况,会首先在此路由本地生成LSA条目再发送给DR,DR接收到该条目后不会立即进行LSA泛洪会等待一段时间确认是否会再次接收到其他LSA条目,再进行泛洪以节省开销。

DR、BDR的确认

为什么要选取DR与BDR?

广播网络NBMA网络中,任意两台路由器之间都要传递路由信息。网络中有n台路由器,则需要建立n*(n-1)/2个邻接关系。这使得任何一台路由器的路由变化都会导致多次传递,浪费了带宽资源。

为解决这一问题,OSPF定义了DR。通过选举产生DR后,所有其他设备都只将信息发送给DR,由DR将网络链路状态LSA广播出去

为了防止DR发生故障,重新选举DR时会造成业务中断,除了DR之外,还会选举一个备份指定路由器BDR。这样除DR和BDR之外的路由器(称为DR Other)之间将不再建立邻接关系,也不再交换任何路由信息,这样就减少了广播网和NBMA网络上各路由器之间邻接关系的数量。

DR和BDR的选举是基于以下两个主要因素进行的:

  • 路由器优先级:OSPF路由器接口上配置的优先级(Priority)值。优先级的范围是0到255,数值越大,优先级越高。默认值通常为1。
  • 路由器ID(Router ID):在优先级相同的情况下,使用路由器ID作为次要决策因素。路由器ID是OSPF路由器的唯一标识,通常是路由器上配置的最高IP地址,或手动指定的一个32位值。

五个重要的报文

HELLO报文

HELLO报文用于发现和维持邻居关系

BDB

DBD指发送的LSDB信息摘要,成员路由接收后通过查看摘要确定自己需要的路由LSA。

LSR

成员路由确定所需要的LSA后发送LSR请求需要的LSA信息

LSV

一个LSV包含了多个LSA

LSAck

LSAck表示确认收到了信息。

这篇关于OSPF 开放式最短路径优先协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1099658

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i