# 什么是状态机呢 ?
状态机 : 就是 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 : 标志邻接关系的建立