20世纪80年代末是一个网络技术飞速发展的年代,越来越多的人们存在越来越大的网络需求,原本的距离矢量路由协议因为最大跳数的限制和本身机制的问题开始逐渐没落。
IETF(国际互联网工程任务组)一个公开性质的国际组织,开发出新的链路状态路由协议,适用于更加复杂、庞大的网络,至此OSPF出现在人们的视野中。
OSPF的全名叫开放最短路径优先(Open Shortest Path First),具有路由收敛迅速、拓扑无环、支持VLSM(变长子网掩码)、汇总、区域划分等优点。OSPF有一丝侠客的味道,那是因为OSPF是开放的不属于任何厂商或组织。
1987年IETF OSPF工作小组成立着手开发OSPF,OSPF的第一个版本OSPFv1是一种实验性的路由协议,只是当做实验特殊用途,并未获得实施。1991年OSPFv2发布,1998年OSPFv2得到规范。所以人们都熟知的是OSPFv2,但是不知OSPFv1。OSPFv2主要通过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的同步。
LSR报文:Link State Request报文,主要用于请求自身缺少的LSA。
LSU报文:Link State Update报文,主要用于回应LSR请求的LSA的完整信息。
LSACK报文:Link State Acknowledgment报文,主要用于确认收到的LSA。
OSPF的每台设备都有自身的标识(Router ID—后面简写为RID),规划网络设备时最好避免出现相同的RID。RID是一个32位的无符号整数,建议手工配置,如果未手工配置,设备会按所有逻辑接口中地址最大的作为RID,如果没有逻辑接口的存在,则路由器会使用物理接口最大的IP地址来作为RID。
运行OSPF的路由器设备启动后,便会通过宣告了OSPF的接口向外发送Hello报文动态的进行邻居发现和邻居建立。如果有邻居的存在,邻居会检查收到的Hello报文中携带的相关参数,如:版本号、区域ID、RID、认证、掩码、hello time、dead time、Option参数,参数满足条件的情况下认为可以和对方建立邻居关系。
具体解释如下:
1. Router id:建立邻居两端的路由器的RID不能冲突(如果RID一致建立邻居关系,将会导致什么问题)
① 如果两台路由器直连且RID一致,不能正常建立邻居
如果可以正常建立邻居会导致的问题:无法在exstart状态选举DD报文的主从关系,由于主从关系只能通过RID选举,所以无法选举则不能进行LSDB的摘要信息的交换。
②如上图所示,在同一个区域,两台路由器非直连但是RID冲突。AR1、AR3和AR2邻居可以正常建立,但是AR2的LSDB中只会存在一条RID为1.1.1.1通告的LSA,并且该1类LSA在不断的更新——1类LSA的震荡(即AR1会更新AR3通告的1类LSA,AR3也会更新AR1通告的1类LSA),这样就会导致AR2无法构建SPF树。
③ 如上图所示,两台路由器在不同区域但是RID冲突,AR1、AR2可以和AR3正常建立邻居,当其中一台RID冲突的路由器R2引入直连路由2.2.2.2/32成为ASBR时,由于五类LSA在区域间泛洪时不会改变ADV,所以此时另外一台RID冲突的路由器R1就会收到“自己”产生的五类LSA。由于AR1不是ASBR,即认为该五类LSA需要进行撤销,便会将其老化时间置为3600s通知AR3、AR2删除,但是R2又会不断引入外部路由产生五类LSA进行通告,此时的现象就是五类LSA的震荡(具体现象在AR3上看到的五类LSA一直为3600s的状态)。
2. Area-id:建立邻居两段路由器必须在同一区域,area-id必须一致
3. 认证:两段必须保证认证类型和认证数据一致
4. 掩码:在BMA/NBMA要求两段掩码必须一致
5. Hello/Dead时间:两端的时间参数必须一致
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;华为设备默认不比较该参数,可以通过在接口下配置ospf mtu-enable命令使能检查邻居DD报文所携带的MTU是否超过本端的MTU值)
以上了解了OSPF的Hello报文,下面介绍OSPF的状态机:
如上图所示,OSPF一共有8种状态机,分别是:Down、Attempt、Init、Two-way、Exstart、Exchange、Loading、Full。
Down状态:表示是邻居的初始状态,没有在规定时间内收到邻居的Hello报文。
Attempt状态:该状态只在NBMA网络中出现。
Init状态:表示收到了Hello报文,但是Hello报文中没有包含自己的RID。
Two-way状态:表示收到了Hello报文,且Hello报文中包含了自己的RID。
Exstart状态:表示开始进行主从关系的协商。
Exchange状态:表示主从关系已经确定,并开始交换DD报文。
Loading状态:表示正在进行LSA的交互。
Full状态:表示LSR重传列表为空。
下面我们具体来解释每一种状态:
如上图所示: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报文。
如此,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/BDR的选举规则:首先比较路由器的优先级,优先级值越大越优,默认数值为1,当优先级值为0时表示不参与DR/BDR的选举;如果优先级一致,则比较路由器的RID,越大越优先。
当选举出DR后,网络内的DR-Other和DR开始建立邻接关系,进入下一个状态exstart。在该状态下,两端设备通过交互DD报文,来选举主从关系,该主从关系是为了判断后续发送DD报文的序列号以谁为准。值得一说的就是在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。
网友评论