OSPF工作分三步:
1)建立邻居表
2)同步数据库
3)计算路由
建立邻居表用到了一种报文(Hello报文)+三种状态(Down、Init、two-way)来实现邻居的建立和维护。今天主要聊聊第二步:同步数据库
同步数据库
用到DBD、LSR、LSU、LSACK四种报文。
DD报文:数据库描述报文:作用:在邻居之间交互数据库摘要信息所谓的摘要信息就是数据库中LSA头部信息,LSA分为头部信息和链路信息两部分。第一个DBD报文作用是用来:选举主从关系:MS;选举主从关系的作用:保证后续DBD报文,有序且可靠的传输;
LSR:链路状态请求报文,作用:请求自己数据库中没有的,而邻居数据库中有的LSA。数据库的LSA要么是自己生产的,要么从邻居哪里学习来的。
LSU:链路状态更新报文,作用:传递完整的LSA给邻居
LSACK:链路状态确认报文,用来确认收到邻居发送的LSU报文
Exstart状态:
邻居关系建立后双方方会从two-way状态转变成Exstart状态来发送不包含LSA头部信息的DD报文来抢夺Master地位,比较Router-id,哪个大选哪个当Master。报文内重要信息有Seq、I、M、MS四位。因为OSPF是三层协议不能使用四层TCP所以做了类似的确认机制,Seq就是其中隐藏的确认机制,选举为Master的设备每次发包Seq值均要加1,而Slave设备收到数据包都要回复与Master数据包Seq值一致的包进行回复说“老大,我收到了!”,I表示Init位,若为首次发送的DD报文则I=1,否则I=0。M是标识数据包是不是最后一个的数据位,M=1表示“我后面还有!”,M=0表示是最后一个数据包。MS表示主从,MS=1表示Master,MS=0表示Slave。如果Master设备在经过一定时间没有收到Slave的确认报文则会重新传输没有被确认的报文,这种重传机制突出一个可靠。两个设备选出来Master和Slave后进入Exchange状态开始发送真正的带有LSA头部信息的DD报文。
注1:LSA分为头部信息和链路信息,头部信息用于同步数据库,链路信息用于计算路由
注2:数据库就是用来存储LSA的
注3:LSA(链路状态通告)包含拓扑信息和网段信息
注4:拓扑信息指“我是谁,我的邻居是谁,我用我的哪个接口连接我的邻居”
注5:网段信息指自己与邻居连接端口的ip、子网掩码、Cost
Exchange状态
主从设备开始交换自己数据库摘要信息,主设备要每次发包Seq值加1,Slave每次收到数据包都要回复Seq值为Master设备发出的Seq值以此确认接收到,两者数据库大小存在差异,若Slave设备先发完自己的DD报文,则还需要用空的DD报文来回复Master发送的DD报文,反过来也一样。
两者其中一方发完即M=0(其实这时候另一方已经在发空的DD报文“应付中”了),另一方要立即向对方发送LSR报文来请求自己数据库中没有的LSA。其中,只要有一方发完DD报文,另一方状态将立即变更为Loading状态。
Loading状态
这个状态下主从双方会向对方发送LSR报文请求对方数据库中自己没有的LSA条目,双方收到对方的LSR请求报文后,会向对方发送LSU更新报文,这里面包含了LSA的具体的,完全的信息,使对方数据库进入更新状态,双方设备接收到了LSU报文则进入Full完全邻接状态。
Full状态
在这个状态的双发已经建立起互传LSU的通道,达成了可靠、有序、稳定的LSA传输连接,这种状态下只干一件事情--------回复LSACK报文,LSACK是同步数据库过程中的“显式”的确认机制(Seq序列号是隐式的),用来回复对方自己确认收到对方的LSU报文,若对方在一定时间内没有收到LSACK报文则触发重传机制。突出一个可靠!