OSPF 邻居路由器之间之所以要建立邻接关系,是为了相互交换路由信息。在广播网络环境中,并非每台邻居路由器之间都要建立“齐备的” OSPF 邻接关系。OSPF邻居路由器之间会通过 Hello协议(互发 Hello 数据包),来建立和维持邻接关系。
路由器会从所有参与OSPF进程的接口定期外发Hello数据包。当本路由器(的Router-ID)被邻居路由器列入其Hello数据包的邻居路由器字段时,则表明建立起了双向( two-way)通信。在广播和NBMA网络环境中,OSPF路由器之间还会利用Hello数据包来选举DR/BDR。
与邻居路由器建立起 two-way通信(关系)之后,本 OSPF路由器会做出是否与其建立邻接关系的决定。建不建立邻接关系,则要视邻居路由器的状态和 OSPF 网络类型而定。若(用来连接OSPF邻居关系的路由器接口的)OSPF网络类型为 broadcast或nonbroadcast,则OSPF路由器只会跟DR 及 BDR建立邻接关系。而若OSPF网络类型为其他任意类型,则OSPF邻居路由器之间会两两建立起OSPF邻接关系。
完成数据库的同步,是建立OSPF邻接关系的第一步。为此,每台路由器都会互发DBD数据包,包中的内容是对路由器本身所掌握的链路状态数据库信息的简要描述。也就是说,OSPF邻居路由器之间只会交换LSA包头。在数据库的交换过程中,还会发生“主/从”路由器的选举。每台路由器会对自己在 DBD交换过程中收到的LSA包头进行记录。在DBD交换的最后阶段,OSPF路由器会发送LSR数据包,向邻居路由器请求相关LSA,这些LSA的包头则在DBD交换过程中获知。邻居路由器会回复以LSU数据包,其中会包含其所请求的LSA的完整内容。收到LSU数据包之后,OSPF路由器会发送 LSack数据包进行确认。至此,OSPF邻居双方将自己所掌握的数据库信息相互交换完毕,邻接关系也将进入Full状态。
OSPF路由器可与邻居路由器维系多种邻居状态,如下所列:
· Down状态;
· Attempt状态;
· Init状态;
· 2-way状态;
· Exstart状态;
· Exchange状态;
· Loading状态;
· Full状态。
OSPF Down状态
如图所示,R1和R2都运行OSPF。邻居状态显示为Down状态,表明OSPF路由器尚未从邻居路由器收到任何OSPF协议数据包。
OSPF Attempt状态
只有在NBMA网络环境中,才会出现Attempt状态。若一台 OSPF路由器将其邻居路由器显示为Attempt状态,则表示未从该邻居路由器收到任何OSPF协议数据包,但自己已“尽其所能”地(serious effort)“联络”过该邻居路由器。“尽其所能”意谓:此OSPF路由器会定期(按Hello数据包中Hello interval字段所指明的时间值)连续发出Hello数据包,来“联络”邻居路由器。如图所示,R1发出了Hello数据包,表明自己既未发现其他路由器,也不知DR何在。
OSPF Init状态
Init状态表示有一方收到了Hello数据包。如图所示,R1发出了Hello数据包。收到此Hello数据包之后,由于R2在其所含邻居路由器字段中未发现自己的Router-ID,因此邻居双方会步入单向(接收)状态。
OSPF 2-way状态
当OSPF邻居双方都收到了对方发出的Hello数据包之后,就会建立起2-way状态,这也就拉开了OSPF邻接关系建立的序幕。在2-way状态的建立过程中,会选举出了DR和BDR。如图所示,R2所发Hello数据包的邻居路由器字段中包含了R1 的Router-ID,收到此包之后,R1就知道R2已经收到了自己先前发出的Hello数据包。由于R2的Router-ID更高,因此会在此Hello数据包的指定路由器字段中填入自己的Router-ID,表明自己的DR身份。
OSPF Exstart状态
在此状态下,OSPF邻居双方会发起数据库同步过程。此外,还会选举出主/从路由器。为DBD交换所用的第一个序列号也会在Exstart状态下确定。如图所示,R1和R2都发出了自己的第一个DBD数据包。Router-ID最高的路由器被推举成为主路由器。本例,R2的Router-ID更高,故成为主路由器。
OSPF Exchange状态
在Exchange状态下,OSPF邻居双方会互发描述本机所持完整链路状态数据库的DBD数据包。每个DBD数据包都必须明确得到确认。只允许存在一个未经确认的(在途)DBD数据包。在此状态下,OSPF路由器还会发出LSR数据包,来请求新的LSA实例。如图所示为OSPF邻居双方在Exchange状态下的“所作所为”。由下图可知,R1和R2正交换各自的链路状态数据库信息。此外,还可获知R2 将其发出的最后一个DBD数据包中的M位置0(图中最后一个箭头),表明“主”路由器已无更多DBD数据包要发。在此情形, R1(“从”路由器)会发送其余的DD数据包,发完之后,也会顺带在最后一个DD数据包中将M位置0。此时,便标志着OSPF邻居双方已经交换完描述各自链路状态数据库的完整信息了。
OSPF Loading状态
在Loading状态下,OSPF邻居双方会互发LSR数据包,以请求在Exchange状态下(由对方通过DBD数据包通告,但自己)未曾收到的LSA的最新实例。由图可知,R1正处于Loading状态,且已发出LSR数据包,要求R2向其发出某条 LSA的最新实例。
OSPF Full状态
此状态表示OSPF邻居双方已经交换了完整的信息。如图所示,R1和R2已经交换完了各自的链路状态数据库信息,且同处于Full状态。
OSPF是一种链路状态路由协议。OSPF协议数据包分5种—Hello数据包、DBD数据包、链路状态请求数据包、链路状态更新数据包和链路状态确认数据包。在OSPF邻居双方建立邻接关系的过程中,会随邻居关系状态的变迁来发送上述数据包。OSPF LSA的类型也有数种,包括:路由器 LSA、网络 LSA、汇总LSA、ASBR汇总LSA、外部LSA和NSSA LSA 等。OSPF支持多种区域类型,包括普通区域、stub区域、 totally stub区域、 NSSA区域以及totally NSSA区域。可根据网络设计需求来构建上述区域。stub区域受到的限制最多,只能依仗ABR以汇总LSA形式通告的默认路由,来转发目的网络在本区域之外的流量。
OSPF 可在多种介质上运行,包括:多路访问介质、点到点介质、NBMA介质和按需电路。在部分互连的NBMA网络环境中,推荐使用的OSPF网络类型为point-to-multipoint。
当介质不支持多播时,才建议使用 OSPF point-to-multipoint nonbroadcast网络类型。在此情形,不会进行 DR和 BDR的选举。
OSPF邻居双方在建立起邻接关系之前,要经历多个阶段。邻居关系为Full状态则表明邻接关系建立完毕,邻居路由器之间也已交换完了各自的链路状态数据库。广播介质网络环境中,OSPF路由器只会与DR和BDR建立邻接关系,与其他所有邻居路由器维系2-way状态。这是为了简化网络中的 OSPF邻接关系,降低LSA泛洪流量。