上一章节介绍了OSPF相比RIP具有无环路、路由收敛速度快、可扩展性好的特点。知识卡片 | 链路状态路由协议OSPF凭什么会取代RIP?

我们知道路由协议的最终目的是为了计算最优路由加入路由表来指导IP数据包转发,那么OSPF协议是如何通过报文交互生成路由的呢?今天主要根据5种报文和8种邻居状态机给大家介绍下OSPF协议的基本工作原理。

正文

1OSPF协议的几个概念

Router ID

Router ID是一个32位的值,它唯一标识了一个自治系统内的路由器,可以为每台运行OSPF的路由器上可以手动配置一个Router ID,或者指定一个IP地址作为Router ID。

如果没有手动配置Router ID,运行OSPF协议的路由器如何选取Router ID?

1、如果设备存在多个逻辑接口地址,则路由器使用逻辑接口中最大的IP地址作为Router ID;

2、如果没有配置逻辑接口,则路由器使用物理接口的最大IP地址作为Router ID。

注意:

1、在为一台运行OSPF的路由器配置新的Router ID后,需要在路由器上通过重置OSPF进程来更新Router ID。

2、通常建议手动配置Router ID,以防止Router ID因为接口地址的变化而改变。

邻居(Neighbor):

OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文用于发现邻居

收到Hello报文的OSPF路由器会检查报文中所定义的一些参数,如果双方的参数一致,就会彼此形成邻居关系

邻接(Adjacency):

形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。

只有当双方成功交换DD报文,并能交换LSA之后,才形成真正意义上的邻接关系。

2OSPF协议支持的网络类型

OSPF协议支持四种网络类型,分别是点到点网络广播型网络NBMA网络点到多点网络

1、点到点网络是指只把两台路由器直接相连的网络。一个运行PPP的64K串行线路就是一个点到点网络的例子。

2、广播型网络是指支持两台以上路由器,并且具有广播能力的网络。一个含有三台路由器的以太网就是一个广播型网络的例子。

OSPF可以在不支持广播的多路访问网络上运行,此类网络包括在hub-spoke拓扑上运行的帧中继(FR)和异步传输模式(ATM)网络,这些网络的通信依赖于虚电路。

OSPF定义了两种支持多路访问的网络类型:非广播多路访问网络(NBMA)点到多点网络(Point To Multi-Points)

3、NBMA:在NBMA网络上,OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置。NBMA方式要求网络中的路由器组成全连接。

缺省情况下,OSPF认为帧中继、 ATM的网络类型是NBMA。

4、P2MP:将整个网络看成是一组点到点网络。对于不能组成全连接的网络应当使用点到多点方式。

注意:

现网中遇到的大部分属于点到点网络广播型网络,因为帧中继、 ATM网络基本已经淘汰了。

3DR&BDR

为减小广播型网络NBMA网络中OSPF流量,OSPF会选择一个指定路由器(DR)和一个备份指定路由器(BDR)。

选举DR&BDR的条件:

每一个含有至少两个路由器广播型网络NBMA网络都有一个DR和BDR。在点到点网络P2MP不需要选举DR&BDR。

DR&BDR的工作原理

1、当指定了DR后,所有的路由器都与DR建立起邻接关系,DR成为该广播网络上的中心点

2、BDR在DR发生故障时接管业务,一个广播网络上所有路由器都必须同BDR建立邻接关系。

为什么需要选举DR&BDR?

1、DR和BDR可以减少邻接关系的数量,从而减少链路状态信息以及路由信息的交换次数,这样可以节省带宽,降低对路由器处理能力的压力。

2、一个既不是DR也不是BDR的路由器只与DR和BDR形成邻接关系并交换链路状态信息以及路由信息,这样就大大减少了大型广播型网络和NBMA网络中的邻接关系数量

DR&BDR的选举

邻居发现完成之后,路由器会根据网段类型进行DR选举

1、在广播和NBMA网络上,路由器会根据参与选举的每个接口的优先级进行DR选举。

优先级取值范围为0-255,值越高越优先。缺省情况下,接口优先级为1。如果一个接口优先级为0,那么该接口将不会参与DR或者BDR的选举。

2、如果优先级相同时,则比较Router ID,值越大越优先被选举为DR。

为了给DR做备份,每个广播和NBMA网络上还要选举一个BDR。BDR也会与网络上所有的路由器建立邻接关系。

为了维护网络上邻接关系的稳定性,如果网络中已经存在DR和BDR,则新添加进该网络的路由器不会成为DR和BDR,不管该路由器的Router Priority是否最大。如果当前DR发生故障,则当前BDR自动成为新的DR,网络中重新选举BDR;如果当前BDR发生故障,则DR不变,重新选举BDR。这种选举机制的目的是为了保持邻接关系的稳定,使拓扑结构的改变对邻接关系的影响尽量小。

例子:

在没有DR的广播网络上,邻接关系的数量可以根据公式n(n-1)/2计算出,n代表参与OSPF的路由器接口的数量。

如图所示,所有路由器之间有6个邻接关系。本例中使用DR和BDR将邻接关系从6减少到了5,RTA和RTB都只需要同DR和BDR建立邻接关系,RTA和RTB之间建立的是邻居关系。

此例中,邻接关系数量的减少效果并不明显。但是,当网络上部署了大量路由器时,比如100台,那么情况就大不一样了

4OSPF协议5种报文

OSPF直接运行在IP协议之上,使用IP协议号89

运行OPSF协议的路由器通过5种报文的交互从邻居状态达到邻接状态,完成LSA的泛洪,使网络的路由器LSDB达到一致,每个路由器按照自己LSDB根据SPF算法计算路径,生成最优路由加入路由表。

下面我们一起看下这个五种报文类型,每种报文都使用相同的OSPF报文头。

1、Hello报文:

  • 最常用的一种报文,用于发现、维护邻居关系
  • 在广播和NBMA(None-Broadcast Multi-Access)类型的网络中选举指定路由器DR(Designated Router)和备份指定路由器BDR(Backup Designated Router)

2、DD报文:

  • 两台路由器进行LSDB数据库同步时,用DD报文来描述自己的LSDB
  • DD报文的内容包括LSDB中每一条LSA的头部(LSA的头部可以唯一标识一条LSA)。LSA头部只占一条LSA的整个数据量的一小部分,所以,这样就可以减少路由器之间的协议报文流量

3、LSR报文:

  • 两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地LSDB所缺少的,这时需要发送LSR报文向对方请求缺少的LSA,LSR只包含了所需要的LSA的摘要信息。

4、LSU报文:用来向对端路由器发送所需要的LSA

5、LSACK报文:用来对接收到的LSU报文进行确认

5OSPF协议8种邻居状态机
运行OPSF协议的路由器通过5种报文的交互从邻居状态达到邻接状态,中间可能会经历以下8种状态

Down:这是邻居的初始状态,表示没有从邻居收到任何信息。

Attempt:此状态只在NBMA网络上存在,表示没有收到邻居的任何信息,但是已经周期性的向邻居发送报文,发送间隔为HelloInterval。如果RouterDeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。

Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中,尚未与邻居建立双向通信关系。

2-Way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的最高级状态。

ExStart:这是形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向邻居发送DD报文。主从关系是在此状态下形成的,初始DD序列号也是在此状态下决定的。在此状态下发送的DD报文不包含链路状态描述。

Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地LSDB的内容。

Loading:相互发送LSR报文请求LSA,发送LSU报文通告LSA。

Full:路由器的LSDB已经同步

6OSPF协议详细工作原理

结合OSPF协议的5种报文8种邻居状态机来一起看下OPSF的工作过程:

1、邻居发现:

运行OSPF协议的路由器会发送Hello报文,用来发现和维持OSPF邻居关系;

Hello报文结构:

Hello报文中的重要字段解释如下:

Network Mask:32比特,发送Hello报文的接口的网络掩码。

HelloInterval:16比特,发送Hello报文的时间间隔,单位为秒。默认是10S。

Options:8比特,标识发送此报文的OSPF路由器所支持的可选功能。

可选项:

  • E:允许Flood AS-External-LSAs
  • MC:转发IP组播报文
  • N/P:处理Type-7 LSAs
  • DC:处理按需链路

Router Priority:8比特,发送Hello报文的接口的Router Priority,用于选举DR和BDR。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。

RouterDeadInterval:32比特,失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效;单位为秒,通常为四倍HelloInterval。默认是40S。

Designated Router:32比特,发送Hello报文的路由器所选举出的DR的IP地址。如果设置为0.0.0.0,表示未选举DR路由器。

Backup Designated Router:32比特,发送Hello报文的路由器所选举出的BDR的IP地址。如果设置为0.0.0.0,表示未选举BDR。

Neighbor:32比特,邻居的Router ID列表,表示本路由器已经从这些邻居收到了合法的Hello报文。

如果路由器发现所接收的合法Hello报文的邻居列表中有自己的Router ID,则认为已经和邻居建立了双向连接,表示邻居关系已经建立。

验证一个接收到的Hello报文是否合法包括:

1、如果接收端口的网络类型是广播型,点到多点或者NBMA,所接收的Hello报文中Network Mask字段必须和接收端口的网络掩码一致,如果接收端口的网络类型为点到点类型或者是虚连接,则不检查Network Mask字段;

2、所接收的Hello报文中Hello Interval字段必须和接收端口的配置一致;

3、所接收的Hello报文中Router Dead Interval字段必须和接收端口的配置一致;

4、所接收的Hello报文中Options字段中的E-bit(表示是否接收外部路由信息)必须和相关区域的配置一致。

2、LSDB数据库同步:

路由器在建立完成邻居关系之后,便开始进行LSDB数据库同步。

路由器使用DD报文来进行主从路由器的选举数据库摘要信息的交互。DD报文包含LSA的头部信息,用来描述LSDB的摘要信息。

具体过程如下:

主从路由器的选举:

1、邻居状态变为ExStart以后,RTA向RTB发送第一个DD报文,在这个报文中,DD序列号被设置为X(假设),RTA宣告自己为主路由器。

2、RTB也向RTA发送第一个DD报文,在这个报文中,DD序列号被设置为Y(假设)。RTB也宣告自己为主路由器。

由于RTB的Router ID比RTA的大,所以RTB应当为真正的主路由器。

数据库摘要信息的交互:

3、RTA发送一个新的DD报文,在这个新的报文中包含LSDB的摘要信息(LSDB的摘要信息可以类比成一本书的目录),序列号设置为RTB在步骤2里使用的序列号(表示承认RTB为真正的主路由器),因此RTB将邻居状态改变为Exchange

4、邻居状态变为Exchange以后,RTB发送一个新的DD报文,该报文中包含LSDB的描述信息,DD序列号设为Y+1(上次使用的序列号加1)。

5、即使RTA不需要新的DD报文描述自己的LSDB,但是作为从路由器,RTA需要对主路由器RTB发送的每一个DD报文进行确认。所以,RTA向RTB发送一个内容为空的DD报文,序列号为Y+1。

3、建立完全邻接关系:

6、发送完最后一个DD报文之后,RTA将邻居状态改变为Loading;邻居状态变为Loading之后,RTA开始向RTB发送LSR报文,请求那些在Exchange状态下通过DD报文发现的,而且在本地LSDB中没有的链路状态信息。

RTB收到最后一个DD报文之后,改变状态为Full(假设RTB的LSDB是最新最全的,不需要向RTA请求更新)。

7、RTB收到LSR报文之后,向RTA发送LSU报文,在LSU报文中,包含了那些被请求的链路状态的详细信息。RTA收到LSU报文之后,将邻居状态从Loading改变成Full

8、RTA向RTB发送LSACK报文,用于对已接收LSA的确认。

此时,RTA和RTB之间的邻居状态变成Full,表示达到完全邻接状态

报文如何截取时间_5种报文、8种邻居状态机详解OSPF工作原理相关推荐

  1. 创建三个并发进程linux,Linux下几种并发服务器的实现模式(详解)

    1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. 2>循环服务器和并发服务器 1.循 ...

  2. 1 linux下tcp并发服务器的几种设计的模式套路,Linux下几种并发服务器的实现模式(详解)...

    1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发. 2>循环服务器和并发服务器 1.循 ...

  3. Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解

    Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...

  4. 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 其实这些 ...

  5. js截取图片 裁剪图片之cropper.js插件用法详解

    js截取图片 裁剪图片之cropper.js插件用法详解 源码:https://github.com/fengyuanchen/cropper 引入+使用 <link href="/p ...

  6. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  7. php两种基本的输出方及实例详解

    在本篇文章里小编给大家整理了一篇关于php两种基本的输出方及实例详解内容,有需要的朋友们可以跟着学习参考下. 在 PHP 中,有两种基本的输出方法:echo 和 print. echo 和 print ...

  8. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  9. mos 控制交流_详解MOS管原理及几种常见失效分析

    MOS管英文全称为Metal Oxide Semiconductor即金属氧化物半导体,即在集成电路中绝缘性场效应管.确切的说,这个名字描述了集成电路中MOS管的结构,即:在一定结构的半导体器件上,加 ...

最新文章

  1. Kibana:分析及可视化日志文件
  2. Java 爬虫--类似Python的requests库--HttpClient, HttpAsyncClient--Maven
  3. 计算机网络技术与应用教程期末考试,2011大学计算机网络技术与应用教程客观题期末复习(含判断题,属于公共课程,使用)...
  4. cesium 水位模拟_Water Simulation
  5. CMAKE_CURRENT_BINARY_DIR
  6. [html] title与h1、b与strong、i与em的区别分别是什么?
  7. jquery插件开发通用框架
  8. Spring中PropertyPlaceholderConfigurer的使用
  9. boost学习之BOOST_PP_SEQ_FOR_EACH
  10. python urlopen错误_urlopen()出错
  11. 高效管理 Android 前台服务
  12. rehat 出现GDB debuginfo-install 问题处理
  13. python官方文档(自翻译)
  14. 皮层之外(从进化的角度看皮层下脑组织:杏仁核,丘脑,纹状体,小脑)
  15. java 图片下载爬虫_java入门爬虫(爬取网页的图片下载到本地磁盘)
  16. selenium中文文档_基于selenium的大麦网演唱会抢票程序
  17. 信息学奥赛一本通1374 铲雪车(snow)
  18. vector subscript out of range
  19. zing开发者_Zing免费开放Java开发人员
  20. 股票的交易原理是怎样的?

热门文章

  1. 【目标检测】(8) ASPP改进加强特征提取模块,附Tensorflow完整代码
  2. 【开源方案共享】VDO-SLAM:基于视觉的动态SLAM感知系统
  3. define的多行定义
  4. 关于 Caused by: java.lang.NoClassDefFoundError: com/alipay/api/AlipayApiException 解决办法
  5. 安装vim-go插件之后遇到的gopls警告信息不消失的问题的解决方法
  6. 通过python的ConfigParse模块读写ini配置文件
  7. ceph 部署单机集群
  8. Linux命令:tar命令批量解压方法总结
  9. 常用图像额文件格式及类型
  10. BestCoder Round #92 比赛记录