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

HCIA(11)OSPF 数据包构成(Hello、DBD、LSR、LSU、LSAck包)、状态机、工作流程(建立邻居关系、主从关系协商、LSDB同步)

OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。
目前针对IPv4协议使用OSPF Version 2,针对IPv6协议使用OSPF Version 3。
在OSPF出现前,网络上广泛使用RIP(Routing Information Protocol)作为内部网关协议。由于RIP是基于距离矢量算法的路由协议,存在着收敛慢、路由环路、可扩展性差等问题,所以逐渐被OSPF取代。

OSPF数据包

OSPF中对路由信息的描述都是封装在链路状态通告LSA(Link State Advertisement)中发布出去的.

OSPF用IP报文直接封装协议报文,协议号为89。

  • Hello包:周期性发送(10s),用来发现、建立、保活邻居关系。
  • DBD包(Database Description packet):描述本地的LSDB摘要信息(本地数据库目录),用于两个设备的数据库同步。
  • LSR包(Link State Request packet):用于向对方请求所需(未知的)的LSA,设备只有在邻居双方成功交换DBD包后都会发送LSR包。
  • LSU包(Link State Update packet):用于共享具体的LSA信息。
  • LSAck包(Link State Acknowledgment packet):用于确认收到的LSA。

OSPF路由计算

OSPF协议路由的计算过程可简单描述如下:
1.建立邻接关系。两端设备通过以下步骤建立邻接关系:
本端设备通过接口向外发送Hello报文与对端设备建立邻居关系。
两端设备进行主/从关系协商和DD报文交换。
两端设备通过更新LSA完成链路数据库LSDB的同步。

2.路由计算。OSPF采用SPF(Shortest Path First)算法计算路由,可以达到路由快速收敛的目的。

状态机

在OSPF网络中,为了交换路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念:
- 邻居关系:OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。
- 邻接关系:形成邻居关系后,如果两端设备成功交换DD报文和LSA,才建立邻接关系。

邻居和邻接状态是通过OSPF状态机表现的:
OSPF路由计算

状态机含义
Down初始阶段,一旦接收到其它设备发出的Hello包则立即进入下一阶段。
Attempt尝试阶段,这个状态只在NBMA网络中出现。(一般不存在)在此状态下,路由器主动尝试与其它路由器建立邻居关系。
Init初始化,一旦接收到RID,我方RID则进入到下一阶段。
2-way双向通讯,邻居关系建立的标志
ExStart预启动,使用不携带数据库目录的DBD包,进行评价关系的选举。如果DR优先级相等,则Router ID大者胜出。
目的在于对DBD包进行排序,避免更新量在同一时间内激增。
Exchange准交换,使用DBD包进行数据库目录信息的交换
Loading加载,基于接收的数据库目录和本地对比,然后基于本地未知的LSA信息,使用LSR来进行查询,对端使用LSU来应答,需要本地最后LSAck确认。
目的在于获取本地未知的LSA信息。
Full转发,邻接关系建立的标志

OSPF工作流程

建立邻居关系

Init

  1. R1的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个Hello报文。
    此时,R1不确定DR是哪台路由器(DR=0.0.0.0),也不确定邻居是哪台设备(Neighbors Seen=0)。
  2. R2收到R1发送的Hello报文后,发送一个Hello报文回应给R1,并且在报文中的Neighbors Seen字段中填入R1的Router ID(Neighbors Seen=1.1.1.1),表示已收到DeviceA的Hello报文,并且宣告DR路由器是R2(DR=2.2.2.2),然后R2的邻居状态机置为Init。
  3. R1收到R2回应的Hello报文后,将邻居状态机置为2-way状态。

主/从关系协商、DD报文交换

2-way

  1. 邻居状态机从2-way转为Exstart状态后开始主从关系选举:
    • R1向R2发送的第一个DD报文内容为空,其Seq序列号假设为X。
    • R2也向R1发出第一个DD报文,其Seq序列号假设为Y。
    • 选举主从关系的规则是比较Router ID,越大越优。R2的Router ID比R1大,因此R2成为真正的主设备。主从关系比较结束后,R1的状态从Exstart转变为Exchange。
  2. R1邻居状态变为Exchange后,R1发送一个新的DD报文,包含自己LSDB的描述信息,其序列号采用主设备R2的序列号。R2收到后邻居状态从Exstart转变为Exchange。
  3. R2向R1发送一个新的DD报文,包含自己LSDB的描述信息,序列号为Y+1。
  4. R1作为从路由器需要对主路由R2发送的每个DD报文进行确认,回复报文的序列号与主路由R2一致。
  5. 发送完最后一个DD报文后,R1将邻居状态切换为Loading

LSDB同步

full

  1. R1收到最后一个DD报文后,发现R2的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。
    此时R2也收到了R1的最后一个DD报文,但R1的LSA,R2都已经有了,不需要再请求,所以直接将R1的邻居状态机改为Full状态。
  2. R1发送LSR报文向R2请求更新LSA。DeviceB用LSU报文来回应R1的请求。R1收到后,发送LSAck报文确认。
    当设备交换完DD报文并更新所有的LSA后,此时邻接关系建立完成(Full)。

相关文章:

  • 服务端实时推送技术之SSE(Server-Send Events)
  • 相机图像质量研究(39)常见问题总结:编解码对成像的影响--运动模糊
  • 【java中的方法如何定义与使用】
  • Spring Cloud Alibaba-04-Sentinel服务容错
  • element导航菜单el-menu添加搜索功能
  • PyTorch使用Tricks:学习率衰减 !!
  • Leetcode 209.长度最小的子数组
  • 第2讲-Memory
  • 一文带你解决如何设置Redis临时密码和永久密码
  • C++内联函数的使用
  • 面试前端性能优化八股文十问十答第三期
  • Python+Requests+Pytest+YAML+Allure实现接口自动化
  • SpringBoot项目嵌入RabbitMQ
  • VSCODE include错误 找不到 stdio.h
  • leetcode-回溯法-矩阵中的路径
  • hexo+github搭建个人博客
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • ➹使用webpack配置多页面应用(MPA)
  • 2018一半小结一波
  • co.js - 让异步代码同步化
  • Elasticsearch 参考指南(升级前重新索引)
  • Facebook AccountKit 接入的坑点
  • Java面向对象及其三大特征
  • js作用域和this的理解
  • leetcode46 Permutation 排列组合
  • MySQL-事务管理(基础)
  • node入门
  • react 代码优化(一) ——事件处理
  • React的组件模式
  • 百度小程序遇到的问题
  • 半理解系列--Promise的进化史
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 大主子表关联的性能优化方法
  • 好的网址,关于.net 4.0 ,vs 2010
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于Android乐音识别(2)
  • 前端设计模式
  • 什么是Javascript函数节流?
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $.proxy和$.extend
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (3)STL算法之搜索
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)mysql_MYSQL(三)
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原創) 物件導向與老子思想 (OO)
  • *p++,*(p++),*++p,(*p)++区别?
  • ./configure,make,make install的作用
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .Net中间语言BeforeFieldInit