OSPFv3路由协议学习
OSPFv3 VS OSPFv2
OSPF是一种链路状态路由协议。它具有标准开放、收敛迅速、无环路、便于层级化设计等众多优点。IPv4网络中广泛使用的OSPFv2协议由于在报文内容、运行机制等方面与IPv4地址联系得过于紧密,大大制约了它的可扩展性和适应性。在IPv6环境中,为了使OSPF更好的应用,同时保留原有的众多优点,因此,在OSPFv2的基础上作了多方面的修改后产生了OSPFv3协议。
OSPFv3相比OSPFv2作出的改进可以分为几个方面来描述。
1.OSPFv3独立于网络协议
1) OSPFv3基于链路运行
OSPFv2协议是基于子网运行的,邻居之间形成邻接关系的必要条件之一就是两端的IP地址属于同一网段而且掩码相同。而OSPFv3协议基于链路运行,与具体的IPv6地址、前缀分离开,即使同一链路上的不同节点具有不同网段的IPv6地址时,协议也可以正常运行。IPV6网络中,将接口地址都看成叶子,只有链路本身是树干。
2)编址性语义的取消
在OSPFv2中,协议分组和LSA中的许多字段都是来自于网络上的某个IP地址、掩码或某个IP子网号。报文的数据内容决定了OSPFv2的多种机制必须基于IPv4来进行,包括邻居路由器标识、邻居建立等等。
在OSPFv3中取消了这些编址性语义,而只保留协议运行必须的核心内容。比如,Router-LSA和Network-LSA中不再包含网络地址,而只用于传递拓扑信息;LSA的Link State ID依然保留32位长度的IPv4地址格式,但只是一个编号,不再包含地址信息;邻居路由器,包括DR和BDR,都是用Router ID来标识。这些保证了OSPFv3协议能够独立于网络协议运行。
3)链路本地地址的使用
OSPFv2协议要求,每一个运行OSPF的接口都必须有一个IPv4地址,即使是在网络中仅仅用于传输转发的中间节点也必须如此,协议的运行和路由的计算都依赖于这个地址。而在IPv6中,每个接口都会分配本地链路地址(link-local address),这个地址只在本地链路有效,并不会在整个网络中传播。OSPFv3使用这个本地链路地址作为协议分组发送的源地址(虚连接除外)和路由的下一跳,在网络规划时就不需要在大量的中间节点规划子网,同样也不需要专门配置IPv6地址。这样,一方面可以节省大量的全局地址,另一方面可以说协议的运行独立于IPv6,可以方便的对协议进行扩展,实现组播选路等其他的功能。
4)使用专门的LSA来发布路由前缀信息
OSPFv2通过Router-LSA和Network-LSA来发布区域内的路由信息和计算拓扑,所以OSPFv2的拓扑结构与IPv4网络信息是密不可分的。为了改变这种状况,在OSPFv3中,Router-LSA和Network-LSA中仅保留拓扑信息;同时增加了Intra-Area-Prefix-LSA和Link-LSA,分别用于传递区域内路由前缀和传递链路范围内的IPv6前缀。拓扑信息与前缀信息的分离,使得OSPFv3的运行更加独立于网络协议。
2. OSPFv3的结构更加清晰
1) OSPFv3取消了协议报文的验证字段
在OSPFv2中使用了专门的验证字段。而在OSPFv3中使用IPv6标准的验证方式(IP AH和IP ESP)来保证信息传递的安全性,这样一来,既减轻了协议开销,也在一定程度上简化了协议处理流程。
2) OSPFv3更加明确了LSA泛洪范围
在OSPFv3中,明确了LSA泛洪的三种范围:本地链路范围(Link-local scope)、区域范围(Area scope)、AS范围(AS scope),并且在LS_Type中增加了专门的字段进行说明。因此,OSPFv3协议在处理LSA泛洪时不再像OSPFv2中需要根据不同的LSA类型来判断LSA泛洪的范围,而是直接根据专门的字段进行处理就可以了。
3. OSPFv3的可扩展性和适应性更佳
1) OSPFv3支持多实例
OSPFv2协议规定,不同的实例必须运行在不同的链路上。OSPFv3协议则提供了对多实例的明确支持,通过在协议报文中增加“instance ID”字段,同时规定,接收报文时对该字段进行判断,只有实例号匹配的报文才会处理,否则丢弃。这样,即使是在同一链路上也可以运行多个OSPF实例了,而且独立运行不会互相影响。
2)对未知类型LSA的处理
在OSPFv2中,当路由器收到自己不支持的LSA时,仅仅是作简单的丢弃处理。这样,当能力不同的路由器混合组网时,整个网络的处理能力就会受限于能力最低的路由器。最为突出的是在广播(或NBMA)网络中,如果DR不支持可选类型的LSA,则DR不能处理的LSA就不能在非DR路由器之间交互了。
在OSPFv3中,对未知类型的LSA的处理作了新的规定:根据LSA中特定字段来进行判断,可以将其泛洪范围限定在本地链路范围内,也可以将其当作已知类型的LSA,根据其中的“泛洪范围”字段发送出去。这样一来,即使网络中某些路由器的能力有限也不会影响某些特殊LSA的传播,从而具备了更好的适应性。
4.其他
OSPFv3针对OSPFv2在设计上的缺陷做了两大改进:
一是在多路访问型的链路上优化了DR的选举范围,如果链路上有过多的路由器,都同DR形成邻接,则DR的负担会很重。OSPFv3采用独有的实例ID字段,在群内各接口设置相同的实例ID,群间相异,配置起来简单。
二是通过设计两种新的LSA(8和9),减少了不必要的SPF计算。SPF算法的特点是每一次启用都会增加路由器资源占用并造成网络的短时中断,所有的树干都必须重计算一次,算完了才能挂叶子。OSPFv2和OSPFv3在收到LSA1和2时都会启动SPF算法,在OSPFv3的LSA1和2中不仅包含了该链路的拓扑类型状态还附带了链路上IPV4地址信息,拓扑改变或地址改变都会触动路由器产生新的LSA,但真正需要SPF的是拓扑变化信息,地址的改变不应该去触动SPF(地址只是叶子)。OSPFv3的LSA1和2中不携带链路上的IPV6地址信息,改变链路上端口的地址不会触动SPF,这也就减少了计算次数。
OSPFV3引入的LSA
OSPFv3常用的LSA有八种类型:路由器LSA(LSA1)、网络LSA(LSA2)、区间前缀LSA(LSA3)、区间路由器LSA(LSA4)、AS外部LSA(LSA5)、NSSA外部LSA(LSA7)、链路LSA(LSA8)、区内前缀LSA(LSA9),以上LSA除LSA8和9外,功能和洪泛的范围都与OSPFv2相同。不同的只是LSA数据结构上做了少量调整和优化(如前所述LSA1和2的数据结构区别最大,也导致了两种新LSA的产生)。
OSPFv3添加了2类新LSA:Link-LSA(类型8)和Intra-Area-Prefix-LSA(类型9)。其中,Link-LSA有三个作用:
1. 在链路上通告本地链路地址给其它邻居
2. 通告本地链路上的邻居关于与自己本地链路相关联的ipv6的前缀列表
3. 通告链路状态的选项集合
其实这个链路范围是以路由器为边界的,但是可能一个链路上有多个路由器,因此可能会存在多个前缀一个链路的情况,这个时候就是特点2的体现了,用于区分不同的链路,IPV6里一个链路就是一个小网段,比站点小,站点比组织小,组织比国家小。
LSA8主要携带生成者在该端口上的所有IPV6地址信息,洪泛范围是链路本地,及收到直连邻居发出的LSA8将不通告给任何人。
当然,只在本地链路上传递信息是不够的,还需要在area范围内传播,于是有了Intra-Area-Prefix-LSA(域内前缀LSA)。Intra-Area-Prefix-LSA是在area范围内通告路由前缀。
LSA9携带的是本路由器(或DR的手下)各直连链路上的网络前缀和各前缀所属链路的对应(前缀在哪条链路上)信息,它的洪泛范围是本AREA内。
OSPFv3也使用组播方式洪泛LSA,非DR用FF02::5,DR用FF02::6。