20世纪80年代末是一个网络“动荡”的年代,越来越多的人们存在越来越大的网络需求,原本的距离矢量路由协议因为最大跳数的限制和本身机制的问题开始逐渐没落。大型民间国际团体IETF开发出新的链路状态路由协议,适用于更加复杂、庞大的网络,至此OSPF出现在人们的视野中。
OSPF的全名叫开放最短路径优先(Open Shortest Path First),具有路由收敛迅速、拓扑无环、支持VLSM(变长子网掩码)、汇总、区域划分等优点。OSPF有一丝侠客的味道,那是因为OSPF是开放的不属于任何厂商或组织。
可惜的是IETF开发OSPF v1时出了岔子(出什么岔子,有典故吗?没有就可以换种说法),幸好IETF及时制止(为什么及时制止?有故事性吗?)在原有的基础上开发了OSPFv2,所以人们都熟知的是OSPFv2,但是不知OSPFv1。
OSPF的v2主要通过Dijkstra的最短路径优先(SPF)算法根据获取所有其他路由器的信息来创建“完整拓扑”。
为何OSPF可以迅速崛起?
OSPF从网络拓扑规划上就保证了无路由环路,内部使用SPF算法也保证了区域内部的无环,并且区域间存在的连接规则也保证了区域间不存在路由环路。

OSPF的成员之间通过通告LSA(链路状态公告)告知邻居的已知的接口IP地址、掩码、开销、网络类型等信息。邻居收到LSA后,会储存在LSDB(链路状态数据库)中,并使用SPF算法进行计算,得出最短路径树,将路径树上的最优路由加入到路由表中。
下面我们来具体了解下,OSPF是如何通告LSA和计算路由的。
OSPF是运行在IP协议上,使用了IP的协议号为89,OSPF有五种协议报文,每一种报文的头部都是相同的。报文分别是:Hello报文、DD报文、LSR报文、LSU报文、LSACK报文。这些(OSPF)报文在不同的网络类型中,有不同的目标地址,后文详述。
Hello报文:用于发现、建立、维护邻居关系。
DD报文:Database Description报文,主要用于携带LSDB的摘要信息,同步(实现按需进行LSDB的同步)两端的LSDB。
LSR报文:Link State Request报文,主要用于请求自身缺少的LSA。
LSU报文:Link State Update报文,主要用于回应LSR请求的LSA的完整信息。
LSACK报文:Link State Acknowledgment报文,主要用于确认收到的LSU(LSA)。
OSPF的每台设备都有自己(自身)的名字(标识)(Router ID—后面简写为RID),最好网络中OSPF路由器没有冲突的RID。RID是一个32位的无符号整数,建议手工配置,如果未手工配置,设备会按所有Loopback接口中地址最大的作为RID,如果没有逻辑接口的存在,则路由器会使用物理接口最大的IP地址来作为RID。
运行OSPF的路由器设备启动后,便会通过宣告了OSPF的接口向外发送Hello报文来发现是否有邻居的存在(动态进行邻居的发现和邻居建立)。
如果有邻居的存在,邻居会检查收到的Hello报文中携带的相关参数,如:版本号、区域ID、RID、认证、掩码、hello time、dead time、Option参数,参数满足条件的情况下认为可以和对方建立邻居关系。具体解释如下:
1. Router id:建立邻居两段的路由器的RID必须不一致(不能冲突)(如果RID一致建立邻居关系,将会导致什么问题)
i. 如果两台路由器直连且RID一致,不能正常建立邻居,(因为主从选举。。。。)如果可以建立建立邻居会导致的问题:无法在exstart状态选举DD报文的主从关系,由于主从关系只能通过RID选举,所以无法选举则不能进行LSDB的摘要信息的交换。
ii. 如果在同一个区域,两台路由器非直连但是RID一致(冲突),可以正常建立邻居关系,但是会出现两台一样的路由器,在通过1LSA计算SPF时就会出现问题。(无法区分产生的1类LSA,导致SPF算法无法构建SPF树)

iii. 如上图所示,两台路由器R1和R2在不同区域但那时RID一致,可以正常建立邻居关系,而且区域内和区域间的路由计算正常,但是当其中一条RID冲突的路由器R2引入直连路由2.2.2.2/32时,由于五类LSA在跨区域传递时不会改变ADV,所以此时另外一台RID冲突的路由器R1就会收到“自己”产生的5LSA。会将其老化时间置为3600s通知删除,但是R2又会不断产生改5LSA,就会引起5LSA的震荡(具体现象在AR3上看到的五类LSA一直为3600s的状态)。这段在描述精确谨慎一些
2. Area-id:建立邻居两段路由器必须在同一区域,area-id必须一致
3. 认证:两段必须保证认证类型和认证数据一致
4. 掩码:在BMA/NBMA要求两段掩码必须一致
5. Hello/d(D)ead时间:两端的时间参数必须一致,英文风格要保持一致,标准单词首字母大写,缩写全部大写,例如 Option , OSPF
6. option:其中重点参考option中的N和E bit位,N/E必须置为(位)相同(N/E主要表示两段路由器在什么杨的区域)
N=1 E=0 : NSSA
N=0 E=1 :普通区域
N=0 E=0 :STUB区域
7. DD报文中的interface MTU两端需要一致(只会影响LSDB的同步,从2-way到full;华为设备默认不比较改参数,可以通过命令配置(配置什么?)

如上图所示:AR1向AR2发送了hello报文,但是此时的AR2邻居状态为INIT,是因为AR1的Hello报文中没有存在AR2的RID,即AR2发现了邻居AR1,但是AR1没有发现AR2的存在。
AR2在发送Hello报文给AR1,携带了AR1的RID,那么此时AR1的状态就会到达2-way状态,而AR2要想到达2-way状态只能等待AR1再次发送Hello报文。(这段建议从邻居状态机切入,直接说状态机有哪些,然后展开init是什么意思,down ,two-way,这样就避免了写的繁琐,读者又能很快get到重点)。
如此,OSPF的邻居状态就算建立完成,但是还是没有进行通告LSA,也就是意味着不能计算路由。如果要通告自己的LSA,那么OSPF需要继续往下建立邻接关系。
在此之前我们先了解下OSPF的设备类型和区域类型
设备、区域的类型:

如上图所示:OSPF的设备类型分为,DR(指定路由器)、BDR(备用指定路由器)、DR-Other(其他指定路由器)、ABR(区域边界路由器)、ASBR(自治系统边界路由器);OSPF的区域类型分为,骨干区域(有区域0组成,有且只有一个)、非骨干区域(其他非0的区域组成,可以存在多个)。
在简单的了解OSPF的设备类型和区域类型后,我们继续建立OSPF的邻接关系。
当链路两端的设备都进入2-way状态后,会进行DR、BDR的选举。该选举是为了减少广播型网络和NBMA网络中建立邻接关系的数量。如果存在DR的情况下,其他DR-Other只会和DR建立邻接关系,DR-Other之间建立邻居关系,但是不会建立邻接关系。
当选举出DR后,网络内的DR-Other和DR开始建立邻接关系,进入下一个状态exstart。在该状态下,两端设备通过交互DD报文,来选举主从关系,该主从关系是为了后续谁先发送LSA的摘要信息。值得一说的就是在Exstart状态下发送的DD报文是空的,里面不携带LSA的摘要信息。
那么主从关系这么重要,是通过什么选举出来的呢?

如上图所示:双方交互的空的DD报文中,会携带自身的RID、序列号等参数,两端通过比较RID来选举主从。RID大的为主(AR2),小的为从(AR1)。主从设备选举完后,设备的状态从Exstart状态变为Exchange状态,从设备(AR1)会使用主设备(AR2)的序列号,发送携带摘要信息的DD报文。
如果AR2从AR1发送的摘要信息中发现存在本身没有的LSA信息,则会向AR1发送LSR报文请求该LSA,此时状态由exchange变为loading状态。AR1收到AR2的LSR请求报文,便会回复一个LSU报文携带AR2要请求的LSA明细信息。AR2收到LSU报文同步完成后进入FULL状态,并且向AR1发送LSAck报文表示确定收到了LSU报文且同步完成,AR1也会进入FULL状态。该LSAck报文,就是因为OSPF是基于IP的,IP没有确认机制,所以OSPF需要设置自身的确认机制。
以上就是OSPF的邻居状态机,下面我们来了解下OSPF的网络类型和每种网络类型OSPF报文的区别。
OSPF支持BMA、P2P、NBMA、P2MP四种网络类型:
点到点P2P类型:当链路层协议是PPP、 HDLC时,缺省情况下,OSPF认为网络类型是P2P。在该类型的网络中,以组播形式(224.0.0.5)发送协议报文(Hello报文、 DD报文、 LSR报文、LSU报文、 LSAck报文)。
点到多点P2MP 类型(Point-to-Multipoint):没有一种链路层协议会被缺省的认为是Point-to-Multipoint 类型。点到多点必须是由其他的网络类型强制更改的。常用做法是将非全连通的NBMA改为点到多点的网络。在该类型的网络中以组播形式(224.0.0.5)发送Hello报文,以单播形式发送其他协议报文(DD报文、 LSR报文、 LSU报文、 LSAck报文)。
NBMA类型(Non-broadcast multiple access):当链路层协议是ATM或FR时,缺省情况下,OSPF认为网络类型是NBMA。在该类型的网络中,以单播形式发送协议报文(Hello报文、 DD报文、 LSR报文、 LSU报文、 LSAck报文)。
广播类型(Broadcast):当链路层协议是Ethernet、 FDDI时,缺省情况下,OSPF认为网络类型是Broadcast。在该类型的网络中,通常以组播形式发送Hello报文、 LSU报文和LSAck报文,以单播形式发送DD报文和LSR报文。
其中,224.0.0.5的组播地址为OSPF路由器的预留IP组播地址;224.0.0.6的组播地址为OSPF DR的预留IP组播地址。
今天我们就介绍到这里,下期我们来了解更加详细的OSPF各类LSA。



