OSPF:Open Shortest Path First
OSPF
路由协议是由IETF组织开发,作为RIP路由协议的替代协议,解决RIP路由协议的固有问题。是IETF组织推荐使用的IGP协议。OSPF路由协议是一种链路状态协议,使用SPF算法进行最佳路由计算。
作为链路状态协议,OSPF协议的主要优点在于路由表的快速收敛,对大型网络的支持以及不易受到错误路由信息的影响。OSPF路由协议其他的的特点如下:
²
使用area的概念,降低协议对CPU和内存的影响,减少路由协议产生的流量,可以构筑分层的网络拓扑结构。
²
完全支持无类别路由处理,消除了有类别路由协议的一些问题,例如不连续子网的问题。
²
支持无类别路由表的检索,支持VLSM,支持Supernetting可以更有效的进行地址管理。
²
支持无大小限制的,任意的metric值。
²
等价负载均衡,可以更有效的利用多路径进行数据传输。
²
使用预留的组播地址,减小对非OSPF设备的影响。
²
支持认证,提供更安全的路由
²
可以对路由进行标记,跟踪外部的路由。
OSPF的操作介绍
第一步:OSPF路由器从启动了OSPF协议的接口向外发送Hello数据包,如果两台路由器共享公共的数据链路,并且Hello数据包中指定的数据参数协商一致,这两个路由器将建立邻居关系成为邻居(Neighbors)。
第二步:建立邻接(Adjacencies)关系。邻接关系是在两个建立了邻居关系的OSPF路由器之间建立的,类似于一条点到点的虚拟链路。两个OSPF路由器必须先建立邻居关系然后才能建立邻接关系。因此在故障排除时可以依次检查相应的数据库列表。OSPF定义了几种网络类型和路由器类型,网络类型和路由器类型也在Hello数据包中传输。邻接关系的建立也需要依据网络类型和路由器类型来建立。
第三步:所有的路由器向所有的建立了邻接关系的路由器上发送LSA数据包。在LSA数据包中,描述了路由器的接口、链路和链路的状态。这些链路可以是到stub网络的链路,可以是到其他OSPF路由器的链路,可以是到位于其他区域的网络的链路,或者是到外部网络的链路。由于网络中存在着多种类型的链路,因此也就存在着多种类型的链路状态信息,因此OSPF也就定义了多种的LSA类型。
第四步:每个路由器从邻居路由器接收到后,将会在链路状态数据库中记录下LSA的内容,并且将LSA的一个拷贝发送给他的其他邻居路由器。
第五步:通过在一个区域内扩散LSA,所有的路由器将会建立统一的链路状态数据库。
第六步:当链路状态数据库建立完成后,每个路由器使用SPF算法计算出一个无环路的图表,这个图表可以用来描述从这个路由器到任意一个已知目的地的最短的路径也就是最小链路开销的路径。这个图表就是SPF树。
第七步:每个路由器利用SPF树来建立自己的路由表。
在一个区域内,当所有的链路状态信息已经被扩散到所有的路由器上以后,我们就可以说链路状态数据库已经被同步了。同时,路由表也已经建立了。Hello数据包在邻居路由器之间进行交换,提供存活(keepalive)数据包的作用。当一台OSPF路由器出现问题时,他的邻居路由器可以通过Hello数据包的交换情况来获知情况。LSA数据包每30分钟会被重新传递一次。
邻居和邻接关系
发送LSA数据包之前,OSPF路由器必须能够发现邻居路由器并且与邻居路由器建立邻接关系。邻居路由器信息会被建立在邻居列表中,同时还记录每个邻居路由器位于的链路或接口信息,以及记录其他维护邻居关系所需的必要信息。
针对OSPF路由器,我们需要一个标记来唯一的标识一个路由器,这个标记就是RouterID。RouterID就是路由器上的一个IP地址。Cisco路由器通过以下的原则来自行确定路由器的RouterID:
²
路由器选择数值最大的Loopback接口的IP地址作为RouterID。
²
如果路由器上没有配置Loopback接口,路由器就选择配置在物理接口上的数值最大的IP地址作为RouterID。这个接口可以不运行OSPF路由协议。
使用与Loopback接口的IP地址具有以下的好处:
²
Loopback接口比物理接口更稳定,当路由器启动后Loopback接口就被启动,只有路由器失败了,Loopback接口才会失败。
²
使用Loopback接口的ip地址作为路由器的RouterID,可以使网络管理员在给OSPF路由器分配一个可预测的或是可确认的RouterID方面,具有更大的自由度。
如果Cisco OSPF路由器使用一个物理接口的IP地址作为路由器的RouterID,那么,即使这个物理接口后来失效了或是被删除了,OSPF路由协议仍然会使用这个物理接口的IP地址作为RouterID来使用。因此,Loopback接口的ip地址作为RouterID所带来的稳定性只是一个附属的优点,使用Loopback接口地址的最大好处是可以控制RouterID。
OSPF路由器通过在Hello数据包中广播自己的RouterID,来启动邻居关系的建立。
Hello协议
Hello协议主要是为了实现以下的目的:
²
Hello协议是OSPF路由协议用来发现邻居路由器的手段和方法。
²
Hello数据包重保护了一些参数,两台路由器如果要形成邻居关系,这些参数必须能够协商成功。
²
在具有邻居关系的路由器之间传输Hello数据包,可以起到传递Keepalives信号的作用。
²
通过Hello数据包的交换,可以用来确认邻居之间双向通讯的情况是否正常没有故障。
²
在广播网络和非广播多点访问网络中,利用Hello数据包进行Designated Router和Backup Designated Router的选举操作。
OSPF路由器从启动了OSPF协议的接口上周期性的发送Hello数据包,这个时钟周期称为“HelloInterval”。“HelloInterval”是基于接口进行配置的,两个接口的“HelloInterval”参数可以不同。
Cisco路由器缺省的HelloInterval值被设置为10秒,可以通过执行ip ospf hello-interval命令来修改这个缺省的参数值。如果一个路由器在一段时间内没有从它的一个邻居路由器处接收到Hello数据包,它就会认为这个邻居路由器已经失效。这个时间段称为RouterDeadInterval。Cisco路由器缺省的RouterDeadInterval值被设置为HelloInterval值的四倍,也就是缺省值为40秒。这个值也可以通过执行ip ospf dead-interval命令来改变。
OSPF路由协议的Hello数据包包含以下信息:
²
生成这个Hello数据包的OSPF路由器的RouterID;
²
生成并发送出这个Hello数据包的OSPF路由器的接口的AreaID、地址掩码、认证类型、认证信息、HelloInterval、RouterDeadInterval;
²
路由器的优先级
²
DR和BDR
²
五个标识重要功能的标志位
²
生成这个Hello数据包的OSPF路由器的所有邻居的RouterID。这个RouterID的列表中只包括从发出这个Hello数据包的路由器接口在RouterDeadInterval时钟到时之前通过Hello数据包中监听到的邻居的RouterID。这一步是邻居路由器建立邻接关系的手段。
路由器在接收到从一个邻居路由器发送过来的Hello数据包后,会查看Hello数据包中承载的一部分信息,包括:AreaID、认证的相关信息、网络掩码、HelloInterval、RouterDeadInterval和选项值。并且会将这些信息与配置在接收到这个Hello数据包的接口上的参数进行比较,如果两者不一致,就会将接收到的Hello数据包丢弃,邻接关系也就不会被建立。如果两者一致,那么这个Hello数据包就是有效的。同时,如果发送这个Hello数据包的邻居路由器的RouterID也已经在这个邻居列表中,并且邻居列表中记录的接口和接收这个Hello数据包的接口相同,那么这个接口的RouterDeadInterval时钟就会被重置,如果邻居列表中没有这个邻居路由器的RouterID,就会增加这个邻居路由器的RouterID记录。
无论何时,路由器在发送Hello数据包时都会将传输这个Hello数据包的链路上的所有的邻居路由器的RouterID的信息包含在这个Hello数据包里。如果一个邻居路由器接收到这个Hello数据包后发现自己的RouterID信息也包含在这个Hello数据包中,那么这个路由器就可以确定一条双向通信链路已经被建立了。一旦双向通信被建立,邻接关系也就可以被建立了。当然并不是所有的邻居路由器之间都可以形成邻接关系。邻居路由器之间是否能够形成邻接关系,也要根据连接这两个邻居路由器的网络的类型来确定。网络类型也会影响OSPF数据包的传输方式。