OSPF的包首部
这是OSPF的首部,OSPF中的五个类型的报文都包含这样类型的首部,如图所示,这样的首部其实和很多的IP报文的首部相差不多,版本号,报文类型,报文长度,校验和以及后面的验证类型和验证数据,这些数据在其他的协议中也是十分常见的,也是十分常用的,所以设计者将这些字段设计在每个类型的OSPF的报文首部中,这些字段对于每种类型的OSPF报文来说都是十分必要的,协议版本标识了协商的双方使用的协议版本是否一致,这是十分必要的,长度字段标识数据的长度,校验和用于保证数据的完整性和正确性,而验证类型和验证数据用于保证协商双方是正确的协商双方,对于每一种OSPF报文的交互来说,这些字段都是十分必要的,源router和area区域ID,这些也是十分重要的,源router表示了发送该OSPF报文的route ID。
Hello报文
Hello报文里面主要的信息也是与其功能十分的贴切,首先是子网掩码,如果子网掩码不相同,那么双方的邻居关系将无法正常协商起来,然后就是hello间隔以及邻居的死亡间隔,这两个字段也是邻居协商的重要参数,其实也很好理解只有双方的hello包以及邻居的死亡间隔一致,那么双方的关系维持才会正常,然后就是options中的E位和N位,这两个位置也要相同,这两个标志位意味着双方支持的功能,只有功能一致才能正常协商,然后就是Router priority,这个是路由优先级,路由优先级决定了该路由是否参加OSPF的DR和BDR的选举,而DR和BDR的选举就是通过hello的互相快速交互而选举出来的,在hello报文首部中包含着发送者的router ID,所以这就使得运行OSPF的路由器之间可以互相获取到对端的router ID,所以每个运行OSPF的路由器就可以以此为依据去进行DR和BDR的选举,hello报文的最后两个字段就表明了某个网络中的DR和BDR,其他的路由器也可以以此为参考去修改自己的hello报文中的字段。hello报文的目的地址是组播地址224.0.0.5,这个组播是所有的路由器都可以接收到,而224.0.0.6是只有DR和BDR才能接收到。
DD报文
DD报文中的options暂且不提,但是E位和N位都要相同,它们代表了是否支持外部路由和NSSA区域,然后就是DB Description,这个字段总共有4位,里面有三位,Init位,More位,Master位,其中Init位代表路由器是第一次发送DD报文,More位代表后面还有DD报文要发送,Master位代表路由器认为自己是主导DD同步的路由器,在一开始双方路由器都认为自己是主导DD同步的路由器,然后发送不带LSA头部信息的DD报文,然后根据DD报文中的router ID来决定谁是DD同步的主导路由器,当主导路由器发送DD报文去描述自己的LSA数据库的时候会带有一个序号,那么被主导路由器下次发送DD报文去描述自己的LSA数据库的时候会使用上次主导路由器发送报文时使用的序号,其实DD主从的选举,其实主要功能就是为了DD同步有序,于是最后就形成一种主发送带有序号X的报文,然后从就也使用X序号去发送DD报文来描述自己的LSA,然后比如OSPF的协商某一端是最后发送DD报文的路由器,在该DD报文的More位置0来表示自己后面将不会再次发送DD协商报文,那么对端在已经将所有的DD报文发送出去的情况后,且还收到明确表示对端不会再次发送DD报文,那么它就会回应一个空的DD报文来进行回应,如果是从路由器进行空DD报文回应,那么从路由器就使用上次主使用的序号,如果是主进行空DD报文回应,那么路由器就使用上次序号+1的报文。当双方的LSDB都描述完成后,就不会再去发送DD报文来描述自己的LSDB。
DD报文中LSA摘要信息
DD报文中的摘要信息也是一个十分重要的点,因为就像日常生活的点菜一样,我们一般是拿菜单给别人看,别人要什么就点什么,DD报文也是如此,菜单就是DD报文中的各种摘要信息,双方会比对自己的LSA和别人的LSA的新旧,并决定是否发出LSR请求去更新自己的LSA,即便是”菜单”,里面也要包括LSA的新旧信息,这样对端才会知道这个LSA是否是自己需要的。因为很有可能这个LSA确实是自己有的,但是接收到的LSA可能更新,那么我们就要使用新的LSA。我们使用LS TYPE ,Link State ID以及Advertising Router三个字段来标识一个LSA,使用Sequence Number,Checksum以及LS Age来表示一个LSA的新旧。
LSA的新旧判断
1、先比Seq number,越大越新
2、Seq number相同就比checksum,越大越新
3、checksum如果也相同就看LS Age是否为3600(也就是最大值),如果是就是新的
4、如果上面都不满足就看新接收到的DD报文中的摘要信息中的LS Age与自己对应的LSA的LS Age的差值是否为900,如果大于900就认为是不同,如果小于900就认为相同
LSR报文
在路由器互相交换DD报文来描述自己的LSDB的时候,若路由器接收DD报文后发现有自己需要的LSA,那么它就会发送LSR报文来希望对端发送LSU报文,LSR报文中的内容就是DD报文中承载的LSA摘要信息的一个部分,其实里面包含的内容就是LSA的三个标识字段,LS TYPE,Link State以及Advertising Router这三个标识字段唯一确定一个LSA,因为LSR只是一个请求报文,它只需要标识出自己需要的LSA,所以只要在LSR中使用这三个字段标识出自己需要的LSA即可。
LSU报文
LSU从宏观上看其实并不复杂,因为要回复别人的LSA请求,所以它就在报文中表达了该报文携带的LSA的个数,以及具体的LSA的内容。
LSA Ack报文
这个报文其实主要就是OSPF头部加上LSA的头部,主要是对自己收到并更新的LSA对对端进行回应,如上图所示下面的两个内容就是接收到的LSA的摘要信息。