一、OSPF度量值
OSPF使用Cost(开销)作为路由度量值,所谓开销,亦可理解为成本或者代价,Cost值越小,则路径(路由越优)。首先每一个激活OSPF的接口都拥有一个接口级别的Cost值,这个值等于OSPF带宽参考值/接口带宽,取计算结果的整数部分,当结果小于1时,值取1。以华为AR路由器为例,OSPF带宽参考值缺省为100Mbit/s,这个值是可以人为修改的,但是修改参考值将会直接影响Cost值的计算,从而影响网络中的OSPF网络的优选,因此需格外谨慎。
二、邻接关系
关于OSPF,有两个概念需要特别说明:邻居关系和邻接关系。考虑一种最简单的网络拓扑:两台路由器通过网线直连,在双方互联的接口上激活OSPF,路由器的接口激活OSPF后开始发送及侦听Hello报文,在通过Hello报文发现彼此并确定双向通讯之后,这两者便形成了邻居关系。
但这只是一个开头,一系列的报文交互和邻居状态的切换会在接下来的过程中继续发生,两台路由器会开始交互空的DD报文协商Master/Slave,再交互包含LSA头部的DD报文以便描述自己的LSDB,然后通过LSR及LSU报文交互双方的LSA。当两者的LSDB同步完成之后,两台路由器形成了对网络拓扑的一致认知,并开始独立计算路由。此时,我们称这两台路由器形成了邻接关系。
1.OSPF邻居状态
Down(失效):OSPF邻居状态切换的初始形态。在该状态下,OSPF接口尚未收到邻居发送的Hello报文。
Init(初始):当OSPF路由器收到直连链路上某个邻居发送过来的有效Hello报文,但并未在Hello报文的“邻居”字段中看到自己的Router-ID时,它会将该邻居置为Init状态。这个状态表明,在该直连链路上有一个活跃的OSPF路由器,但是目前两者尚未确认双向通讯。接下来,收到Hello报文的路由器会将对方的Router-ID添加到自己发送的Hello报文中,以便告知对方:“我已经发现你了”。
Attempt(尝试):该状态下只在NBMA类型的接口中出现。在NBMA网络中,OSPF邻居通常是采用手工的方式指定的,此时OSPF路由器往往通过单播的Hello报文与直连设备建立邻居关系。当路由器的NBMA接口激活后,邻居的状态将从Down过渡到Attempt,在该状态下,路由器周期性地向邻居发送Hello报文,但是当前并未从邻居收到有效地Hello报文。当路由器收到邻居发送的Hello报文后(但是没有在该报文的“邻居”字段中看到自己的Router-ID),则将邻居的状态切换为Init。
2-Way(双向通信):当OSPF路由器收到直连链路上某个邻居发送过来的Hello报文并且在该报文的“邻居”字段中发现自己的Router-ID时,它会将该邻居置于2-Way状态,这表明它与邻居确认了双向通信。2-Way状态可以视为OSPF的稳定状态之一,也是建立邻接关系的基础。
ExStart(交换初始):在该状态下,路由器发送空的DD报文以便协商Master/Slave,Router-ID最大的路由器会成为Master路由器,DD序列号就是由Master路由器决定的。用于Master/Slave协商的报文是空的、不携带任何LSA头部的DD报文,在这些报文中,I比特位被设置为1。
Exchange(交换):在该状态下,路由器向邻居发送描述自己LSDB的DD报文,DD报文中包含LSA的头部(而不是完整的LSA数据)。DD报文逐个发送,每个报文中包含着DD序列号,DD序列号是由Master路由器决定的,这个序列号在DD报文的交互过程中被递增,以确保DD报文交互过程的有序性和可靠性。
Loading(加载):在该状态下,路由器向邻居发送LSR以便请求LSA的完整数据。对方使用LSU报文进行回应,因此只有LSU报文里才有LSA的完整信息。在收到LSU报文后,路由器需要发送LSAck对其中的LSA进行确认。
Full(全毗邻):当接口上待请求的LSA列表为空时,表明路由器已经完成了与邻居的LSDB同步,没有再需要请求的LSA了,此时邻居的状态被置为Full。