一、OSPF的概念
大家都知道,一个大型网络系统中包含了很多路由器,负责进行报文的筛选与转发,而路由器中最核心的概念就是路由表,它充当了报文的导向图作用,告知报文下一步应该怎么走;当网络系统较小时,可以手动配置路由器的静态路由表,但是当路由器数据增多时,特别是涉及到网络中有路由器增加或者删除的情况,每次都需要重新配置路由表,工作量太繁琐,因此引入了OSPF协议,也就是路由器可以动态配置路由表,并且选择最优路由。
OSPF中的基本概念包括:
1) 邻居(Neighbor):宣告OSPF的路由器(也可能是通过quagga软件配置的普通服务器)从所有启动OSPF协议的接口上发 出Hello数据包。如果两台路由器位于同一条数据链路上,并且它们根据互相的hello消息中指定的某些信息(比如id等)协商成功,那么它们就成为了邻居(Neighbor)。
2) 邻接关系(Adjacency):两台邻居路由器之间构成的一条点到点的虚链路,邻接关系的建立是由交换hello信息的路由器类型和网络类型决定的。
3) 链路状态通告(Link State Advertisement,LSA):每一台路由器都会在所有形成邻接关系的邻居之间发送链路状态通告LSA。LSA描述了路由器所有的链路、接口、邻居等信息。ospf定义了许多不同的LSA类型。
4) 链路状态数据库(LSDB):每一台收到来自邻居路由器发出的LSA的路由器都会把这些LSA信息记录在它的LSDB中,并且发送一份LSA的拷贝给该路由器的其他所有邻居。这样当LSA传播到整个区域后,区域内所有的路由器都会形成同样的LSDB。
OSPF基本的工作原理包括:
1) 当这些路由器的LSDB完全相同时,每一台路由器都会以自身为根结点,使用最短路径优先(Shortest Path First,SPF)算法计算一个无环路的拓扑图,这个拓扑图就是SPF算法树。每台路由器都会从自己的SPF算法树中构建出自己的路由表,用于动态选路。
2) 当区域内所有节点的LSDB状态都已同步后,ospf协议将会变的平静下来,邻居之间根据配置固定时间交换hello数据包作为心跳消息,并且每隔30分钟重传一次LSA。如果网络拓扑稳定,那么ospf那将是稳定的。如果网络拓扑发生了变化,比如有节点故障或者新增节点,那么将重新开始交换信息并计算路由。
二、OSPF的基本示例
下面我们基于HCL搭建一个OSPF的基本示例,加深对OSPF概念的理解。
网络拓扑图如下:
如图所示,网络中有3台路由器,2台客户端,现在我们需要使得10.1.1.1的客户端和10.4.1.1的客户端相互ping通。
在实际的网络中,当所有路由器都运行OSPF协议时,会使得LSDB占用大量存储空间,使得运行SPF算法的复杂度增加,CPU负担也会过重。因此OSPF将网络划分成不同的区域,即从逻辑上将路由器划分成不同组,区域的边界是路由器,即一个路由器可以属于不同的区域。图中,我们将路由器A和路由器B划分为区域0,将路由器B和路由器C划分为区域1。
首先我们配置各个路由器的OSPF协议:
路由器A的配置如下:
1) 创建ospf,进入区域0:
2) 加入10.2.1.0/24网段:
network 10.2.1.0 0.0.0.255
这样我们就创建配置好了路由器A的ospf
路由器B的配置如下:
需要创建区域0和区域1,分别包括10.2.1.0/24和10.3.1.0/24网段
路由器C的配置同上
配置好之后,查看路由器B的OSPF邻居:
可见路由器之间已经建立了OSPF连接
由于路由器A和路由器C分别对外连接了10.1.1.0/24和10.4.1.0/24网段,故需要在OSFP中加入直连路由:
import-route direct
现在我们来看下路由器A的OSPF路由表:
可知路由器A已经学习到10.4.1.0/24网段的路由,即下一跳为10.2.1.2,也就是路由器B的接口。
在客户端10.1.1.1上面ping 10.4.1.1,可以ping通:
这样我们通过OSPF协议实现了路由器的自动路由选择,避免了手动配置路由的过程。