当前位置: 首页 > news >正文

OSPF开放式最短路径优先

1OSPF简介

(1)OSPF英文全称Open Shortest Path First (开放式最短路径优先)

(2)OSPF是IETF 开发的一种链路状态路由协议,使用基于带宽的度量值。

(3)OSPF采用SPF算法计算路由,从算法上保证了无路由环路

(4)OSPF通过邻居关系维护路由,避免了定期更新对带宽的消耗。

(5)OSPF路由更新效率高,网络收敛快,适用于大中型网络。

(6)OSPF报文封装于IP协议号 89组播地址224.0.0.5与224.0.0.6

组播地址224.0.0.5:该组播地址用于所有 OSPF 路由器。所有运行 OSPF 协议的路由器都会加入到这个组播组中。

组播地址224.0.0.6:这个组播地址专门用于指定路由器(DR)备份指定路由器(BDR) 。只有 DR 和 BDR 会加入到 224.0.0.6 这个组播组。

2OSPF的基本概念

四张表 五种报文 六类LSA 七种邻居之间的状态

2.1OSPF基本概念--LS

(1)链路状态(LS):路由器周边的链路的状态。

(2)分为两种状态:

        直连网段状态:通告接口网段和接口状态感知。

        描述直连网段(网段、掩码、接口开销)

        直连拓扑状态:通过OSPF邻居和邻居状态感知。

        描述直连拓扑(邻居RouterID、连接接口、接口开销)

(3)接口开销 = OSPF参考带框/接口带宽

        OSPF参考带宽默认为100Mbps(在计算时需要注意单位)

        Loopback接口的开销默认为1

(4)LS例子:

2.2OSPF基本概念--Router ID

(1)一台路由器如果要运行OSPF协议,则必须存在Router ID(RID)。

(2)RID是一个32比特无符号整数,可以在一个自治系统中唯一的标识一台路由器。

(3)RID可以手工配置,也可以自动生成。(一般手工配置)

(4)如果没有通过命令指定RID,将按照如下顺序自动生成一个RID:

        如果当前设备配置了Loopback接口,将选取所有Loopback接口上数值最 大的IP地址作为RID;

        如果当前设备没有配置Loopback接口,将选取它所有已经配置IP地址且链 路UP的接口上数值最大的IP地址作为RID。

(5)Router ID选取案例

2.3OSPF基本概念--LSA

(1)链路状态通告(LSA):按一定格式封装后的链路状态信息。

(2)其中两种链路状态通告:

        LAS1:路由器链路状态通告(每台路由器都会发起之间的LSA1)每台 OSPF 路由器都会生成 LSA 1,描述自身直连链路、邻居关系。

        LSA2:传送网络链路状态通告。由网络中的 DR(指定路由器) 生成,描述广播型网络(如以太网)的网段信息 。

2.4OSPF基本概念--LSDB

(1)链路状态数据库(LSDB):在 OSPF 网络中,每台运行 OSPF 协议的路由器都会收集其所在区域内的所有链路状态通告(LSA),并将这些 LSA 存储在本地的一个数据库。

(2)每台OSPF路由器都有一个LSDB,用于存储LSA。

(3)同一区域中的OSPF路由器的LSDB一致。

        LSA封装在LSU报文中,在区域内洪泛,最终达到区域内LSDB一致。

        LSA在洪泛过程中内容保持不变

2.5OSPF基本概念--LSU

(1)链路状态个更新(LSU):主要用于在路由器之间传递链路状态信息,确保网络中所有路由器的链路状态数据库(LSDB)保持同步。

(2)LSU 报文由一个报头和多个 LSA(链路状态通告)组成。报头包含了一些基本信息,如版本号、类型、报文长度等。而其中的 LSA 则是具体的链路状态信息载体,常见的 LSA 类型包括 LSA 1(路由器链路状态通告)、LSA 2(网络链路状态通告)、LSA 3(汇总链路状态通告)等,这些 LSA 描述了网络拓扑、路由器连接关系、链路属性等信息。

2.6OSPF基本协议模型

2.7OSPF基本概念--SPF 

(1)SPF计算

        以自己LSA1为根,进行SPF计算。

        各OSPF路由器单独进行SPF计算,互不影响。

        以自己为根,到目标网段的出接口开销和。

(2)SPF计算例子1(选择带宽最小)

(2)STP开销计算例子2--以自己为根,到目标网段的出接口开销和

 2.8OSPF的四张表

生成流程:

        Hello 建邻居:路由器发 Hello 报文,匹配参数后建立邻居关系,填充邻居表。

        LSU 同步拓扑:邻居关系 Full 后,用 LSU 交换 LSA,构建 LSDB。

        SPF 算 OSPF 路由:基于 LSDB 运行 SPF 算法,生成 OSPF 路由表。

        管理距离(优先级相同的情况下)选全局路由:OSPF 路由与其他协议路由比较,选最优路由存入全局路由表,指导数据包转发。

OSPF 四张表是 “从发现邻居→同步拓扑→计算协议内路由→选全局最优路由” 的递进过程,Hello 负责 “认人”,LSU 负责 “传地图”,SPF 负责 “规划路”,管理距离负责 “选最终走哪条路” 。

2.9OSPF基本概念--OSPF网络类型

2.10OSPF基本概念--OSPF报文类型与封装(五个报文)

五个报文的发送条件:

(1)Hello 报文

        启动及周期性发送:当路由器上启用 OSPF 协议后,会在所有配置了 OSPF 的接口上按照默认周期(广播网络中为 10 秒,非广播多路访问(NBMA)网络中为 30 秒) 发送 Hello 报文。其目的是发现邻居路由器,并维护邻居关系。通过 Hello 报文中携带的相关参数,如 Router ID、区域 ID、Hello 间隔、Dead 间隔等,来判断是否可以与邻居建立和维持邻接关系。

        邻居状态变化时:当路由器检测到邻居的状态发生变化,比如从 Down 状态变为 Init 状态等,也会发送 Hello 报文,以确认邻居状态的改变,并尝试建立或重新建立稳定的邻居关系。

(2)Database Description(DD)报文

        邻接关系建立初期:在两台路由器建立邻接关系过程中,进入 Exstart 状态后,会开始发送 DD 报文。此时,双方通过交换 DD 报文来确定主从关系,其中主路由器负责控制 DD 报文的序列号,以确保 DD 报文的有序传输。

        链路状态数据库(LSDB)同步请求:在确定主从关系后,路由器会发送携带 LSA 头部信息的 DD 报文,向邻居描述自己的 LSDB 内容,目的是让对方了解自己拥有哪些链路状态信息,为后续的链路状态信息请求做准备。

(3)Link State Request(LSR)报文

        收到不完整或过期的 LSDB 信息:当路由器收到邻居发送的 DD 报文后,会将其中的 LSA 头部信息与自己的 LSDB 进行对比。如果发现邻居有自己没有的 LSA,或者邻居的 LSA 版本比自己的新,就会向邻居发送 LSR 报文,请求获取这些 LSA 的完整详细信息。

(4)Link State Update(LSU)报文

        响应 LSR 请求:当路由器接收到邻居发送的 LSR 报文后,会根据请求内容,将相应的 LSA 封装在 LSU 报文中发送给邻居,以满足邻居获取完整链路状态信息的需求。

        网络拓扑变化时:当本地路由器检测到网络拓扑发生变化,如链路故障、新增链路等,会生成相应的 LSA,并将这些 LSA 封装在 LSU 报文中,向邻居路由器泛洪(Flooding)这些链路状态更新信息,以便让整个网络中的路由器都能及时了解网络拓扑的变化,更新各自的 LSDB。

(5)Link State Acknowledgment(LSAck)报文

        收到 LSU 报文后:当路由器接收到邻居发送的 LSU 报文后,会对其中的每个 LSA 进行检查和处理,然后向发送方发送 LSAck 报文,用以确认自己已经正确接收到了这些 LSA。发送 LSU 报文的路由器在一定时间内若没有收到对应的 LSAck 确认,会重新发送未被确认的 LSA,以保证 LSU 报文的可靠传输。

OSPF 报文直接封装在 IP 报文中,协议号为 89,利用 IP 层的服务进行传输 ,但由于 IP 报文本身是不可靠的传输协议,所以 OSPF 通过自身的 LSAck 等机制来保障报文传输的可靠性和网络拓扑信息同步的准确性。

2.11OSPF报文的目的地址

3OSPF的基本工作原理

3.1OSPF网络类型--P2P点对点的流程

3.1.1建立邻居关系

通过发送hello报文发现邻居

3.1.2维持邻居关系

(1)邻居之间通过交换Hello报文(周期性发送hello报文--每10s发一次),确认邻居是否工作正常。 

(2)如果在一定的时间间隔内(邻居过期时间为4个hello time为40s),收不到邻居发来的Hello报文,就认为邻居已经失效,从邻居表中删除。

在点到点网络中,发现邻居后 同步数据库 

3.2OSPF网络类型--广播多路访问DR/BDR

3.2.1DR/BDR产生的原因

(1)如果每台 OSPF 路由器都与其他的所有路由器建立 OSPF 邻接关系,便会导致网络中存在过多的 OSPF 邻接关系,增加设备负担,也增加了网络中泛洪的 OSPF 报文数量。

(2)当拓扑出现变更,网络中的 LSA 泛洪可能会造成带宽的浪费和设备资源的损耗。

3.2.2DR与BDR

(1)为优化广播多路访问网络中 OSPF 邻接关系,OSPF 指定了三种 OSPF 路由器身份,DR(Designated Router,指定路由器)、BDR(Backup Designated Router,备用指定路由器)和 DRother 路由器。
(2)只允许 DR、BDR 与其他 OSPF 路由器建立邻接关系。DRother 之间不会建立全毗邻的 OSPF 邻接关系,双方停滞在 2-way 状态。BDR 会监控 DR 的状态,并在当前 DR 发生故障时接替其角色。如下图情况:

3.2.3DR/BDR的选举规则

(1)首先比较Hello报文中携带的优先级

        优先级最高的被选举为DR,优先级次高的被选举为BDR

        优先级为0的不参与选举

(2)优先级一致的情况下,比较Router ID

        Router ID越大越优先

(3)保持稳定原则

        当DR/BDR已经选举完毕,就算一台具有更高优先级的路由器为有效,也不会替换该网段中已经选举的DR/BDR成为新的 DR/BDR。如下图情况:

(4)特殊情况说明:在OSPF中,DR的身份是终生制的,在华为设备中设备启动后,30s内如果没有选举的过程,路由器会认为自己是DR,将自己设置为DR,后续若有更高优先级的设备加入进来无法改变其DR的地位。

(5)在 OSPF(开放最短路径优先)协议中,DR(指定路由器 )的角色是针对路由器的接口而言的。DR 是 OSPF 路由接口的特性,而非整台路由器的特性,一台路由器的不同接口在不同网段中可以拥有不同的 OSPF 路由器身份。

(6)DR与BDR的选举范围是在一个广播域中选,有几个广播域就有几个DR和BDR。

注: 一个交换机的所有接口‌属于同一个广播域‌;路由器的一个接口通常构成一个独立的广播域。

3.3邻居关系无法建立原因总结

3.4邻居状态机

3.4.1邻居状态变化(邻居关系)

(1)Down:这是邻居的初始状态,还没收到 Hello 报文
(2)Attempt:只在 NBMA 网络上存在,已发出 Hello 报文,但没收到回复(不用管)
(3)Init:已经从邻居收到了 Hello 报文,但报文邻居列表没有自己的 router-id
(4)2-Way:互相收到了对方的 Hello 报文,并且报文邻居列表有自己的 router-id

3.4.2邻居状态变换(邻接关系)

(1)ExStart:向邻居发送 DD 报文,协商主从关系
(2)Exchange:相互发送包含链路状态信息摘要的 DD 报文
(3)Loading:相互发送 LSR 报文请求 LSA,发送 LSU 报文通告 LSA。
(4)Full:路由器的 LSDB 已经同步

3.5发现邻居并建立邻居关系

hello报文除了有发现邻居的功能以外还会携带自己的邻居表给对方。

(1)一开始两边路由器都处于DOWN状态。

(2)路由器A向路由器B发送hello报文,因为此时A无邻居,hello报文中携带的邻居信息为空。

(3)路由器B收到路由器A发来的Hello报文后,知道存在一个邻居为路由器A,但是对方并不知道自己的存在(路由器B知道此事原因是因为路由器B收到的hello报文中的邻居信息为空),所以发送给路由器A的hello报文中的邻居状态为初始化状态(Init)

(4)路由器A收到B发来的Hello报文后,发现自己有一个邻居为路由器B,且路由器B知道自己的存在。此时路由器A发送给路由器B的Hello报文中的邻居表的邻居状态描述为2-way状态。

注:在该过程中,两个路由器的状态并非完全同步,因为路由器在hello报文中描述的是自己和邻居当前的关系。初始化状态并非是必须的。

发现邻居之后,同步数据库之前会做一个工作:判断自己的接口类型,如果自己的接口类型为以太网接口类型则需要选举BR/BDR。其中人为修改的网络类型优于网络默认的网络类型。

其中DRother和DRother之间不需要同步数据库,状态停留在2-way状态。其他类型的路由器都需要同步数据库。

3.6同步数据库和建立完全邻接关系

3.6.1发送DD报文

(1)1 号和 2 号 DD 报文为空 DD 报文(里面不带数据库的汇总信息),用于协商主从,其中带有三个置位分别为:I(标识当前是初始化状态,无主从)、M(代表后面还有很多报文)、MS(代表当前设备参与主从的选举),RTA 和 RTB 在交换初始 DD 报文后,会对彼此的 Router ID 进行比较 。router-id 大的一端胜出;

注:为什么要协商主从?为了确定用谁的序列号作为DD报文的初始序列号,提高交互过程中的可靠性。(OSPF的五个报文中,除了hello报文以外,其他四个报文都有序号

(2)3 号和 4 号 DD 报文包含 LSDB 摘要信息。

注:如果在该过程中因为某种原因路由器B没有收到路由器A的3号DD报文会超时重传

(3)5 号 DD 报文依然是空 DD 报文,用于对主路由器 DD 报文的确认。

注:当对方都收到了对方发来的DD报文后,双方都会拿着DD报文与自己的链路状态数据库进行比对,

如果对方DD报文中的信息自己链路状态数据库中都有,状态会从Exchange状态转变为Full状态。

如果对方DD报文中的信息存在自己链路状态数据库中缺失或更新的,状态会从Exchange状态转变为Loading状态。

(4)路由器使用 DD 报文来进行主从路由器的选举和数据库摘要信息的交互。

(5)DD 报文包含 LSA 的头部信息,用来描述 LSDB 的摘要信息。

(6)DD 报文中的 interface MTU 两端需要一致

3.6.2向对方请求所需要的LSA

(1)LSR 用于向对方请求所需的 LSA。

(2)LSU 用于向对方发送其所需要的 LSA。

(3)LSACK 用于向对方发送收到 LSA 的确认。

3.7当邻居关系路由器都达到了FULL状态,这时有新的LSA生成或收到时 泛洪新LSA

邻居关系无需重新建立,只需要更新和收到对方更新确认来同步,状态不需要改变。

3.8广播网络中LSDB更新

在广播和NBMA网络中,链路状态发生变化时,主要是通过DR路由器发送更新报文。如下图:

4LSA报文

4.1LSA报文头部

(1)LS age(16位):代表LSA的“存活时间”,单位是秒

(2)Options(8位):用于标记OSPF的可选功能能力,像是是否支持NSSA(非纯末梢区域)、IPv6等特性。

(3)LS type(8位):用来明确LSA的具体类型,不同数值对应不同功能的LSA。

(4)Link StateID(32位):可理解为LSA的“标识ID”,不过其具体含义会随着LSA类型变化。

(5)Advertising Router(32位):填写生成并发布这个LSA的路由器的RouterID,作用就是明确“是谁发布了该LSA”,方便其他路由器在处理LSA时,知道信息的源头,也有助于进行路由信息的溯源和验证。

(6)LS sequencenumber(32位):是一个序列号,每次新生成LSA或者更新已有LSA时,序列号会单调递增。路由器依靠它判断LSA的新旧,序列号越大,代表LSA越新。这样能避免旧的、过时的LSA覆盖新的LSA信息,保证网络中传播的是最新的拓扑等数据。

(7)LS checksum(16位):是对LSA头部以及数据部分做的校验和计算结果。当LSA在网络中传输时,接收方会重新计算校验和并与该字段对比,以此检测LSA在传输过程中是否出现错误、被篡改,保障LSA信息的完整性。

(8)Length(16位):记录LSA的总长度,单位是字节,包含LSA头部和后续的数据部分。接收方路由器利用这个字段,能准确知晓该LSA报文的边界,从而正确解析、提取LSA里的信息,避免解析错误。

4.2包含在各种报文中的LSA信息

(1)DD报文:LSA 类型、LSA 标识、通告路由器和 LSA 序列号

(2)LS请求报文:只有 LSA 类型、LSA 标识和通告路由器的简化 LSA 头部

(3) LS更新报文:完整的 LSA 信息,包括 LSA 头部和具体的链路状态信息。

(4)LS确认报文:LSA头部信息:LSA 类型、LSA 标识、通告路由器和 LSA 序列号 。只确认收到的报文。让发送方知道对方收到了多少个报文。

5OSPF LSA洪泛与老化

5.1OSPF LSA老化

超过最大老化时间的LSA就会将其删除。

5.2OSPF LSA老化与全网刷新

半小时更新一次。

如果在某个路由器中 收到了两份一模一样的LSA但序号分别为9和10。路由器会存储序号为10的,因为序号越大内容越新。

5.3泛洪新LSA

http://www.lryc.cn/news/598155.html

相关文章:

  • C# 泛型(泛型方法)
  • Python中常用标准库(时间库、随机库、正则表达式)
  • pytest官方Tutorial所有示例详解(一)
  • 基于Node.js开发的开源博客平台ghost安装和使用
  • MySQL高可用部署
  • 云原生MySQL Operator开发实战(一):Operator基础与CRD设计
  • Spring MVC中常用注解_笔记
  • nuxt更改页面渲染的html,去除自定义属性、
  • 【Word Press进阶】自定义区块的行为与样式
  • go项目实战二
  • Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)
  • 数据挖掘顶刊TKDE论文分享│ST-LLM+:面向交通预测的图增强时空大语言模型
  • 第五章 Freertos物联网实战 微信小程序篇
  • 从0开始学习R语言-Day56--空间变系数模型
  • Django基础(八)———数据库外键及表关系
  • Transformer Masked loss原理精讲及其PyTorch逐行实现
  • Kubernetes 集群架构和Pod创建流程
  • 【unity游戏开发入门到精通——组件篇】unity的粒子系统力场 (Particle System Force Field)实现如旋风、吸引力、风吹效果等
  • Unity GC 系列教程第四篇:GC Alloc 优化技巧与实践(下)与 GC 调优
  • 时序数据库IoTDB的核心功能特性
  • iOS WebView 加载失败与缓存刷新问题排查实战指南
  • 【Lucene】文件概览
  • 3D Semantic Occupancy Prediction
  • Linux进程生命周期:从创建到回收的完整闭环
  • 【建模与仿真】融合共现网络特征与知识增强语义梯度提升电子邮件分类
  • Jenkins最新版本的安装以及集成Allure生成测试报告
  • 跨越学术边界的战略选择:英文专著的潜在价值发掘
  • C++11之可变参数模板
  • 不同类型的交易所交易规则有哪些区别?
  • Apache Flink 实时流处理性能优化实践指南