我们知道RIP协议最多只能允许15跳,且完全根据跳数距离来选择最佳路径,不考虑带宽,这是不符合现代网络标准的。
所以我们介绍另外一种动态路由路由协议-OSPF。
一、自治系统
OSPF属于内部网关路由协议,所谓内部网关路由协议是指工作在企业内网中的协议,更准确的说是用于单一自治系统内的协议。
什么是自治系统(Autonomous System )AS:一些路由器工作在同一个范围内,路由器之间可以相互通信且运行相同的路由协议,遵从相同的选路规则和依据,那么我们就称这些路由器工作在同一个自治系统内部。
如下图所示,分别是两个自治系统。
从而我们可以知道,所谓的外部网关协议,其实就是用来连接不同的AS的。
二、OSPF协议概念
OSPF协议在一定程度上可以说是为了解决RIP的问题所产生的协议。所以OSPF协议没有跳数的限制(即没有路由个数限制),可以工作在大型网络中。
但是路由器太多也不是特别好的事情,如果都在一个网络区域中,那么一个路由器故障,就可能引发整个网络故障,我们称这种故障为单点故障。
为了解决单点故障问题,OSPF协议中引入区域的概念,OSPF在AS内划分多个区域。如下图所示,四个路由器都在一个AS内,我们把一个AS划分成三个区域,每个区域中分别有两个路由器。任何一个区域内的变化是不会立即影响到别的区域的。
另外,OSPF协议规定每一个区域内的路由器不超过255个,但是可以有n多个区域,所以说OSPF协议没有路由器个数限制。
但是如果说区域1的变化不会影响其他区域,那么如果区域1中的路由器新增了一个10.1.1.0网段,这个信息不告诉其他区域,那么区域2和区域0不就没办法和10.1.1.0这个网段通信了吗?所以我们说一个区域内路由条目的变化不是说不影响别的区域,而是它会被中间这台路由器以汇总的形式告诉别的区域。所以中间这台路由器很重要,它的一个接口连在区域1中,另一个接口连在区域0中,我们称这样的路由器为区域边界路由器ABR(area border router)。所有接口都在一个区域内的路由器称为内部路由器。
ABR一个很重要的作用就是在两个不同的区域之间传递汇总的消息。因为传递的是汇总消息,所以引起的变化就没有那么剧烈了。
在AS所有的区域中,区域0是最重要的,区域0被称为骨干区域,所有接口都在区域0中的路由器可以称为内部路由器,也可以称为骨干路由器。除了区域0之外,别的区域都被称为非骨干区域。任何一个非骨干区域都必须和骨干区域直连。
OSPF协议总结如下:
三、OSPF工作原理
OSPF协议是标准的链路状态路由协议。
如下图所示,最开始的时候RTA只知道自己接口的网段,它的路由表中只有自己直连的10 20 30网段。
对于链路状态路由协议,我们知道路由器会向自己的邻居相互交互自己的路由信息,在经过几个更新之后,每个路由器都会拥有一张完整的网络拓扑结构图。
在OSPF当中,要求每个路由器必须得有个名,这个名就是 router ID
Router ID
交换机有BID的概念,那么每台路由器也有它的ID,区别在于路由器的ID其实是一个IP地址。每台路由器都会拥有一个独立且唯一的RID
router怎么选取自己的RID呢?
它有一个规则
1、若路由器上配置了环回(loopback)接口,则环回接口的地址就是该路由器的RID
环回接口是一个虚拟接口,一般有2个用途
一个是可以用来给路由器命名,在为路由器命名时,一般配置为32位的子网掩码。
另一个作用是用来模拟一个网段,或者模拟一个具体的主机地址,用来测试网络的连通性。
2、路由器上可以配置多个环回接口,如果路由器上有多个环回接口时,那么谁的IP数值最高,谁就是RID
3、如果没有环回接口,就在所有物理端口中选取一个数值最高的IP地址。
我们知道运行RIP协议的路由器内部维护一张路由表,而运行OSPF路由协议的路由器内部要维护三张表。
这三张表分别是:
1、邻接关系表
列出每台路由器全部已经建立邻接关系的邻居路由器。所以邻接关系表里保存的是邻居路由器的RID。
2、链路状态数据库
列出网络中其他路由器的信息,由此显示全网的网络拓扑结构。
3、路由表
列出通过SPF算法计算出的到达每个相连网络的最佳路径。
邻接接关系表中保存的是邻居的路由器ID,链路状态数据库中保存的是最全的路径,路由表中保存的是最佳的路径。 这三张表的关系不是独立的,他们之间有非常紧密的关系。有了第一个表才能得到第二个表,有了第二个表才能得到第三个表。
四、OSPF协议如何在邻居路由器之间建立邻接关系
这其中一共用到了7种状态和5种报文。
如下图所示。RTA和RTB都处于down状态,down状态表明两个人谁也不认识谁,可以理解为OSPF还没配好。
假设RTA的OSPF先配好了,于是RTA先给B发送了hello报文,相当于A给B打了个招呼说你好我是路由器A,在A给B发送的hello报文中包含了RTA自己的名字,RTB在收到hello报文之后将自己的状态变成了init状态。
然后B也会给A返回一个hello报文,里边包含了B的名字。A收到B的hello报文之后,也将自己的状态变为init状态。然后A在给B发送一个hello报文,里边包含了B的名字,相当于说你好我知道了你的名字是B。
此时B看到A的hello报文之中包含自己的名字,B会认为A肯定已经知道它的存在了。然后B将自己的状态转变为2-way双向状态。同时B也会给A发送第二个hello报文,里边包含了A的名字。A在收到这个报文之后也将自己的状态转为2-way双向状态。
然后A会向B发送DBD数据库描述报文,该报文中是空的,啥也没有,B在收到这个空的报文之后将自己的状态转为exstart准启动状态。同时B也给A发送一个空的DBD数据库描述报文,A收到之后也将自己的状态转为exstart准启动状态。A和B发送空的DBD数据库描述报文的目的是为了协商主从关系,谁的路由器ID数值更大,谁就是主路由器。确保主从关系的目的是为了确认下一个包谁先给谁发,对于OSPF来讲,永远都是主先给从发。
假设A是主路由器,A会先给B发送第二个DBD报文,这个报文不在是空的,里边包含RTA直连网段的汇总信息,B在收到这个信息之后会将自己的状态从准启动状态转变为准交换状态,从这个状态开始B知道了它要准备开始和A交换路由信息了。同时B也会给A发送第二个DBD报文,里边包含RTB直连网段的汇总信息,A在收到这个信息之后会将自己的状态从准启动状态转变为准交换状态。到这为止,相对于两个人互换了目录。
然后A会给B发送链路状态请求报文LSR,B在收到这个报文之后会给A回复链路状态更新报文LSU,A每收到一个更新,就会给B回复一个LSACK确认报文,确认我收到了你的更新。A在学习B的所有路由的时候,A的状态处在loading加载状态。B也会给A发送链路状态请求报文LSR,A在收到这个报文之后会给B回复链路状态更新报文LSU,同样B每收到一个更新,就会给A回复一个LSACK确认报文,确认我收到了你的更新。B在学习A的所有路由的时候,B的状态也处在loading加载状态。
最终当A学完了B的路由,B也学完了A的路由,A和B都进入full全毗邻状态,全毗邻状态表明两个路由器已经彻底的完成了邻接关系的建立。
OSPF邻接关系需要满足的条件
那么是不是任意两个OSPF路由器都能建立邻接关系呢?当然不是,它需要满足一定的条件才可以。
1、路由器必须在同一个区域中,OSPF不允许跨区域建立邻接关系
2、路由器相连的两个端口上必须配置相同的密钥,或者不配置
3、OSPF协议需要两个邻居路由器的hello和dead时间间隔相同,否则就不能成为邻居路由器
五、OSPF中的DR和BDR
如下图所示,ABCDE五个路由器连接在一个交换机上,每两个路由器之间都想建立连接保证通讯,但是这样会存在建立的邻接关系过多的问题,比如下图中需要建立10个邻接关系。这种方式非常繁琐,不可取。
此时OSPF会用选班长的方式解决这个问题。比如我们把D选为班长,也就是指定路由器DR,让其他的路由器只和班长建立邻接关系,而无需他们彼此之间建立邻接关系,从而大大降低了要建立邻接关系的数量。
但是如果班长今天请假没来怎么办呢?即指定路由器挂了怎么办?这时候我们还需要选出一个班副来,即备份指定路由器BDR。这时候我们就有了班长和班副。其他的路由器只和班长和班副即DR和BDR建立邻接关系。
那么DR和BDR是怎么选择出来的呢?所有运行OSPF的路由器都有一个OSPF优先级,优先级最高的路由器会被选举为DR,如果OSPF优先级相同,则具有最高RID的路由器会被选为DR。优先级的取值范围为0-255,且默认值都为1。数值第二高的就被选为BDR。如果DR和BDR都挂了,那么会在剩下的路由器中重新选举。
六、OSPF的度量方法
RIP根据跳数选择最佳路径,OSPF根据什么选择最佳路径呢?
OSPF会选择带宽最大的路径作为最佳链路,根据值是cost值,cost=10的8次方/带宽,所以带宽越大cost值越小,cost值最小的会被选为最佳路径。一条链路上的所有cost值之和就是该链路的总cost值。如果两台链路带宽cost值完全一样,那么这两条路都会传输数据,因为OSPF支持等价负载均衡。
七、OSPF何时使用
网络规模:网络中的路由器个数在10台以上,中等或大规模的网络部署
网络拓扑结构:网络拓扑结构为网网状,并且任意两台路由器之间都有互通的功能。
其他特殊需求:要求路由变化时能够快速收敛,要求路由协议自身的网络开销尽量降低
对路由器自身的要求:对路由器自身的CPU和内存性能要求较高,配置低的路由器不建议配置OSPF
八、OSPF特点
OSPF和RIP的比较