OSPF数据包和状态机以及详细的工作过程)
OSPF七种状态机
一、DOWN(失效)
此状态说明还没有发现其他OSPF邻居。
二、init
收到了HELLO(包),但该报文中列出的邻居中没有包含我的router-ID(对方没有收到我发出的hello报文)。
三、2-way(邻居关系建立的标志)
表示双方互相收到了对端发的hello报文,建立了 邻居 关系。在广播和NBMA类型网络中,除与DR/BDR由器之间进入高级状态外(也就是下边这几种状态),其他路由器之间将停留在此状态。
四、EXSTART(预启动,主从关系选举用没有数据库信息的DBD包来选举)
在此状态下,路由器和它的邻居之间通过互相,交换DBD报文(该报文不包含实际的内容,只包含一些标志位)来确定发送时的主从关系。建立主从关系主要是为了保证在后续的DBD报文中交换能够有序的发送。
五、EXCHANGE(准交换,使用携带有数据库信息的DBD包来进行共享和相互学习)
信息交换,路由器开始交换DBD分组这里的DBD中包含了LSA条目的摘要信息等。
六、Loading(加载,看完对方的DBD后,来学习自己没有的,通过LSR-LSU-LSack来获取未知的LSA信息)
信息加载,这个时候双方开始同步数据库信息了,如果发现本端没有的链路状态信息就开始学习,直到同步为止。
七、Full(邻接关系建立)
完全建立连接,建立稳定的 邻接 状态。
OSPF五种类型的数据包
1、HELLO-----周期10S(hello包中包含RID,用于选举)
用于发现和维持邻居关系的数据包;
2、DBD----链路状态数据库描述数据包
对OSPF的网络拓扑进行描述;
数据包在链路状态数据库交换期间产生,作用:
- 选举交换链路状态数据库过程中的主从关系;
- 确定交换链路状态数据库过程中的初始序列号;
- 交换所有的LSA数据包头部。
3、LSR----链路状态请求数据包
用于请求在DBD交换过程中发现本端路由器中没有的或者过期的LSA包;
4、LSU----链路状态更新数据包
用于更新本端链路中没有的LSA信息;
5、LSack----链路状态确认数据包
用于对接受到的LSU进行确认
- 如果发送确认的路由器的状态是DR,确认数据包发送到OSPF的组播地址是224.0.0.5;
- 如果发送确认的路由器的状态不是DR,确认数据包发送到OSPF的组播地址是224.0.0.6;
OSPF工作过程
LSDB(链路状态数据库)将本地的所有的LSA集合在一起。
路由器上ospf协议启动配置完成后,本地收发hello包,该包中存在RID,建立邻居关系;生成邻居表;
邻居表关系建立后,基于条件进行抉择;
-
条件匹配失败,只能维持在邻居关系,仅hello包周期保活;
-
条件匹配成功,可以建立邻接关系;使用DBD包来共享本地的LSDB目录,之后本地基于其他邻接共享过来的DBD,判断本地未知的LSA信息有哪些;
-
再使用LSR向邻接进行查询,邻接返回LSU也来传递具体的LSA信息,同时本地需要ack确认接收;
当本地收到所有的LSA信息后,本地LSDB数据库建立完成生成了数据库表; -
然后本地基于LSDB生成有向图(树型结构图)————>在生成路由表;此时收敛完成,hello包周期保活。每30min周期进行一次DBD包的比对;
结构突变:
- 新增网段:直连新增网段的设备,直接使用LSU将新增网段的LSA信息发送给本地所有的邻接关系;对端确认(需2次);
- 断开网段:直连新增网段的设备,直接使用LSU将新增网段的LSA信息发送给本地所有的邻接关系;对端确认(需2次);
- 无法沟通:hello包照常10s发送,等到dead时间40s到,断开邻居关系,删除从该邻接学习到的信息;
状态机和五种包相互作用的总结:(假设由A、B两台路由器)也好比男女生谈恋爱:
- DOWN ————状态下 A、B互相不认识(男女互不认识)一旦发过hello包(一旦留了联系方式如:VX)就进入下一状态;
- init 初始化————状态下 A、B互发的hello包中有对方的RID(例如:A给B发的hello包中,就有B的RID),A、B就知道自的邻居是谁了(男女互加了好友,并且相互问好);
- two-way ————状态下 A、B建立了邻居关系(男女双方成为普通朋友),看条件匹配是否能够进行接下来的状态(男女双方互相提自己的择偶标准和要求,看对方能否接受——————接受则建立男女朋友的关系,若不接受则只能成为普通朋友,以后见面只是打个招呼)匹配则A、B继续接下来的状态,不接受则就周期hello包保活;
- EXSTART 预启动————状态下 A、B双方发送DBD包(只含有目录无具体的LSA)双方比较RID,选取主从,RID大的为主,先进入下一状态(深入交流,相互了解对方,成为男女朋友);
- EXCHANGE 准交换————状态下 A、B双方发送LSDB(含有DBD包其中有真实的路由条目或拓扑内容)然后对端回复LSack包确认收到了LSDB;(订婚)
- Loading 加载——————状态下 查看完对端邻居的DBD包后,使用LSR/LSU/LSack来获取未知的LSA信息(结婚);
FULL转发——————状态下 邻接(毗邻)关系建立(生子)