前言算法
上一章节介绍了OSPF相比RIP具备无环路、路由收敛速度快、可扩展性好的特色。知识卡片 | 链路状态路由协议OSPF凭什么会取代RIP?数据库
咱们知道路由协议的最终目的是为了计算最优路由加入路由表来指导IP数据包转发,那么OSPF协议是如何经过报文交互生成路由的呢?今天主要根据5种报文和8种邻居状态机给你们介绍下OSPF协议的基本工做原理。网络
正文异步
1 OSPF协议的几个概念ide
Router ID3d
Router ID是一个32位的值,它惟一标识了一个自治系统内的路由器,能够为每台运行OSPF的路由器上能够手动配置一个Router ID,或者指定一个IP地址做为Router ID。blog
若是没有手动配置Router ID,运行OSPF协议的路由器如何选取Router ID?接口
一、若是设备存在多个逻辑接口地址,则路由器使用逻辑接口中最大的IP地址做为Router ID;进程
二、若是没有配置逻辑接口,则路由器使用物理接口的最大IP地址做为Router ID。路由
注意:
一、在为一台运行OSPF的路由器配置新的Router ID后,须要在路由器上经过重置OSPF进程来更新Router ID。
二、一般建议手动配置Router ID,以防止Router ID由于接口地址的变化而改变。
邻居(Neighbor):
OSPF路由器启动后,便会经过OSPF接口向外发送Hello报文用于发现邻居。
收到Hello报文的OSPF路由器会检查报文中所定义的一些参数,若是双方的参数一致,就会彼此造成邻居关系。
邻接(Adjacency):
造成邻居关系的双方不必定都能造成邻接关系,这要根据网络类型而定。
只有当双方成功交换DD报文,并能交换LSA以后,才造成真正意义上的邻接关系。
2 OSPF协议支持的网络类型
OSPF协议支持四种网络类型,分别是点到点网络,广播型网络,NBMA网络和点到多点网络。
一、点到点网络是指只把两台路由器直接相连的网络。一个运行PPP的64K串行线路就是一个点到点网络的例子。
二、广播型网络是指支持两台以上路由器,而且具备广播能力的网络。一个含有三台路由器的以太网就是一个广播型网络的例子。
OSPF能够在不支持广播的多路访问网络上运行,此类网络包括在hub-spoke拓扑上运行的帧中继(FR)和异步传输模式(ATM)网络,这些网络的通讯依赖于虚电路。
OSPF定义了两种支持多路访问的网络类型:非广播多路访问网络(NBMA)和点到多点网络(Point To Multi-Points)。
三、NBMA:在NBMA网络上,OSPF模拟在广播型网络上的操做,可是每一个路由器的邻居须要手动配置。NBMA方式要求网络中的路由器组成全链接。
缺省状况下,OSPF认为帧中继、 ATM的网络类型是NBMA。
四、P2MP:将整个网络当作是一组点到点网络。对于不能组成全链接的网络应当使用点到多点方式。
注意:
现网中遇到的大部分属于点到点网络和广播型网络,由于帧中继、 ATM网络基本已经淘汰了。
3 DR&BDR
为减少广播型网络和NBMA网络中OSPF流量,OSPF会选择一个指定路由器(DR)和一个备份指定路由器(BDR)。
选举DR&BDR的条件:
每个含有至少两个路由器的广播型网络和NBMA网络都有一个DR和BDR。在点到点网络和P2MP不须要选举DR&BDR。
DR&BDR的工做原理
一、当指定了DR后,全部的路由器都与DR创建起邻接关系,DR成为该广播网络上的中心点;
二、BDR在DR发生故障时接管业务,一个广播网络上全部路由器都必须同BDR创建邻接关系。
为何须要选举DR&BDR?
一、DR和BDR能够减小邻接关系的数量,从而减小链路状态信息以及路由信息的交换次数,这样能够节省带宽,下降对路由器处理能力的压力。
二、一个既不是DR也不是BDR的路由器只与DR和BDR造成邻接关系并交换链路状态信息以及路由信息,这样就大大减小了大型广播型网络和NBMA网络中的邻接关系数量。
DR&BDR的选举
在邻居发现完成以后,路由器会根据网段类型进行DR选举。
一、在广播和NBMA网络上,路由器会根据参与选举的每一个接口的优先级进行DR选举。
优先级取值范围为0-255,值越高越优先。缺省状况下,接口优先级为1。若是一个接口优先级为0,那么该接口将不会参与DR或者BDR的选举。
二、若是优先级相同时,则比较Router ID,值越大越优先被选举为DR。
为了给DR作备份,每一个广播和NBMA网络上还要选举一个BDR。BDR也会与网络上全部的路由器创建邻接关系。
为了维护网络上邻接关系的稳定性,若是网络中已经存在DR和BDR,则新添加进该网络的路由器不会成为DR和BDR,无论该路由器的Router Priority是否最大。若是当前DR发生故障,则当前BDR自动成为新的DR,网络中从新选举BDR;若是当前BDR发生故障,则DR不变,从新选举BDR。这种选举机制的目的是为了保持邻接关系的稳定,使拓扑结构的改变对邻接关系的影响尽可能小。
例子:
在没有DR的广播网络上,邻接关系的数量能够根据公式n(n-1)/2计算出,n表明参与OSPF的路由器接口的数量。
如图所示,全部路由器之间有6个邻接关系。本例中使用DR和BDR将邻接关系从6减小到了5,RTA和RTB都只须要同DR和BDR创建邻接关系,RTA和RTB之间创建的是邻居关系。
此例中,邻接关系数量的减小效果并不明显。可是,当网络上部署了大量路由器时,好比100台,那么状况就大不同了。
4 OSPF协议5种报文
OSPF直接运行在IP协议之上,使用IP协议号89。
运行OPSF协议的路由器经过5种报文的交互从邻居状态达到邻接状态,完成LSA的泛洪,使网络的路由器LSDB达到一致,每一个路由器按照本身LSDB根据SPF算法计算路径,生成最优路由加入路由表。
下面咱们一块儿看下这个五种报文类型,每种报文都使用相同的OSPF报文头。
一、Hello报文:
最经常使用的一种报文,用于发现、维护邻居关系。
在广播和NBMA(None-Broadcast Multi-Access)类型的网络中选举指定路由器DR(Designated Router)和备份指定路由器BDR(Backup Designated Router)。
二、DD报文:
两台路由器进行LSDB数据库同步时,用DD报文来描述本身的LSDB。
DD报文的内容包括LSDB中每一条LSA的头部(LSA的头部能够惟一标识一条LSA)。LSA头部只占一条LSA的整个数据量的一小部分,因此,这样就能够减小路由器之间的协议报文流量。
三、LSR报文:
两台路由器互相交换过DD报文以后,知道对端的路由器有哪些LSA是本地LSDB所缺乏的,这时须要发送LSR报文向对方请求缺乏的LSA,LSR只包含了所须要的LSA的摘要信息。
四、LSU报文:用来向对端路由器发送所须要的LSA。
五、LSACK报文:用来对接收到的LSU报文进行确认。
5 OSPF协议8种邻居状态机
运行OPSF协议的路由器经过5种报文的交互从邻居状态达到邻接状态,中间可能会经历如下8种状态:
Down:这是邻居的初始状态,表示没有从邻居收到任何信息。
Attempt:此状态只在NBMA网络上存在,表示没有收到邻居的任何信息,可是已经周期性的向邻居发送报文,发送间隔为HelloInterval。若是RouterDeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。
Init:在此状态下,路由器已经从邻居收到了Hello报文,可是本身不在所收到的Hello报文的邻居列表中,还没有与邻居创建双向通讯关系。
2-Way:在此状态下,双向通讯已经创建,可是没有与邻居创建邻接关系。这是创建邻接关系之前的最高级状态。
ExStart:这是造成邻接关系的第一个步骤,邻居状态变成此状态之后,路由器开始向邻居发送DD报文。主从关系是在此状态下造成的,初始DD序列号也是在此状态下决定的。在此状态下发送的DD报文不包含链路状态描述。
Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地LSDB的内容。
Loading:相互发送LSR报文请求LSA,发送LSU报文通告LSA。
Full:路由器的LSDB已经同步
6 OSPF协议详细工做原理
结合OSPF协议的5种报文和8种邻居状态机来一块儿看下OPSF的工做过程:
一、邻居发现:
运行OSPF协议的路由器会发送Hello报文,用来发现和维持OSPF邻居关系;
Hello报文结构:
Hello报文中的重要字段解释以下:
Network Mask:32比特,发送Hello报文的接口的网络掩码。
HelloInterval:16比特,发送Hello报文的时间间隔,单位为秒。默认是10S。
Options:8比特,标识发送此报文的OSPF路由器所支持的可选功能。
可选项:
E:容许Flood AS-External-LSAs
MC:转发IP组播报文
N/P:处理Type-7 LSAs
Router Priority:8比特,发送Hello报文的接口的Router Priority,用于选举DR和BDR。默认为1。若是设置为0,则路由器不能参与DR或BDR的选举。
RouterDeadInterval:32比特,失效时间。若是在此时间内未收到邻居发来的Hello报文,则认为邻居失效;单位为秒,一般为四倍HelloInterval。默认是40S。
Designated Router:32比特,发送Hello报文的路由器所选举出的DR的IP地址。若是设置为0.0.0.0,表示未选举DR路由器。
Backup Designated Router:32比特,发送Hello报文的路由器所选举出的BDR的IP地址。若是设置为0.0.0.0,表示未选举BDR。
Neighbor:32比特,邻居的Router ID列表,表示本路由器已经从这些邻居收到了合法的Hello报文。
若是路由器发现所接收的合法Hello报文的邻居列表中有本身的Router ID,则认为已经和邻居创建了双向链接,表示邻居关系已经创建。
验证一个接收到的Hello报文是否合法包括:
一、若是接收端口的网络类型是广播型,点到多点或者NBMA,所接收的Hello报文中Network Mask字段必须和接收端口的网络掩码一致,若是接收端口的网络类型为点到点类型或者是虚链接,则不检查Network Mask字段;
二、所接收的Hello报文中Hello Interval字段必须和接收端口的配置一致;
三、所接收的Hello报文中Router Dead Interval字段必须和接收端口的配置一致;
四、所接收的Hello报文中Options字段中的E-bit(表示是否接收外部路由信息)必须和相关区域的配置一致。
二、LSDB数据库同步:
路由器在创建完成邻居关系以后,便开始进行LSDB数据库同步。
路由器使用DD报文来进行主从路由器的选举和数据库摘要信息的交互。DD报文包含LSA的头部信息,用来描述LSDB的摘要信息。
具体过程以下:
主从路由器的选举:
一、邻居状态变为ExStart之后,RTA向RTB发送第一个DD报文,在这个报文中,DD序列号被设置为X(假设),RTA宣告本身为主路由器。
二、RTB也向RTA发送第一个DD报文,在这个报文中,DD序列号被设置为Y(假设)。RTB也宣告本身为主路由器。
因为RTB的Router ID比RTA的大,因此RTB应当为真正的主路由器。
数据库摘要信息的交互:
三、RTA发送一个新的DD报文,在这个新的报文中包含LSDB的摘要信息(LSDB的摘要信息能够类比成一本书的目录),序列号设置为RTB在步骤2里使用的序列号(表示认可RTB为真正的主路由器),所以RTB将邻居状态改变为Exchange。
四、邻居状态变为Exchange之后,RTB发送一个新的DD报文,该报文中包含LSDB的描述信息,DD序列号设为Y+1(上次使用的序列号加1)。
五、即便RTA不须要新的DD报文描述本身的LSDB,可是做为从路由器,RTA须要对主路由器RTB发送的每个DD报文进行确认。因此,RTA向RTB发送一个内容为空的DD报文,序列号为Y+1。
三、创建彻底邻接关系:
六、发送完最后一个DD报文以后,RTA将邻居状态改变为Loading;邻居状态变为Loading以后,RTA开始向RTB发送LSR报文,请求那些在Exchange状态下经过DD报文发现的,并且在本地LSDB中没有的链路状态信息。
RTB收到最后一个DD报文以后,改变状态为Full(假设RTB的LSDB是最新最全的,不须要向RTA请求更新)。
七、RTB收到LSR报文以后,向RTA发送LSU报文,在LSU报文中,包含了那些被请求的链路状态的详细信息。RTA收到LSU报文以后,将邻居状态从Loading改变成Full。
八、RTA向RTB发送LSACK报文,用于对已接收LSA的确认。
此时,RTA和RTB之间的邻居状态变成Full,表示达到彻底邻接状态。