草庐IT

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

Royyic 2024-02-03 原文

1,因为OSPF是链路状态型协议,算出来的路径不会出现环路,并且,OSPF是以带宽作为开销值的评判标准的,所以,相较于RIP选出来的路径更加合理

2,因为OSPF的计时器时间短于RIP,所以,从收敛速度的角度看,OSPF优于RIP

3,RIP传递的数据是路由信息,而OSPF传递的数据是拓扑信息,从单个数据包的角度来看,OSPF的资源占用量是大于RIP的。但是,由于RIP存在30S一次的周期更新,而OSPF并没有这样高频的周期更新,并且,OSPF本身就设计了很多减少资源占用的措施。所以从整体的角度来看,OSPF在资源占用上小优于RIP。

        RIP--RIPV1,RIPV2---IPV4

        RIPNG--IPV6

        OSPF--OSPFV1(在实验室阶段夭折),OSPFV2---IPV4

        OSPFV3---IPV6

RIPV2和OSPFV2

相同点:

1, OSPFV2和RIPV2一样,都是无类别的路由协议,都支持VLSM和CIDR

2,OSPFV2(224.0.0.5224.0.0.6)和RIPV2(224.0.0.9)都是以组播的形式发送信息--本地链路组播----TTL值为1

3,OSPFV2和RIPV2都支持等开销负载均衡

不同点:

RIPV2只能应用在小型网络当中,OSPFV2可以应用在中大型网络当中。

OSPF为了适应中大型网络,需要进行----结构化部署 -----区域划分

区域划分的目的 --- 区域内部传递拓扑信息,区域之间传递路由信息。

区域边界路由器 ---- ABR-- 同时属于多个区域,并且一个接口对应一个区域。且至少有一个接口在area 0。区域之间可以存在多个ABR设备,并且一个ABR设备也可以属于多个区域

区域划分的要求:1,区域之间必须存在ABR设备

                           2,区域划分必须遵循星型拓扑进行划分--星型拓扑中间区域称为骨干区

                     为了方便对区域进行管理,我们给每个区域设置一个区域ID--

area ID-----32位二进制构成(表示方法存在两种--1,采用点分十进制的形式来表示 2,直接采用10进制的形式来表示)----规定骨干区域的ID定义为0

如果网络规模不大,则不进行区域划分,则这样的网络成为单区域OSPF网络。(在华为设备中要求OSPF网络的区域ID必须设置为area 0)

如果网络规模较大,需要进行划分,则称为多区域OSPF网络

1, OSPF的数据包类型

hello包 --- 用来周期发现,建立和保活邻居关系

  hello包默认以10S为周期来进行周期保活的。 ---hello时间

  OSPF中进行失效判断的时间为4的hello时间。--dead time死亡时间

            因为OSPF需要收集网络拓扑信息,所以就必须区分和标定不同的路由器。我们给每台路由器设计一个RouterID

  • 可手工配置,仅需满足以下要求

1,   全网唯一

2,格式统一 --- 必须按照IP地址的格式来进行配置

  • 可自动生成 ----

        1,如果存在环回接口,则在环回接口中取IP地址最大的为RouterID;

        2, 若不存在环回接口,则需要在所有的物理接口中选择IP地址最大的作为RouterID

hello包中会携带RouterID

DBD包-----数据库描述报文 ----携带的是路径信息的摘要

LSR包------链路状态请求报文----基于DBD包请求未知LSA的信息

LSU包-----链路状态更新报文-----真正携带LSA信息的数据包

LSAck包---链路状态确认报文-----确认包

OSPF协议存在30min一次的周期更新。

2, OSPF的状态机

     

Two-Way State----标志着邻居关系的建立。  只发hello包维持关系

      (条件匹配)-----条件匹配成功,则可以进入下一个状态,如果条件匹配失败,则仅保持邻居关系即可。周期性的发送hello包进行保活即可

          LSDB-------链路状态数据库

          Exstart State 主从关系选举----通过未携带数据的DBD包来比较RouterID,RouterID大的为主,为主则可以优先进入下一个状态-Exchange State,RouterID小的为从。

  使用未携带数据的DBD包进行主从关系选举,主要目的是为了和之前的邻居状态做区分

  DBD包的确认使用的不是ACK包来确认的(显性确认),而是通过数据包中的序号参数来进行的隐形确认。

   FULL状态----标志着邻接关系的建立-----邻接设置的目的是为了和之前的邻居状态做区分

  

  1. down状态----启动OSPF,发送hello包之后进入下一个状态
  2. init状态(初始化状态)--- 收到hello包中有自己本地的RouterID,则进入下一个状态
  3. Two-way(双向通讯)状态-----标志着邻居关系的建立
  4.      (条件匹配)-----条件匹配成功,则可以进入下一个状态,如果条件匹配失败,则仅保持邻居关系即可。周期性的发送hello包进行保活即可。
  5. exstart(预启动)状态-----使用未携带的DBD包进行主从关系选举,为主的优先进入下一个状态
  6.  exchange(准交换)状态---使用携带目录信息的DBD来共享数据库目录
  7. loading(加载)状态----基于对端发送的DBD包和本地数据库进行对比,之后,使用LSR包请求自己未知的LSA信息,对端使用LSU包进行LSA信息的传递,需要使用ACK进行确认
  8. FULL状态----标志着邻接关系的建立

3, OSPF的工作过程

       启动配置完成后,OSPF向本地所有运行协议的接口以组播224.0.0.5的形式发送hello包。hello包中携带本地的RouterID以及本地已知的邻居的RouterID。之后,将收集到的邻居关系记录在一张表中----邻居表

       邻居关系建立完成后,进行条件匹配;失败则停留在邻居关系,仅使用Hello包进行保活。

       匹配成功,则开始建立邻接关系。首先先使用未携带数据的DBD包进行主从关系选举。之后,使用携带数据的DBD包共享数据库目录信息。之后使用LSR/LSU/LSACK来获取本地未知的LSA信息。完成本地数据库的建立 --- 生成数据库表(LSDB---链路状态数据库)

        最后,基于本地链路数据库中的LSA信息,生成有向图,之后使用SPF算法转换成最短路径树,之后,计算到达未知网段的路由信息。将生成的路由信息添加到路由表中。

        收敛完成后,依然使用hello包每10S进行周期保活。每30min进行一次周期更新

  

结构突变的情况

  • 新增网段----触发更新,将变更信息第一时间使用LSU包进行传递,需要ACK确认
  • 断开网段----触发更新,将变更信息第一时间使用LSU包进行传递,需要ACK确认
  • 无法沟通 --- dead time

4, OSPF的基本配置

  • 启动OSPF的进程

 [r1]ospf 1 router-id 1.1.1.1  ---手工配置RID在启动进程时配置

 [r1-ospf-1]

  • 创建区域

[r1-ospf-1]area 0

[r1-ospf-1-area-0.0.0.0]

  • 宣告

[r1-ospf-1-area-0.0.0.0]network 12.0.0.0 0.0.0.255(反掩码)----由连续的0和1组成,0对应的位不可变,1对应的位可变

查看邻居表

[r1]display ospf peer

查看邻居关系简表

[r1]display ospf peer brief

查看数据库表

[r1]display ospf lsdb

展开一条LSA信息

[r1]display ospf lsdb router 2.2.2.2

查看路由表

[r1]display ip routing-table

 在华为体系中,OSPF协议默认的优先级为10

OSPF是以带宽作为开销值作为评判标准的

COST = 参考带宽/真实带宽  --华为设备默认的参考带宽为100Mbps

[r1-ospf-1]bandwidth-reference 1000 ---因为默认的参考带宽值较小,在目前传输速率都比较大的情况下,会出现选路不佳的情况,可以将参考带宽改大来改善该问题

注意:一台路由器参考带宽修改了,则所有路由器的参考带宽都必须改成一样的

条件匹配 

指定路由器 --- DR ----DR和一个广播域内其他设备建立邻接关系

备份指定路由器 --- BDR ------ BDR和其他设备之间建立的也是邻接关系

因为DR和BDR是在一个广播域中选举出来的,所以,其实质是一个接口概念。

原理:在一个广播域中,如果所有设备之间都保持邻接关系的话,则将可能出现大量的重复更新。所以,需要进行DR/BDR的选举,所有DRother之间仅保持邻居关系即可

DR/BDR选举规则:

    1,先比较优先级 (Rriority),优先级最大的为DR,优先级次大的为BDR,默认值为1    

[r1-GigabitEthernet0/0/0]ospf dr-priority ?

INTEGER<0-255> Router priority value

        如果将一个接口的优先级修改为0,则其效果是该接口直接放弃DR和BDR的选举。

   2,当优先级相同时,则比较RouterID。RouterID大的路由器对应的接口为DR,次大的对应的接口为BDR。

DR/BDR的选举是非抢占模式的---选举时间为40S(和dead time一致)

重启OSPF进程    <r1>reset ospf 1 process

5,OSPF的拓展配置

  • 手工认证

[r1-GigabitEthernet0/0/0]ospf authentication-mode md5 1 cipher 123456

  • 手工汇总 --- OSPF中拓扑信息是没有办法汇总的,所有只能是针对区域之间传递的路由信息进行汇总,称为区域汇总

[r2-ospf-1-area-0.0.0.0]abr-summary 192.168.0.0 255.255.254.0 ---

在ABR设备上进程中需要汇总的区域视图里配置

  • 沉默接口

                    [r1-ospf-1]silent-interface GigabitEthernet 0/0/2

  • 加快收敛 (在接口改)

   [r1-GigabitEthernet0/0/0]ospf timer hello 5     --修改hello时间的方法,hello时间修改,死亡时间将自动按照4倍关系进行匹配

       邻居之间,hello时间和死亡时间必须一致,不一致将导致邻居关系断开

  • 缺省路由

[r3-ospf-1]default-route-advertise ---需要保证边界路由器本身存在缺省路由,才能下发缺省

[r3-ospf-1]default-route-advertise always ---可以强制下发缺省信息

有关OSPF ---- 开放式最短路径优先协议的更多相关文章

  1. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

  4. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  5. Ruby 和指南针路径与 yeoman 项目 - 2

    我安装了ruby​​、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom

  6. 对象的 Ruby 方法查找路径 - 2

    是否有内置的Ruby方法或众所周知的库可以返回对象的整个方法查找链?Ruby查看一系列令人困惑的类(如thisquestion中所讨论)以查找与消息对应的实例方法,如果没有类响应消息,则调用接收方的method_missing。我将以下代码放在一起,但我确信它遗漏了某些情况或者它是否100%正确。请指出任何缺陷并指导我找到一些更好的代码(如果存在)。defmethod_lookup_chain(obj,result=[obj.singleton_class])ifobj.instance_of?Classreturnadd_modules(result)ifresult.last==B

  7. ruby-on-rails - rails 中的路径解析 - 2

    我正在寻找这样解析路由路径的方法:ActionController::Routing.new("post_path").parse#=>{:controller=>"posts",:action=>"index"}应该和url_for相反更新我发现:Whatistheoppositeofurl_forinRails?Afunctionthattakesapathandgeneratestheinterpretedroute?ActionController::Routing::Routes.recognize_path("/posts")所以现在我需要将posts_path转换为“/p

  8. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  9. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  10. python3获取路径方法 - 2

    一:os.path.dirname(__file__)和os.getcwd()importospath=os.path.dirname(__file__)print("os.path.dirname(__file__)方法的结果{}".format(path))path=os.getcwd()print("os.getcwd()方法的结果{}".format(path))该脚本路径为:/User/xxx/Work1.在当前目录/User/xxx/Work运行程序结果:2.在上一级目录/User/xxx运行程序:3.在其他目录/User/xxx/Work/python运行程序:\在其他目录/Us

随机推荐