第一种为Down,表示了自己既没有收到任何信息也没有对外发送任何信息。这是OSPF建立交互关系的初始化状态,在非广播性的网络环境内,OSPF路由器还可能对处于Down状态的路由器发送Hello数据包。
当自己不停的向对方发送Hello报文时我们称为Attem状态。该状态仅在NBMA环境,例如帧中继、X.25或ATM环境中有效,表示在一定时间内没有接收到某一相邻路由器的信息,但是OSPF路由器仍必须向该相邻路由器发送Hello数据包来保持联系。
当自己收到对方发来的Hello报文时,称为Init状态。这个时候路由器自己并不知道对方是否收到了自己所发送的Hello报文。在该状态时,OSPF路由器已经接收到相邻路由器发送来的Hello数据包,但自身的IP地址并没有出现在该Hello数据包内,也就是说,双方的双向通信还没有建立起来。
当双方都收到了各自发送的Hello报文时我们称之为2-way状态。这个状态可以说是建立交互方式真正的开始步骤。在这个状态,路由器看到自身已经处于相邻路由器的Hello数据包内,双向通信已经建立。指定路由器及备份指定路由器的选择正是在这个状态完成的。在这个状态,OSPF路由器还可以根据其中的一个路由器是否指定路由器或是根据链路是否点对点或虚拟链路来决定是否建立交互关系。当达到2-way这种状态后就表明了双方已经建立了通讯所具备的条件。
接下来便进行LSDB的同步工作,也就是前面讲到的发送前两个DD报文的时候我们称为Exstart状态,实际上这种状态是非常短暂的。这个状态是建立交互状态的第一个步骤。在这个状态,路由器要决定用于数据交换的初始的数据库描述数据包的序列号,以保证路由器得到的永远是最新的链路状态信息。同时,在这个状态路由器还必须决定路由器之间的主备关系,处于主控地位的路由器会向处于备份地位的路由器请求链路状态信息。
在两台路由器协商好MS,开始大量交换DD报文时称之为Exchange状态。在这个状态,路由器向相邻的OSPF路由器发送数据库描述数据包来交换链路状态信息,每一个数据包都有一个数据包序列号。在这个状态,路由器还有可能向相邻路由器发送链路状态请求数据包来请求其相应数据。从这个状态开始,我们说OSPF处于Flood状态。
当交换完DD报文后,两台路由器就知道了哪些报文是自己需要的,哪些报文是自己不需要的,从而开始进行LSA的发送,这时我们称为Loading状态。在loading状态,OSPF路由器会就其发现的相邻路由器的新的链路状态数据及自身的已经过期的数据向相邻路由器提出请求,并等待相邻路由器的回答。
当交换完DD报文后,两台路由器如果发现各自的LSA都相同时则进行Full状态。Full状态表明,对方的LSDB和自己的LSDB是一致的。这是两个OSPF路由器建立交互关系的最后一个状态,在这时,建立起交互关系的路由器之间已经完成了数据库同步的工作,它们的链路状态数据库已经一致。
在上图中,紫色代表的状态是一种稳定的长期存在的状态。而蓝色的代表是一种瞬间的状态。
最后我们在来回忆一下OSPF协议的五种报文。
第一种为Hello报文,用来发现和维持邻居关系,选举DR,BDR。
第二种为DD报文,用来描述本地LSDB的情况,装载所有LSA的Head。
第三种为LSR报文,用来向对端请求本地没有的LSA或更新的LSA。
第四种为LSU报文,用来向对方更新LSA。
第五种为LSAck报文,用来收到更新LSA后的确认。
综上所述,OSPF的主要功能已经实现。任何协议在实现其功能够,接下来的工作就是优化,也就是如何让协议更加完善完美。