一、OSPF的5包7状态
数据包
Hello:发现、建立邻居(邻接)关系、维持、周期保活;存在全网唯一的RID,使用IP地址表示
DBD:本地的数据库的目录(摘要),LSDB的目录(所有LSA的集合)
LSR:基于DBD包中的未知信息进行查询
LSU:携带了真正的LSA信息(链路状态通告),用于答复对端的LSR
LSack:对传递LSA信息进行确认,链路状态确认
状态:
Down:一旦启动后发出hello包,则立即进入下一状态
Init(初始化):若收到了携带了自己的RID的hello包,则和对方一起进入下一状态
Two-way(双向通信):邻居关系建立(DR/BDR选举),此时进行条件匹配,若成功,RID大的优先进入下一状态;若失败,则保持邻居关系,hello包10s周期保活即可
Exstart(预启动):使用类hello的DBD进行主从选举,RID大的优先进入下一状态
Exchange(准交换):使用真正的DBD包进行数据库目录交换共享
Loading(加载):使用LSR/LSU/LSack来获取未知的LSA信息
Full(转发):邻接关系建立的标志
二、抓包数据分析
1、发送hello到组播确认邻居是否存在。
每10秒一次验证邻居是否存在
2、两设备之间对比RID值
r1告诉r2说我的rid值小,我应该是主导设备
在r1发送时r2也在发送,R2告诉r1说我的rid值小,我应该是主导设备
对比DD值后,r1发现r2的值更小,根据越小越优的原理,r2为主导设备。r1发现自己不是最优时,发送no来否决自己的macter的yes,并将自己的DD值改为r2的值来确认地位
R2会再发一次DBD,将M设置为0,告诉R1没有DD要发送了。且DD-seq会在原基础上+1,因为是新的DD-seq,所以R1会在发来一个用于确认的报文
3、Loading::使用LSR/LSU/LSACK获取未知的LSA信息
建立邻居关系后,r1向r2发送LSR(Link State Request)主动请求未知的LSA信息。
当r2的LSU响应LSR请求(被动发送)信息后,主动向r1发送带着目录的报文返回传输具体的LSA内容(单条或多条),补充接收方的链路状态数据库。确保网络拓扑变化能被快速传播到整个OSPF域(泛洪机制)
当r1和r2以上步骤完成后,lsack在r1上主动确认收到LSU报文,收到后必须发送确认信息至r2。
至此邻居关系建立完毕,数据开始正常传输。LSA泛洪同步拓扑信息 以及 多区域划分优化收敛,动态确定传输链路的最优先路径。
总结:
Hello包用于发现邻居、建立双向通信关系,LSR、LSU、LSack包则用于数据库同步和链路状态确认。OSPF通过LSA泛洪机制快速传播网络拓扑变化,确保整个OSPF域内的链路状态数据库同步,从而动态确定传输链路的最优先路径。