• 动态路由协议 OSPF 工作过程 之 状态机维度


    状态机  

                 #   什么是状态机呢 ?

                      状态机  : 就是 OSPF 路由间的邻居关系所在的不同阶段

                      不同的关系 就是 不同的状态机

    OSPF 的状态机  :

                       #   我们用 思科 的PPT 来介绍 OSPF 的状态机 

                        

                          里面所有黄颜色方框里 标定的就是 状态机 

                             有 :  Down State,     Init  State        Two-Way  State  

                         #  有两台路由器 A,B 。

                             最一开始,就谁还不认识谁,互相不认识( 此时的状态就是 Down State

                           

                             A 先发了消息( 可以看到,是以组播的形式--- 224.0.0.5 ) 发了一个 Hello 包

                             包里的内容是  我是 172.16.5.1 ( RID )并且 我谁都不认识 !!

                             目的就是,当别人收到自己的 Hello 包,能和自己联系下,交个朋友 !!

                           

                              A,一发完 Hello 包后,它的状态就不一样了,就发生变化了 :

                             从 Down State变为了 Init State   

                             接着, B 给 A 回了个 Hello 包,包里是 : 我是 172.16.5.2 并且我见过 172.16.5.1

                             这几说明,B 之前认识我( A ),

                             那 A 收到了 B 的 Hello 包,A 就知道了 B 是谁了 ( 是 172.16.5.2 ) 

                             那意味着什么呢 ??

                                   ===>>>

                                          意味着  A 认识了 B ,  B 也认识了 A ( 即 相互认识了 )

                             这时,互相认识了,状态就又变化了,从陌生人变为了 相互认识

                             互相认识的状态就为 Two-Way State (  双向通讯 )

                             双向通讯就 标志着 邻居关系的建立 

                            

                              :   我们当时在学习 RIP 协议时,也提过 邻居关系,是说 只要是相邻的两个路

                                        由器,并且能够正常通讯就能被称为 邻居关系 !

                                        而在 OSPF 里,所谓的邻居关系是不太一样的不是仅仅相邻正常通讯就可

                                        以的,是需要建立的,两个都需要相互收到对方的 Hello 包达到 Two-Way

                                       状态才可以被称为 邻居关系的建立!!

                                        所以,这也是前面在介绍 数据包类型的时候 说 HELLO 包的作用 : 发现和

                                        建立邻居关系!!! 

                                        整个建立 邻居关系的过程就是 使用 HELLO 包,建立方法也很简单就是 发

                                        送自己的  RID , 对方收到后,也会发送给你它自己的RID ,只要你发现

                                        对方发的 HELLO 包里有自己的 RID 这不就说明它收到过你的RID ,这不就

                                        相互认识达到 Two-Way State 状态!!

            #    那现在邻居关系已经建立了,那关系(状态机)想要更进一步的发展,肯定也是不容易的

                  是需要经过筛选的,是需要经过 条件匹配的!! 

                  那条件匹配肯定也就意味着  要么成功要么失败,

                  若成功就进入下一个状态!

                  要失败,就维持邻居关系( 依靠 HELLO 包 进行 10 S 一次的周期保活!! )

                  具体的 条件匹配是怎样的条件 现在先不透漏,后面会讲!!

          

                  假设,现在条件匹配成功,那就进入下一个状态 :

                  

                     当条件匹配成功后便来到了 Exstart State 状态机 ( 预启动 状态

                     这个时候 A 给 B 发了 DBD 包 ,包里说 : 他(A) 要进入下一个状态,因为它的RID

                     是172.16.5.1 , 而 B 收到 A 发的 DBD 包后,再给 A 回了 DBD 包,说 : 不行,我得

                     先进入下一个状态,因为我的 RID 更大 ( B 的 RID 是 172.16.5.2 )

                     

                     这时的 预启动 状态 好像是 :

                                    A  和  B  在争抢谁能先进入下一个状态 

                                    A 和 B 在比谁的 RID 大,谁的 RID 大就能进入到下一个状态 !!              

                                   

                                   那我们就很好奇,那就不能携手一起进入下一个状态嘛?? 非得争??

                      那我们就一起先看看下一个状态是要干嘛 ?

                      ===>>>

                              Exstart State  预启动 的下一个状态是 Exchange State   

                              B 给 A 发了一个 DBD 包 ,包里说 :这是我的 LSDB 

                              LSDB  :  链路状态数据库    ( 是存放链路信息的)     

                             B 给 A 发 DBD 包,传输了 B 自己的 链路信息摘要 !!  

                            而后, A 给 B 发了 DBD 包 传输的也是 A 自己的 链路信息摘要 !!   

                     那现在,我们了解了 Exchange State准交换 这个状态是干嘛的,那现在就能解释

                    上面的问题了

                    问题 :  为什么 在上一个状态 ( Exstart State )   A   和 B 是争着 进入下一个状态

                                         为什么 A 和 B 不能一起进入下一个状态,而是错开进入的 ??

                            ====>>>

                                          其实,也很简单,它们错开进入下一个状态,也是为了避免同一时间里,

                                          数据占用资源量过大  ----   这也是 为了减少更新量过大的措施 !!

                                          因为, OSPF 里最大的问题不也就是 占用资源量过大嘛~!!

                                          和我们 前面讲的 同步周期 还是异步周期 是一个道理,为什么选择异步周

                                           期呢? 就是为了 避免同一时间 占用资源量过大从而导致 网络瘫痪嘛!!

                       也就是说  Exstart State  预启动 )这个状态就是做一件事儿,就是看谁先进入下一

                       个状态; 方法也很直接就是看 谁的 RID 更大!!!  

                        我们就把  Exstart State  预启动 )这个状态干的活叫做 --- 主从关系选举

                       通过 RID 来判断,谁大谁为主,谁就能先进入 下一个状态 --- Exchange State

                       

                       那此时就有一个小问题了 :

                       那既然我们 Exstart  State 就只是为了通过 RID 来看 谁能够进入下一个状态,而上面

                       展示的时候是使用的 DBD 包来进行的主从关系选举 ( 本质上就是 RID 比大小),

                       那既然只是为了 RID 比大小,那 HELLO 包 不也可以嘛,HELLO 包也可以携带 RID

                       那为啥要用 DBD 包, 而不用 HELLO 包呢 ??

                       ===>>>

                                        其实,只是为了 和 邻居关系进行一个区分, 没错,你 HELLO 包是可以携

                                        带 RID , 也能起到  Exstart  State 状态的作用,但是,此时我们的关系已经

                                        更进一步了,我们已经不是 邻居关系了,形象的讲,关系更近一步了,我

                                        们就不用 HELLO 包了,HELLO 包显得关系没有那么亲切!!

                                        我们用 DBD 包就可以和上一阶段的关系进行区分~!!!

                          Exchange State准交换)状态,

                                    发送了携带数据的 DBD 包,携带的是链路状态信息摘要

                                    

                        

                          刚才   Exchange State 准交换状态 )  发送了 DBD 包后,收到的那一方则 给回

                          个  LSACK 包,来以示确认 ~!!

                           然后,就进入到了  Loading State ( 加载状态 ) , 此状态,  A 向 B 发了 LSR

                           包,包里说 : 我需要 172.16.6.0 / 24 这个网段的信息 !!

                            B 收到 A 发的 LSR 包后( 知道这是 A 的请求),B 就知道了,这是 A 向自己要

                            6.0 网段的信息;  那么, B 就会给  A 回一个 LSU包,包里即是 6.0 网段 的信息

                            A 收到 B 发的 LSU 包后,就会给 B 再回个 LSACK包 来确认 ~!!  

                            也就是说 :  Loading State加载状态 主要就是进行  具体的链路信息 交换 

                            当 具体的链路信息 交换完成后,就来到了  Full State Full 状态 )

                           

                            Full 状态 就标志着 邻接关系 的建立  !!

                            邻接关系 ( 真正意义上的能够 进行 数据传输的关系 )

                            

                         #    那什么叫邻接关系?  为什么不继续接着 邻居关系 称呼呢 ?

                                ===>>>

                                           最主要就是恰恰为了 邻居关系 进行区分!!

                                           

                                           之前的 邻居关系 只能通过 HELLO 包进行保活 ,邻居之间是不能进行 具

                                           体数据的交换的,而  只有邻接关系之间才能进行 LSA 的数据交换 !!

                            

                          #   介绍 OSPF 的状态机,一共有 7 个状态机 : 

                                      down 状态,      Init 状态,   Two-Way  状态 ,  exstart 状态,

                                      exchange 状态          loading 状态          Full 状态

                                 

                                   总结下这 7 个状态机

                                    down : 当启动 OSPF ,便开始发送  HELLO 包,发送后即进入下一个状

                                                   态,进入 Init 初始化 状态 

                                    Init    :     收到的  HELLO 包中 只要包含了 本地的 RID 信息,则进入下一个

                                                    状态,进入 Two-way ( 双向通信 ) 状态 !

                                                  ( 就是 A 收到了 B 的 HELLO 包, 包里面有 A 的名字 - 即 RID

                             Two - way :    标志着邻居关系的建立; 就是我们互相认识了!

                                                     要想进入下一个状态则需要进行   条件匹配 

                                                     

                                                     若匹配失败,就仅需要 使用 HELLO 进行 10 S 一次周期保活邻居

                                                     关系。

                                                     匹配成功则进入下一个状态 ,进入 Exstart  预启动 状态

                              Exstart  :     使用未携带数据的 DBD 包进行 主从关系选举

                                                   RID 大的为主,则优先进入下一个状态  Exchange ( 准交换 ) 状态 

                             

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

                                                      ACK 确认后,进入 Loading 加载状态 

                                  Loading  :    通过对比 DBD 包 和 本地数据库中的信息,基于本地未知的LSA

                                                       信息( 就是 本地没有的 信息 ) 发送 LSR 请求,对端收到后,使

                                                       用  LSU 包回复 ( 回复的就是 你本地没有的 那些信息 ),

                                                       收到LSU 包后,回个 ACK 来确认! 

                                                       ACK 确认后,进入 FULL 状态 

                                          Full  :   标志邻接关系的建立  

  • 相关阅读:
    dreamweaver作业静态HTML网页设计模板——迪士尼影视电影(6页)带音乐
    解决谷歌Redux DevTools调试React+Typescript项目数据对不上/连接不上问题
    整理37个超牛逼的Python库,用过一半算你牛
    力扣题解8/10
    Slipper —— 虚点,最短路
    密码学系列之:使用openssl检测网站是否支持ocsp
    redis集群的搭建
    Java+SpringBoot+Vue自习室预约系统全栈开发
    如何解决机器视觉高速图像处理软件的加密需求?
    Tkinter常用功能示例(一)
  • 原文地址:https://blog.csdn.net/m0_56332061/article/details/127906327