• OSPF协议


    OSPF协议概念

    OSPF(Open Shortest Path First开放式最短路径优先)是一个内部网关协议(Interior Gateway Protocol,简称IGP),用于在单一自治系统(autonomous system,AS)内决策路由。是对链路状态路由协议的一种实现,隶属内部网关协议(IGP),故运作于自治系统内部。著名的迪克斯彻(Dijkstra)算法被用来计算最短路径树。OSPF支持负载均衡和基于服务类型的选路,也支持多种路由形式,如特定主机路由和子网路由等。

    OSPF协议特点

    1、OSPF是无类别链路类型IGP协议,作为一种链路状态的路由协议,OSPF将链路状态组播数据LSA(Link State Advertisement)传送给在某一区域内的所有路由器,OSPF通过获得网络中所有的链路状态信息,从而计算出到达每个目标精确的网络路径。

    2、OSPF对网络没有跳数限制

    3、OSPF并不会周期性更新路由表,而采用增量更新,即只在路由有变化时,才会发送更新,并且只发送有变化的路由信息;事实上,OSPF是间接设置了周期性更新路由的规则,因为所有路由都是有刷新时间的,当达到刷新时间阀值时,该路由就会产生一次更新,默认时间为1800秒,即30分钟,所以OSPF路由的定期更新周期默认为30分钟

    4、区域内的路由器都具有相同的全局拓扑图

    5、使用组播进行互相通信

    6、每个区域里的路由器都有一个区域的ID

    7、每个OSPF路由只维护自己所在区域的完整链路状态信息

    OSPF的拓扑结构

    OSPF的路由类型

    1、internal route区域路由器:该设备所有接口都属于同一个区域

    2、Area-Border-Router(ABR)区域边界路由器:该设备同时属于两个以上的区域,必须有一个接口连接区域0

    3、Backbone Route(BR)骨干路由器:该设备至少有一个接口属于骨干区域。所有ABR和区域0内的路由器都是骨干路由器

    4、ASBR(AS Boundary Route)自治系统边界路由器:只要一台OSPF路由器引入了外部路由,它就是ASBR

    OSPF区域类型划分

    1、骨干区域area 0 :

    骨干区域负责区域间路由信息传播。作为中央实体,其他区域与之相连,骨干区域编号为 0,在该区域中,各种类型的 LSA 均允许发布。

    2、非骨干区域:

    传播信息要经过骨干区域转发;

    3、标准区域 :

    除骨干区域外的默认的区域类型,在该类型区域中,各种类型的 LSA 均允许发布。

    4、末梢区域 :

    即 STUB 区域,该类型区域中不接受关于 AS外部的路由信息,即不接受类型 5 的 AS 外部LSA,需要路由到自治系统外部的网络时,路由器使用缺省路由(0.0.0.0),末梢区域中不能包含有自治系统边界路由器 ASBR。

    5、完全末梢区域:

    该类型区域中不接受关于 AS 外部的路由信息,同时也不接受来自 AS 中其他区域的汇总路由,即不接受类型 3、类型 4、类型 5 的 LSA,完全末梢区域也不能包换有自治系统边界路由器 ASBR。

     

    为什么非骨干区域必须和骨干区域相连接?

    由于区域间OSPF是距离矢量的,是容易产生路由回环的。为了避免回环,所以区域间的流量必须经由骨干区域来传递。 

    划分区域的好处在于减少LSA的泛洪,减少路由表的大小。

    Route ID

    运行OSPF路由器的标识,一般用Loopback接口地址,建议手动绑定。(一般使用LoopBack口的环回地址)。

    每一台OSPF路由器只有一个Router-ID,Router-ID使用IP地址的形式来表示,确定Router-ID的方法为:

    1 .手工指定Router-ID。

    2 .路由器上活动Loopback接口中IP地址最大的,也就是数字最大的,如C类地址优先于B类地址,一个非活动的接口的IP地址是不能被选为Router-ID的。

    3 .如果没有活动的Loopback接口,则选择活动物理接口IP地址最大的。

    OSPF工作过程及原理

    1、路由器上启动OSPF协议后,直连的邻居间,开始组播收发hello包,Hello包中将存储本地已知邻居的RID,在双方RID均已知的情况下,建立邻居关系,生成邻居表;

    2.邻居关系建立后,邻居间将进行条件匹配,匹配失败将停留为邻居关系**(2Way),仅hello周期保活即可;匹配成功者间将进行邻接关系的建立;

    3.邻接关系间的路由器,将使用DBD/LSR/LSU/LSACK来获取本地未知的所有LSA信息;使得同一区域内所有路由器的数据库完全一致;---- 数据库表;

    4.当本地数据库完成同步后,将数据库-->有向图-->树型结构图-->将本地到达所有未知网段的最短路径加载于本地路由表中;

    5.收敛完成,仅hello包周期保活即可;正常每30min,邻接关系间再进行一次DBD的对比,若一致及正常;若不一致将马上进行同步;

    6.结构突变:触发更新

    断开网段 直连断开网段的设备,直接使用LSU告知邻接,需确认

    新增网段 直连新增网段的设备,直接使用LSU告知邻接,需确认

    无法沟通 hello time 对应的 dead time ;dead time 到时后,断开邻居关系,去除基于该邻接共享的LSA计算所得路由;

    在所有路由器都在初始阶段(down)时,AR1会发送一个HELLO包给AR2,因不知道其他的路由器,发送的信息中只包含自己的地址192.168.0.1,这是AR2会接收到了的hello包,进入init状态,并知道了AR1的地址,也会发送一个hello包,其中包含自己的IP地址192.168.2.0和AR1的地址192.168.1.0发送回去,并双向建立通话(2-way)状态。两个路由器会互相发送消息,AR1给AR2发送的是自己的IP地址192.168.0.1,假定自己是主路由器,AR2也会给AR1发送自己的IP地址192.168.0.2,进行假定自己是主路由器,并进行IP地址比较,建立主从关系(Exstart)。建立主从关系后,进入交换摘要信息(Exchange),AR2给AR1发送DBD报文,里面包含自己的链路状态数据库的描述。AR1也会给AR2发送DBD报文,里面包含自己的链路状态数据库的描述。

    进入loading状态,获取对方的链路状态详细信息,AR1给AR2发送LSR报文,说明自己需要192.168.2.0/24的完整目录。AR2收到后,会通过LSU报文,发送关于网络192.168.2.0/24的目录给AR1.并双方分别进行LSAck确认。结束后,所有路由器进入收敛状态(full)。

    OSPF三张表

    邻居表 主要记录形成邻居关系路由器
    链路状态数据库 记录链路状态信息
    OSPF路由表 通过链路状态数据库得出

    OSPF邻居表

     OSPF链路状态数据库

     

    OSPF路由表

     

     OSPF 5种数据报文

    1、Hello报文------组播收发,用于邻居、邻接关系的发现、建立、周期保活

    hello报文组播发送,hello time为10s或者30s,dead time是hello time 的4倍

    2、DBD包----- 数据库描述包-- 本地LSDB(链路状态数据库)目录

     3、LSR包----- 链路状态请求 -- 用于询问对端本地未知的LSA信息

    4、LSU包----- 链路状态更新 -- 用于共享具体的每一条LSA信息

    5、LSACK包-----链路状态确认 -- 确认包

     LSA--链路状态通告--具体的一条一条 路由或者拓扑信息,不是一种数据包,所有的LSA是使用LSU这种包来转发的;

    OSPF报文格式

    OSPF的数据包是跨层封装于3层报头后方 ,协议号89

    OSPF的状态机 ---8种

    状态机----两台OSPF路由器间不同关系的阶段

    Down: 一旦接收到对端的hello包进入下一个状态

    Attempt:该状态仅对NBMA网络上的邻居有效,表示最近没有从邻居收到信息,但仍需作出进一步的尝试,用以与邻居联系。这时按HelloInterval的间隔向邻居发送Hello包

    Init:初始化 若接收到的hello包中存在本地的RID,那么进入下一个状态机

    2Way:双向通讯 邻居关系建立的标志

    条件:点到点网络直接进入下一个状态机;MA网络进行DR/BDR选举,非DR/BDR之间不能进入下一个状态机;

    Exstart:预启动 使用不携带数据库目录信息的DBD包,进行主从关系的选举,RID数值大为主,优先进入下一个状态机

    Exchange:准交换 使用携带数据库目录信息的DBD包,进行目录共享,需要ACK确认

    Loading:加载 接收到其他邻接的目录信息后,和本地进行比对,若本地存在未知的LSA信息,将使用LSR询问对端,对端使用LSU来更新这些LSA信息,直至双方数据库一致;LSU需要ACK确认;

    Full:转发 标志着邻接关系已经建立;

     

    参考链接:

    https://blog.csdn.net/qq_48345422/article/details/123051175

    https://blog.csdn.net/qq_47855463/article/details/115122239

    https://blog.csdn.net/weixin_46959185/article/details/111475031

    https://blog.csdn.net/weixin_55609813/article/details/115121677

  • 相关阅读:
    FreeRTOS相关转载-(朱工的专栏)
    任务相关的API函数-uxTaskGetSystemState
    STM32用FreeRTOS时任务优先级和中断优先级说明
    STM32标准外设库中USE_STDPERIPH_DRIVER, STM32F10X_MD的含义
    C语言变量和函数命名规范
    Java学习笔记-命令模式
    leetcode-Search in Rotated Sorted Array -java
    Java学习笔记-单件模式
    Java学习笔记-问问题?-->静态方法
    TCP滑动控制
  • 原文地址:https://www.cnblogs.com/longlyseul/p/16260538.html
Copyright © 2020-2023  润新知