目录
目录
2.2.5 DR把数据库“泛洪”给其他设备,如何“泛洪”的呢?(针对P2P和P2MP网络)
一、OSPF简介
OSPF(open shortest path first,开放式最短路径优先)是一种基于网络层的动态路由协议,属于IGP协议,用于生成路由表。
二、OSPF的工作过程
1、建立邻居
2、同步数据库
3、计算路由
2.1 建立邻居
2.1.1 router-id
说到“建立邻居”,我们必须先了解一个东西——“router-id”。router-id相当于OSPF设备的一个标识,每台使能了OSPF的设备都拥有一个router-id,并且全局唯一。
router-id的产生方式有两种,一是手工配置(最优),二是自动选举。手工配置需要配置为IPV4地址的格式,可配置范围为0.0.0.1~255.255.255.255。自动选举的选举规则为,先选自身配置的最大的loopback口地址,次选自身配置的最大的接口IP地址。但实际上,设备会选择自身配置的第一个IP地址作为router-id。当设备配置了第一个IP地址后,这个地址会作为设备全局的router-id,所以假如后期未手工指定协议的router-id,就默认使用该地址作为协议的router-id。
2.1.2 hello报文
hello报文是OSPF的一种报文,用于发现OSPF邻居、建立OSPF邻居以及维持邻居关系。通过向外发送hello报文来发现邻居;通过交互hello报文来建立邻居;通过周期性的发hello报文来维持邻居,默认10s/次(40s的死亡时间)。在broadcast网络中,hello报文的目的地址为224.0.0.5。
2.1.3 状态机(OSPF建立邻居的过程)
状态机用于标识协议的工作过程,以及具体进行到了哪个步骤。此处讲的是OSPF建立邻居的过程所涉及到的几个状态。
OSPF建立邻居的过程:
“down”状态:当设备没有邻居的时候,则认为它处于“down”状态(也称为空状态)。
“init”状态:当设备收到了对方发送的hello报文,但该hello报文的neighbor字段中没有自己的router-id时,进入“init”状态(也称为1-way)。此时表示自己发现了邻居,但是邻居还没有发现自己。
“2-way”状态:当设备收到了对方发送的hello报文,且该hello报文的neighbor字段中有自己的router-id时,进入“2-way”状态。此时表示自己发现了邻居,且邻居也发现了自己。
当建立邻居的双方都处于2-way状态时,表示邻居关系建立完毕。
2.2 同步LSDB
每台OSPF设备都拥有一张“链路状态数据库”(link state database,简称LSDB)。LSDB中存储的是路由信息以及拓扑信息,所以设备之间同步LSDB就是同步路由信息和拓扑信息。在同步了LSDB后,设备就可以根据这些信息来计算出最优的路径,同时可以避免出现环路。
2.2.1 DR
在讲“同步数据库”之前,我们先说一下LSDB的交互。假设一个广播域中有四台OSPF路由器,那么他们之间需要交互12次LSDB,才能完成数据库的同步,如下图所示。假设有五台OSPF路由器,那么需要交互20次LSDB。总之,假设有n台OSPF路由器,则需要交互n(n-1)次。可以发现,随着路由器数量的增加,交互次数会猛增,而交互的次数越多,同步数据库所花费的时间也就越多,同时也消耗了更多的带宽资源。
所以,为了减少LSDB的交互次数,一个广播域中的设备在建立好邻居之后,同步LSDB之前,会选举出一台“指定路由器”(designated router,简称DR)。同时也会选举一台“备份指定路由器”(backup designated router,简称BDR),顾名思义,就是作为DR的备份。而其他没有被选举为DR/BDR的设备,就称作DR other。(注意:一个广播域中选举一台DR/BDR,可以没有BDR,但必须有DR,否则无法同步LSDB)
DR的选举规则:先选优先级大的,优先级相同的话就选router-id大的。每台设备的dr-priority默认为1,如果优先级为0,则不参与选举。DR优先级的可配置范围为0~255,而且是基于接口配置的。还有一点需要注意,在选出DR/BDR后,不能进行抢占,意思就是在选出了DR/BDR后,如果又来了一台更优的设备,那么它也无法立即抢占,成为DR/BDR,只有等后期DR/BDR挂掉了,它才有机会替补上去。
DR的选举范围:在一个广播域中选举一个DR,因为交互数据库的时候是在一个广播域中交互的。而且前面我们说了hello报文的目的IP为224.0.0.5,这是一个预留的组播地址,专门给OSPF协议使用,只在一个广播域内有效,说明建立OSPF邻居关系的范围的也是在一个广播域内建立的,无法跨网段建立。因为路由器的每个接口属于不同的广播域,所以它可能A接口是DR,但B接口不是DR。
DR的选举时间:40s
在选举完DR/BDR后,所有DR other设备都需要和DR、BDR交互LSDB(DR和BDR之间也会交互LSDB)。在不同类型的网络中,DD报文的发送方式是不一样的,在P2P和P2MP网络中DD报文是组播发送,在broadcast和NBMA网络中DD报文是单播发送。DD报文只会在建立邻接关系的过程中发送,后面如果数据库有变化,会直接发送LSU报文来做更新,不会再次发DD报文。
选举DR/BDR之后交互LSDB的规则:交互LSDB是other和DR之间交互、other和BDR之间也会交互(other需要发送LSDB给BDR,是为了防止DR挂了的情况,到时候BDR可以不用再次收集LSDB就拥有完整的数据库,从而可以顶替DR的工作),other和other之间不会交互。正因为other和other之间不会交互LSDB,不会继续进行后面的同步LSDB的过程,进而状态机也不会发生迁移,所以other与other之间会一直停留在2-way状态。
2.2.2 DD报文
设备之间交互LSDB是通过DD报文来进行交互的。通过将链路状态数据库的摘要信息(可以理解为LSDB的目录)封装在DD报文中发送给邻居,从而实现LSDB的交互。所以DD报文的作用是描述LSDB。
DD报文中有三个标志位,分别是I位、M位、M/S位。双方发送的第一个DD报文,这三个位其实刚开始都会置1。
I位(initialization):表示第一个DD报文,如果置位,则表示该DD报文是用于选举主从的。
M位(more):表示后面有更多的DD报文。如果不置位,则表示这是最后一个DD报文。
M/S位(master/slave):表示主/从,如果置位,则表示自己是主。所以刚开始的时候,双方不知道谁是主,都认为自己是主。
2.2.3 状态机(OSPF同步LSDB的过程)
此处讲的是OSPF同步LSDB的过程所涉及到的几个状态。
OSPF同步LSDB的过程(以other和DR之间同步数据库为例):
exstart状态:选举完DR/BDR后进入exstart状态。exstart状态下会选举主从,最开始的两个DD报文(也就是R1和R2发送的第一个DD报文,也称为first DD)就是用于选举主从的(前两个DD报文是不含有摘要信息的“空DD报文”,它不起描述作用)。
选举主从的规则:选择router-id大的一方为主。
选举主从的目的:确定序列号。设备发出的第一个DD报文的序列号是随机产生的(上图中的X和Y是随机值)。选出主从后,“主”使用多少序列号,“从”就使用多少序列号,“从”跟着主走,“从”不会主动增加序列号。
序列号的作用:确保DD报文有序交互。因为每个DD报文都有一个序列号,且DD报文的序列号是有序增加的,从而通过序列号可以得知DD报文是否发生了丢包。假设从这次收到的是一个序列号为2000的DD报文,然后下次收到的是一个序列号为2002的DD报文,那么从根据序列号就可以判断出序列号为2001的DD报文发生了丢包。注意:设备发送的第一个DD报文的序列号是随机产生的。
exchange状态:交互有链路状态摘要信息的DD报文。(“从”发送第一个有摘要信息的DD报文)
loading状态:双方的数据库描述信息交互完后,进入loading状态。(当双方发送的DD报文的M位都为0后,表示两边的DD报文都发完了,于是两边进行loading状态。)
full状态:收到LSACK报文后,进入full状态,表示数据库同步完成(设备的数据库是完全一致的才叫“同步”),数据库同步完成后就开始计算路由了。full状态也表示OSPF邻接关系建立成功。(当双方全部确认完后,就进入full状态)
2.2.4 LSR报文、LSU报文、LSACK报文
LSR报文(link state request):链路状态请求,用于请求LSDB。
LSU报文(link state update):链路状态更新,用于更新LSDB,真正携带详细的数据库信息的是LSU报文。详细的数据库信息指的是LSA。LSA中有路由信息和拓扑信息。
LSACK报文(link state acknowledgement):链路状态确认,用于确认LSU。
注意:并不是一定要进入loading状态才可以发LSR、LSU、LSACK。进入loading状态的标志是收到M位=0的DD报文,而LSR、LSU、LSACK在exchange状态下就可以发送了。因为在exchange状态下双方会交互DD报文,然后就会知道自己缺少哪些信息,知道了缺哪些信息就可以立马发LSR来请求自己缺少的信息,不用等对方描述完后再来发请求,当对端收到LSR后,就会立马回复LSU。
2.2.5 把数据库“泛洪”给其他设备,如何“泛洪”的呢?(针对P2P和P2MP网络)
我们知道OSPF属于网络层协议,那么OSPF报文发送出去的时候也必定会封装源IP(发送该OSPF报文的接口的IP地址)、目的IP。DD报文属于OSPF报文的其中一种,它的目的IP为224.0.0.5或224.0.0.6。(224.0.0.5和224.0.0.6这两个组播地址属于预留的组播地址(也叫永久组地址),只能用于局域网中,是路由器不会转发的地址,是专门提供给OSPF协议使用的。)
当报文的目的IP为224.0.0.5时,表示所有使能了OSPF的设备都能接收该报文。
当报文的目的IP为224.0.0.6时,表示只有DR和BDR能接收该报文。
我们前面谈到了:other要把自己的LSDB发给DR和BDR,但其实other不用分别给DR和BDR发送一份LSDB,只要目的IP为224.0.0.6(组播地址),那么只需要发送一份LSDB,DR和BDR就都可以收到该LSDB了,但其他other不会接收。所以other只需要发一份LSDB,就可以同时发给DR和BDR了。
当所有设备都把自己的LSDB发给DR、BDR后,DR和BDR就拥有了所有的数据库(完整的数据库),此时DR、BDR再往外发送一份目的IP为224.0.0.5的LSDB,那么所有的设备就都可以收到了。设备收到了这份DR发送的完整的LSDB后,与自身的LSDB进行对比,如果有自身缺少的LSA,就通过与DR交互LSR、LSU、LSACK报文,来完善自身的LSDB。最后实现所有设备LSDB的同步。(其实邻居关系是两台设备之间去建立的,所以并不存在DR发出去一个DD报文,所有设备都根据这个DD报文来请求自己缺少的信息。而且DD报文只有在P2P和P2MP网络中是组播发送)
三、计算路由
OSPF根据LSDB中的信息来计算路由。OSPF是一种链路状态协议,LSDB中存放的是链路状态信息(包括接口带宽、cost、邻居、网段等信息。接口带宽、cost、邻居这类信息可以理解为拓扑信息,网段信息可以理解为路由信息),所以在同步数据库的时候就会把这些信息都传递给邻居。
设备利用拓扑信息来“画出拓扑”,画出拓扑后再计算路由,这样就很清晰明了,也不会触环。就像我们平时去一个地方,总会看地图,然后选择最短的线路,先到哪里,再到哪里,这样也不会迷路。画拓扑以及计算路由的具体方法会在后面的文章中讲。
这里先说两点:
1、在OSPF域中不同的路由器只会拓扑信息有所差别,但是路由信息是一样的。
2、一台路由器只会有本区域的拓扑信息,但是有整个OSPF域的路由信息。
四、OSPF相关的部分概念
4.1区域
OSPF的区域分为骨干区域和非骨干区域。骨干区域就是指的area 0,非骨干区域分为普通区域和特殊区域。特殊区域有四种,分别是stub区域、totally-stub区域、nssa区域、totally-nssa区域。
区域的划分可以减小数据库的大小。
4.2 网络类型
4.2.1 四种网络类型的简单介绍
OSPF有四种网络类型,分别是广播型网络(broadcast)、点对点网络(P2P)、非广播多路访问网络(NBMA)、点对多点网络(P2MP)。
broadcast:假如设备之间使用以太网链路互联(如G口、F口、E口),那么默认就是广播型网络。
P2P:假如设备之间使用广域网链路互联(如serial口、pos口),那么默认就是点对点网络。
NBMA:假如设备之间使用帧中继交换机(FRSW)互联,那么默认就是非广播多路访问网络。
P2MP:一般情况下是不会出现的,但是在某些特殊情况下需要将NBMA网络改造为P2MP网络。
但是目前,帧中继交换机已经很少见了,所以NBMA网络和P2MP网络也就很少出现了。
4.2.2 OSPF四种网络类型的差别
hello时间 | dead时间 | 是否需要选择DR | |
broadcast | 10s | 40s | 需要 |
p2p | 10s | 40s | 不需要 |
NBMA | 30s | 120s | 需要 |
P2MP | 30s | 120s | 不需要 |
通过上面的表格,我们可以发现OSPF的dead时间是hello时间的4倍。
为什么P2P网络中不需要选举DR呢?因为在P2P网络中,设备之间通过串口线直接相连(无中间设备),所以只有两台设备,就不需要选DR,因为2台设备之间选DR并不会减少数据库的交互次数,而且选DR还会浪费时间。双方到了2-way之后不用等40s来选DR,直接进入exstart、exchange、full状态。
4.2.3 NBMA网络场景
如图所示,上面三台路由器之间通过帧中继交换机互联,FRSW和我们普通的交换机不太一样,这个需要配置DLCI号,让交换机之间互通。假设我们配置的让R1和R2之间可以通信,R1和R3之间可以通信,R2和R3之间不能通信。
这种情况下,它是可以多路访问的(R1可以访问到R2和R3),但是它是非广播的(因为R3发送一个广播包出去,R2是收不到的),所以叫不支持广播的多路访问——NBMA。在NBMA网络中,必须要选DR,在上面这种场景下,就必须保证R1成为DR,因为2、3之间不能交互数据库,他们只能和R1交互数据库。
4.2.4 P2MP网络场景
什么时候需要手动强制将NBMA网络改成P2MP网络?
假如我们配置的让R1和R2之间可以通信,R1和R3之间可以通信,R3和R4之间可以通信,其他两两之间不能通信。因为上图原本是一个帧中继网络,所以默认情况下是NBMA,但NBMA有个问题,就是默认要选DR。但是上面这种情况(1、2通;1、3通;3、4通)不能让它选DR。因为如果选DR,假如让R1选为DR,因为1和2之间可以通信,1和3之间可以通信,但1和4之间不能通信,所以这时1和4之间的数据库交互就会出现问题,所以R1不能作为DR。同理,R2、R3、R4也是不能作为DR的。所以上面这种场景,如果是NBMA网络的话,谁做DR都不合适,但NBMA网络又必须选DR,所以不能是NBMA网络。所以只能强制将上面这种网络改为P2MP。
改成P2MP后,R1可以和R2建立邻居,可以和R3建立邻居,这样一个点可以和多个点建立邻居,叫点对多点。R3可以和R1建立邻居,也可以和R4建立邻居,也是一个点可以和多个点建立邻居,叫点对多点。只有这样,才能完成R1、R2、R3、R4之间数据库的同步。所以综上所述,上面这种情况只能强制改为点对多点(P2MP)。
4.3 进程
OSPF的进程只在本地有意义,进程号的作用是隔离数据库。如果在一台设备上启用了两个进程,那么这两个进程的LSDB是相互隔离的,互不影响。而且对于一台设备而言,不同的进程相当于不同的路由协议,路由表也是隔离的。
如上图所示,即使R1和R2的进程号不同,但是R1和R2之间还是可以建立邻居的,因为hello报文中是不携带进程号的。
4.4 设备类型
- 区域内路由器(Internal Router):该类设备的所有接口都属于同一个OSPF区域。
- 区域边界路由器ABR(Area Border Router):该类路由器可以同时属于两个以上的区域,但其中一个接口必须在骨干区域。ABR用来连接骨干区域和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。
- 骨干路由器(Backbone Router):该类路由器至少有一个接口属于骨干区域。所有的ABR和位于Area0的内部路由器都是骨干路由器。
- 自治系统边界路由器ASBR(AS Boundary Router):与其他AS交换路由信息的路由器称为ASBR。ASBR并不一定位于AS的边界,它可能是区域内路由器,也可能是ABR。只要一台OSPF路由器引入了外部路由的信息,它就成为ASBR。