我们来看一下OSPF的几个特点:
第一个,对于路由信息的传递和路由计算,它是分离的。
我首先先去传递路由,等待全网的路由都同步了之后,大家所有的路由信息都相同了。那么这个时候,我就会再开始进行计算。
第二个,计算的时候使用的是SPF算法去计算生成树的。
第三个,以“累计链路开销”。
这里的累计链路开销就是我们的带宽作为选路的参考值。
具体到每一个工作过程:
首先,第一步是关于邻居的建立。
对于邻居的建立,两个路由器之间发送一个Hello报文,这个Hello报文就相当于自我的一个介绍,它会介绍我接口的IP地址,接口的区域,OSPF的进程号,以及Router ID等,会介绍一些路由器中OSPF的参数和路由器的链路信息等。
第二步,同步链路状态数据库。
这个链路状态数据库主要是用于存放我们的路由信息,这里要保证本区域中所有链路状态数据库都相同,等于本区域的其他路由器都共享了我的路由信息。
第三,大家的信息都完全一致相同了之后,我才会开始取计算我最优的路径。
最优路径我们使用的是SPF算法去计算的。
接下来我们看一下OSPF的工作原理:
用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个Router ID。
首先第一点是邻居建立的过程,在了解邻居建立的过程中,我们需要去了解一些参数:
第一个参数是关于Router ID,Router ID是用于自治系统内部,唯一标识一台运行OSPF的路由器。
每台运行OSPF的路由器,都有一个Router ID,此时,对于Router ID的配置,我们后面会讲解。
对于Router ID,我们可以去手工配置,系统进程下只要去指定router ID,这里Router ID的格式就是一个IP地址的格式。
eg:我们可以指定一个IP地址是1.1.1.1。
当我指定了1.1.1.1,对于我这个路由器其实并不同于在某一个接口下去配置1.1.1.1,我们可以理解为router-id其实就是一个名称。
但是我们可以配置loopback口和Router-ID相同,这是可以的。在现网环境中、实际项目中我们也是这么做的。
但是理论上来说我们对于这个路由器没有配置任何一个IP地址作为1.1.1.1,也是完全可以的,只是在实际项目中,我们最好把loopback和router-id都配置成相同的,这样更有效的去标识一个路由器。
有的人会说,我配置路由器的时候我没有手工指定router-id,但是我去查看路由器的时候我还是能发现这个router-id是一个IP地址,这时就是有一个选举的过程的:
但是这个时候会发现选举规则并不一样,我现在明明手工指定了Router-ID,为什么我最后去查看的时候我物理接口的IP地址作为了Router-ID呢,这里主要是做了一个稳定大于一切的原则去体现的。
eg:对于OSPF来说,现在管理者手工配置的时候,直接就配置了一个OSPF,然后去宣告了我的物理接口IP地址,可能过了半个小时或者1~2天,突然管理员想到了没有去手工指定Router-ID,这个时候如果再去手工指定的Router-ID,并不能去抢占我现在物理接口的Router-ID。
这个主要是做了一个稳定大于一切的原则。我在最开始配置的时候,只是去宣告了物理接口的IP地址,没有去配置手工指定的Router-ID,然后路由器就会开始去选举了,选举的时候没有手工指定的Router-ID,也没有loopback口作为Router-ID,那么我直接就使用物理的IP地址作为Router-ID。
但是可能过了1~2天,或者十几分钟,管理员想起来了,我再去手工指定一个Router-ID之后,这个Router-ID是默认不生效的,也就不能抢占原来Router-ID的地位。
因为要保证稳定性。
假如说现在两个人之间已经建立起了邻居关系,我这个路由器已经认定了你的接口IP地址作为我的邻居,这个时候如果手工去指定的话,我们可以看到图中现在连接了3个邻居关系,这三个邻居关系就可能会发生变化,路由的一些响应的数据就要更改,那么我在这里对于我们路由的稳定性不是很好。所以就作了一个稳定大于一切的原则。
当然有的时候可能会说我就是想要我手工指定的Router-ID作为路由器的Router-ID不可以吗?
我们可以在用户视图下使用reset ospf process,这个是重启OSPF进程的意思,使用这个命令把整个OSPF重启一下,或者使用reboot把整个路由器重启一下都可以。
这个是Router-ID的一个点。
第二个,关于我们知道如何去标识我们的邻居了,我们来看一下如何去发现和建立邻居。
这里主要用到的是一个Hello报文:
Hello报文的作用主要是邻居发现:
这里可以自动的去发现邻居和路由器。
第二个是邻居的建立:
可以完成Hello报文中的参数协商,来去建立邻居关系。
第三点就是邻居保持:
通过keepalive机制来检查邻居运行的状态。
这里我们针对OSPF,我们发现这个时候关于邻居的建立有两个名词:
它们有什么不一致呢?
邻居关系主要是我从Down状态到接受到对端的Hello报文,知道我的邻居具体的信息,这个时候是2-way状态。
知道我的邻居的具体信息,这个过程我们就称为邻居建立的过程。
邻接建立的过程就是往后了,我们知道邻居的Router-id,接口的IP地址、区域ID等,这只是知道我们的邻居的明细。到后续还需要去学习我们的路由信息。学习完路由信息之后,整体的路由同步之后才是一个邻接关系的建立完成。
我们要注意一点,OSPF的邻居建立并不是代表我们的邻接关系已经建立了,但是反过来我们知道,OSPF的邻接关系建立了,路由已经学习到了,那么就说明邻居关系已经建立完成了。
下面我们可以看到Hello报文在邻居建立过程中的一个顺序:
我们来看一下OSPF邻居关系具体过程:
此时的Hello报文只有我自己的Router-ID,没有邻居的Router-ID是置为null的
比如:
我的认证的参数,以及我的Router-id有没有冲突,我的Hello报文的间隔时间以及死亡间隔时间等。
这个时候对于我们的OSPF来说我们有两种方式去建立邻居:
为什么需要有两个组播地址呢?
这里在最后一块区域讲解DR和BDR的时候我们会讲解,这里我们先记住OSPF支持组播的方式建立邻居关系对于组播来说是【.5】和【.6】。
我们可以看到在RTA上,OSPF进程下指定一个邻居2.2.2.2,即指定对端的Router-id。在这里去建立邻居关系。
讲完了邻居关系建立过程,邻居建立成功之后我们就可以开始去协商我们的链路状态信息了。
对于链路状态信息在OSPF中主要使用4个维度去描述:
链路信息主要包括:
eg:以太网是一种链路类型、PPP链路也是一种链路类型、帧中继链路也是另外一种链路类型了。对于不同的链路类型有对应不同的网络类型来描述。
这个就很好理解了,我要去描述路由的话,我肯定要描述IP地址和掩码。
这里可能会标识我连接邻居路由器的接口IP地址,以及邻居路由器的Router-id来去标识我的邻居。
这里可以看到,如果我们要去描述邻居路由器的话,相当于就是一个拓扑的信息。
可以看到对于OSPF它想去传递路由信息的话,会从以上4个角度去描述,在OSPF我们把它称之为链路状态信息,英文的缩写我们叫做LSA。
这个就称之为我们的链路状态信息,它在这里相当于OSPF的路由信息。