文档库 最新最全的文档下载
当前位置:文档库 › OSPF 路由协议概述

OSPF 路由协议概述

OSPF路由协议概述

1.1 内容简介

随着Internet技术在全球范围的飞速发展,OSPF已成为目前Internet广域网和Intranet企业网采用最多、应用最广泛的路由协议之一。OSPF是Open Shortest Path First(开放最短路由优先协议)的缩写。它是IETF组织开发的一个基于链路状态的内部网关协议。目前针对IPv4协议使用的是OSPF Version 2(RFC2328)。

OSPF协议是由Internet Engineering Task Force的OSPF工作组所开发的,特别为TCP/IP 网络而设计,包括明确的支持CIDR和标记来源于外部的路由信息。OSPF也提供了对路由更新的验证,并在发送/接收更新时使用IP多播。此外,还作了很多的工作使得协议仅用很少的路由流量就可以快速地响应拓扑改变。

本文主要介绍OSPF 路由协议的基本原理,包括:OSPF的协议报文、邻居状态机、链路状态同步,以及DR、BDR选举和OSPF区域的划分。

本文来源于H3C网络学院教材,作为OSPF路由协议实验的主要参考资料。通过这个实验,学生应该能掌握OSPF 路由协议的基本概念和基本原理,OSPF路由计算过程,具备规划和配置OSPF 路由协议的能力,并能处理一般的OSPF故障。

说明:

若没有特别说明,下文中所提到的OSPF均指OSPFv2。

1.2 相关概念回顾

在理论课程中,我们对距离矢量和链路状态路由协议有了一定的了解。下面,我们将会回顾一些相关的概念,指出距离矢量算法和链路状态算法的一些区别。

1.2.1 路由表

路由器转发分组的关键是路由表。每个路由器中都保存着一张路由表,表中每条路由项都指明分组到某子网或某主机应通过路由器的哪个物理端口发送,然后就可到达该路径的下一个路由器,或者不再经过别的路由器而传送到直接相连的网络中的目的主机。

根据来源不同,路由表中的路由通常可分为以下三类:

1. 链路层协议发现的路由(也称为接口路由或直连路由)

2. 由网络管理员手工配置的静态路由

3. 动态路由协议发现的路由。

路由协议

静态路由协议

动态路由协议

距离矢量路由协议

(如RIP)

链路状态路由协议(如OSPF IS-IS)

图1-1如图1-1路由协议的分类

其中动态路由协议又包括有:TCP/IP协议栈的RIP(Routing Information Protocol,路由信息协议)协议、OSPF(Open Shortest Path First,开放式最短路径优先)协议;OSI参考模型的IS-IS(Intermediate System to Intermediate System)协议等。如图1-1。

1.2.2 距离矢量算法和链路状态算法

动态路由协议有很多种,分类标准也很多。主要的分类标准是根据算法的不同来划分,不同的算法能适应的网络规模也不尽相同。目前常见的动态路由协议,根据使用的算法可分为: 距离矢量协议(Distance-Vector):包括RIP和BGP。其中,BGP也被称为路径矢量协议(Path-Vector)。

链接状态协议(Link-State):包括OSPF和IS-IS。

以上两种算法的主要区别在于发现路由和计算路由的方法。

1. 距离矢量协议(Distance-Vector):

距离矢量协议也称为Bellman-Ford协议,网络中路由器向相邻的路由器发送它们的整个路由表。路由器在从相邻路由器接收到的信息的基础之上建立自己的路由表。然后,将信息传递到它的相邻路由器。这样一级级的传递下去以达到全网同步。也就是说距离矢量路由表中的某些路由项有可能是建立在第 2 手信息的基础之上的,每个路由器都不了解整个网络拓

扑,它们只知道与自己直接相连的网络情况,并根据从邻居得到的路由信息更新自己的路由表,进行矢量行叠加后转发给其它的邻居,

距离矢量算法存在的一个重要的问题就是会产生路由环路。路由环路问题产生的原因和距离矢量算法的原理有关,正如前面所讲的,每个路由器根据从其它路由器接收到的信息来建立自己的路由表。如果某个路由器出现“故障”或者因为别的原因而无法在网上使用时,就会造成路由环路。

针对产生回路的问题,防止和解决的方法有:

定义最大路由权值

水平分割

毒性逆转

路由保持法

触发更新

距离矢量协议无论是实现还是管理都比较简单,但是它的收敛速度慢,报文量大,占用较多网络开销,并且会产生路由环路,为避免路由环路得提供特殊处理。路由环路是DV算法必须要解决的问题,只有处理好环路问题的路由协议才能应用在实际的系统中。常见的D-V 路由协议一般都会采用上述阐述的多种方法解决路由环路的问题。

2. 链路状态算法

链路状态算法对路由的计算方法和距离矢量算法有本质的差别。距离矢量算法是一个平面式的,所有的路由表项学习完全依靠邻居,交换的是整个路由表项。链路状态是一个层次式的,执行该算法的路由器不是简单的从相邻的路由器学习路由,而是把路由器分成区域,收集区域内所有路由器的链路状态信息,根据链路状态信息生成网络拓扑结构,每一个路由器再根据拓扑结构图计算出路由。链路状态路由协议的一些注意事项如下:

网络中的设备并不向邻居传递“路由信息”,而是通告给邻居一些链路状态。

网络中的设备(路由器)最终都会得到网络的拓扑结果元素,只是详细程度并不相同。

各设备以自身为“树根”,根据LSDB中的数据计算到各个网断的“最短生成树”。

由于各设备有义务将网络拓扑信息向下传递,而具体的路由信息又是各设备自己计算所得,所以链路状态协议中,对是否“发出路由”不能进行控制,但可以控制路由的某些属性。

3. 距离矢量算法和链路状态算法的比较

采用链路状态算法的路由器,首先要得到整个网络的拓扑结构,再根据网络拓扑图计算出路由。这种路由的计算方法对路由器的硬件相对要求较高,但它计算准确,一般可以确保网络

中没有路由环路存在。由于路由不是在路由器间顺序传递的,网络动荡时,路由收敛速度较快。而且路由器不需要定期的将路由信息复制到整个网络中,网络流量相对较小。表1-1对这两种路由算法作一比较:

表1-1距离矢量算法与链路状态算法

距离矢量算法链路状态算法

是否有环路有无

收敛速度慢快

对路由器CPU、RAM

低高

的要求

网络流量大小

典型协议 RIP、BGP OSPF、IS-IS

1.3 OSPF的基本概念

OSPF 是 Open Shortest Path First(即“开放最短路径优先协议”)的缩写。IETF(Internet Engineering Task Force)于1988年提出的OSPF是一个基于链路状态的动态路由协议。

OSPF是一类Interior Gateway Protocol(内部网关协议IGP),它处理在一个自治系统中的路由表信息。当前OSPF协议使用的是第二版,最新的RFC是2328。

OSPF协议是特别为TCP/IP网络而设计,包括明确的支持CIDR和标记来源于外部的路由信息。OSPF也提供了对路由更新的验证,并在发送/接收更新时使用IP多播。此外,还作了很多的工作使得协议仅用很少的路由流量就可以快速地响应拓扑改变。

O S P F用链路状态算法来计算在每个区域中到所有目的的最短路径,当一个路由器首先开始工作,或者任一个路由变化发生,这个配备给O S P F的路由器将L S A扩散到同一级区域内所有路由器,这些L S A包含这个路由器的链接状态和它与邻居路由器联系的信息,从这些L S A的收集中形成了链路状态数据库,在这个区域中的所有路由器都有一个特定的数据库来描述这个区域的拓扑结构。

在OSPF路由协议中,可以通过划分区域来分割整个自治系统,每一个区域都有着该区域独立的网络拓扑数据库及网络拓扑图。对于每一个区域,其网络拓扑结构在区域外是不可见的,同样,在每一个区域中的路由器对其域外的其余网络结构也不了解。这意味着OSPF 路由域中的网络链路状态数据广播被区域的边界挡住了,这样做有利于减少网络中链路状态数据包在全网范围内的广播,也是OSPF将自治系统划分成很多个区域的重要原因。

OSPF仅通过在IP包头中的目标地址来转发IP包。IP包在AS中被转发,而没有被其他协议再次封装。OSPF是一种动态路由协议,它可以快速地探知AS中拓扑的改变(例如路由器接口的失效),并在一段时间的收敛后计算出无环路的新路径。收敛的时间很短且只使用很小的路由流量。

说明:

作为一种链路状态的路由协议,OSPF将链路状态广播数据包LSA(Link State Advertisement)传送给在某一区域内的所有路由器,这一点与距离矢量路由协议不同。运行距离矢量路由协议的路由器是将部分或全部的路由表传递给与其相邻的路由器。

1.3.1 OSPF的基本特点

OSPF是一种基于链路状态(Link-state)算法的协议,其核心思想是:每一台路由器将自己周边的链路状态(包括接口的直接路由、相连的路由器等信息)描述出来,发送给网络中所有的路由器。每台路由器在收到其他所有路由器的发送的链路状态信息之后,运行Shortest Path First算法计算路由。

随着Internet技术在全球范围的飞速发展,OSPF已成为目前Internet广域网和Intranet企业网采用最多、应用最广泛的路由协议之一。

OSPF协议具有如下特点:

适应范围—— OSPF 支持各种规模的网络,最多可支持几百台路由器。

快速收敛——如果网络的拓扑结构发生变化,OSPF 立即发送更新报文,使这一变化在自治系统中同步。

无自环——由于 OSPF 通过收集到的链路状态用最短路径树算法计算路由,故从算法本身保证了不会生成自环路由。

子网掩码——由于 OSPF 在描述路由时携带网段的掩码信息,所以OSPF协议不受自然掩码的限制,对VLSM 提供很好的支持。

区域划分—— OSPF 协议允许自治系统的网络被划分成区域来管理,区域间传送的路由信息被进一步抽象,从而减少了占用网络的带宽。

等值路由—— OSPF 支持到同一目的地址的多条等值路由,即到达同一个目的地有多个下一跳,这些等值路由会被同时发现和使用。

路由分级—— OSPF 使用 4 类不同的路由,按优先顺序来说分别是:区域内路由、区域间路由、第一类外部路由、第二类外部路由。

支持验证——它支持基于接口的报文验证以保证路由计算的安全性。

组播发送—— OSPF在有组播发送能力的链路层上以组播地址发送协议报文,不仅达到了广播的作用,而且最大程度的减少了对其他网络设备的干扰。

1.3.2 Router ID

OSPF协议使用一个被称为Router ID的32位无符号整数来唯一标识一台路由器。基于这个目的,每一台运行OSPF的路由器都需要一个Router ID。这个Router ID一般需要手工配置,一般将其配置为该路由器的某个接口的IP地址。

由于IP地址是唯一的,所以这样就很容易保证Router ID的唯一性。在没有手工配置Router ID的情况下,一些厂家的路由器(包括Quidway系列)支持自动从当前所有接口的IP地址自动选举一个IP地址作为Router ID。

Router ID选择注意点:

首先选取最大的loopback接口地址

如果没有配置loopback接口,那么就选取最大的物理接口地址

可以通过命令强制改变Router ID:VRP平台系统视图下,router id 如果一台路由器的 Router ID 在运行中改变,则必须重启OSPF协议或重启路由器才能使新的 Router ID 生效

协议号:

OSPF 协议用IP 报文直接封装协议报文,协议号是89。

说明:

通常OSPF的协议报文是不被转发的,只能传递一跳,即在IP报文头中TTL值被设为1 (虚连接除外)。

为保证OSPF运行的稳定性,在进行网络规划时应该确定路由器ID的划分并手工配置。手工配置路由器的ID时,必须保证自治系统中任意两台路由器的ID都不相同。通常的做法是将路由器的ID配置为与该路由器某个接口的IP地址一致。

VRP3.4平台的OSPF支持多进程,在同一台路由器上可以运行多个不同的OSPF进程,它们之间互不影响,彼此独立。OSPF进程号是本地概念,不影响与其它路由器之间的报文交换。因此,不同的路由器之间,即使进程号不同也可以进行报文交换。不同OSPF进程之

间的路由交互相当于不同路由协议之间的路由交互。路由器的一个接口只能属于某一个OSPF进程。

1.3.3 SPF算法和COST值

1. SPF算法

SPF算法是OSPF路由协议的基础。SPF算法有时也被称为Dijkstra算法,这是因为最短路径优先算法SPF是Dijkstra发明的。SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离,每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图,该结构图类似于一棵树,在SPF算法中,被称为最短路径树。

2. Cost值

在OSPF路由协议中,最短路径树的树干长度,即OSPF路由器至每一个目的地路由器的距离,称为OSPF的Cost。Cost值应用于每一个启动了OSPF的链路,它是一个16 bit的正数,范围是1~65535。

Cost值越小,说明路径越好。OSPF选择路径是依靠整个链路Cost值的总和。那么Cost 值是如何计算的呢?

OSPF协议中,Cost值的计算方法是用108/链路带宽。在这里,链路带宽以bps来表示。

也就是说,OSPF的Cost 与链路的带宽成反比,带宽越高,Cost越小,表示OSPF到目的地的距离越近。举例来说,56k的链路花费是1785,10M以太网链路花费是10,64k的链路花费是1562,T1的链路花费是64。

缺省情况下,接口按照当前的波特率自动计算接口运行OSPF协议所需的开销。

1.3.4 OSPF路由的计算过程

OSPF是基于链路状态算法的路由协议,所有对路由信息的描述都是封装在LSA中发送出去。L S A(Link State Advertisement)用来描述路由器的本地状态, L S A包括的信息是关于路由器接口的状态和所形成的邻接状态。

每台OSPF路由器都会收集其它路由器发来的LSA,所有的LSA放在一起便组成了链路状态数据库LSDB(Link State Database)。LSDB则是对整个自治系统的网络拓扑结构的描述。到达某个目的网段的最短路径,可通过这些信息计算出来。

在图1-2中,描述了通过 OSPF 协议计算路由的过程。一个典型的网络,由四台运行OSPF 的路由器组成,连线旁边的数字表示从一台路由器到另一台路由器所需要的花费。为简化问题,我们假定两台路由器相互之间发送报文所需花费是相同的

1. 每台路由器都根据自己周围的网络拓扑结构生成一条 LSA(Link State

Advertisement),并通过相互之间发送协议报文将这条 LSA 发送给网络中其它的所有路由器。这样每台路由器都收到了其它路由器的 LSA,所有的 LSA 放在一起称作LSDB(链路状态数据库)。显然,4 台路由器的 LSDB(Link State Database)都是相同的。

图1-2图1-2 OSPF 协议计算路由的过程

2. 由于一条 LSA 是对一台路由器周围网络拓扑结构的描述,那么 LSDB 则是对整个网络

的拓扑结构的描述。路由器很容易将 LSDB 转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。显然,4 台路由器得到的是一张完全相同的拓扑图。

3. 接下来每台路由器在图中以自己为根节点,使用SPF算法计算出一棵最短路径树,由

这棵树得到了到网络中各个节点的路由表。显然,4 台路由器各自得到的路由表是不同的。

这样每台路由器都计算出了到其它路由器未知网段的路由。

1.3.5 OSPF报文头

OSPF有五种报文类型,他们有相同的报文头。如下图所示。

图1-3OSPF报文头格式

主要字段的解释如下:

Version:OSPF的版本号。对于OSPFv2来说,其值为2。

Type:OSPF报文的类型。数值从1到5,分别对应Hello报文、DD报文、LSR报文、LSU 报文和LSAck报文。

Packet length:OSPF报文的总长度,包括报文头在内,单位为字节。

Router ID 报文起源的Router ID。

Area ID 一个32位的数,标识报文属于哪个区域,所有OSPF报文只属于单个区域,且只有一跳。当报文在虚链接上承载时,会打上骨干区域0.0.0.0的标签。

Checksum 包的整个内容的校验,从OSPF报文头部开始,但是除了64位的认证字段。

AuType 认证类型包括四种:0(无需认证),1(明文认证),2(密文认证)和其他类型(IANA保留)。当不需要认证时,只是通过Checksun检验数据的完整性;当使用明文认证时,64位的认证字段被设置成64位的明文密码;当使用密文认证时,对于每一个OSPF报文,共享密钥都会产生一个“消息位”加在OSPF报文的后面,由于在网络上从来不以明文的方式发送密钥,所以提高了网络安全性。

Authentication:其数值根据验证类型而定。当验证类型为0时未作定义,为1时此字段为密码信息,类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。

说明:

MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。

1.3.6 OSPF的五种报文类型

HELLO报文(Hello Packet):

最常用的一种报文,周期性的发送给本路由器的邻居,使用的组播地址224.0.0.5。DR和BDR发送和接收报文使用的组播地址是224.0.0.6。

HELLO报文内容包括一些定时器的数值,DR,BDR,以及自己已知的邻居。

根据RFC2328的规定,要保持网络邻居间的hello时间间隔一致。需要注意的是,hello时钟的值与路由收敛速度、网络负荷大小成反比。

缺省情况下,p2p、broadcast类型接口发送Hello报文的时间间隔的值为10秒;p2mp、nbma类型接口发送Hello报文的时间间隔的值为30秒。

说明:

根据路由器使用链路层协议的不同,OSPF将网络分为四种类型:

点到点P2P(point-to-point)类型、广播(Broadcast)类型、NBMA(Non-Broadcast Multi-Access)类型、点到多点P2MP(point-to-multipoint)类型。

注意:

没有一种链路层协议会被缺省的认为是Point-to-Multipoint类型。点到多点必须是由其他的网络类型强制更改的。常用做法是将非全连通的NBMA改为点到多点的网络。

具体内容,我们会在OSPF的网络类型章节讲解。

DD报文(Database Description Packet):

路由信息(连接状态传送报文)只在形成邻接关系的路由器间传递。

首先,它们之间互发DD(database description)报文,告之对方自己所拥有的路由信息,内容包括LSDB中每一条LSA的摘要(摘要是指LSA的HEAD,通过该HEAD可以唯一标识一条LSA)。

这样做是为了减少路由器之间传递信息的量,因为LSA的HEAD只占一条LSA的整个数据量的一小部分,根据HEAD,对端路由器就可以判断出是否已经有了这条LSA。

DD报文有两种,一种是空DD报文,用来确定Master/Slave关系(避免DD报文的无序发送)。确定Master/Slave关系后,才发送有路由信息的DD报文。

收到有路由信息的DD报文后,比较自己的数据库,发现对方的数据库中有自己需要的数据,则向对方发送LSR(Link State Request)报文,请求对方给自己发送数据。

LSR报文(Link State Request Packet):

两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的或是对端更新的LSA,这时需要发送LSR报文向对方请求所需的LSA。内容包括所需要的LSA的摘要。

LSU报文(Link State Update Packet):

用来向对端路由器发送所需要的LSA,内容是多条LSA(全部内容)的集合。

LSAck 报文(Link State Acknowledgment Packet)

由于没有使用可靠的TCP协议,但是OSPF包又要求可靠的传输,所以就有了LSAck包。

它用来对接收到的LSU报文进行确认。内容是需要确认的LSA的HEAD(一个报文可对多个LSA进行确认)。

DD报文、LSR报文、LSU报文发出后,在没有得到应有的对方相应的LSR、LSU、LSAck 报文时,会重发。(例外:对DD报文若收到后发现没有必要产生连接状态请求报文,则不发连接状态请求报文。)同步后数据改变,则只向形成Adjacency关系的路由器发LSU报文。

1.3.7 LSA头格式

所有的LSA都有相同的报文头,其格式如下图所示。

图1-4LSA的头格式

首先,我们分析一下LSA报文头:

LSA头部都是20个字节,它包含了足够的信息来唯一标识一条LSA(LS type,Link State ID,and Advertising Router )。LSA多实例在同一时候可以存在于路由域中,它被用来决定哪一个实例是最新的。LSA头部还包括LS老化、LS序列号和LS校验和等字段。

主要字段的解释如下:

LS age,用来标识LS产生的时间。生成LSA 的路由器将LS时域初始化为0,在洪泛过程中,每经过一个路由器,要按InfTransDelay的量增加,这个量表示传输LSA到下一个跳所需要的时间。当该时间达到所设定的MaxAge参数时,要撤消该LSA。

Options,用来描述支持的路由域,主要包括DC、EA、N/P、MC、E、T等选项。DC指的是始发路由器支持Demand Circuits (按需拨号等);EA指的是始发路由器支持External Attributes LSAs (现在未推广);N/P只用在Hello中N=1,说明支持NSSA,P只用在NSSA 中,通知ABR把type7的LSA翻译成type5的LSA;MC只在MOSPF中用到;E表示可以接受外部路由(不是stub区),在一个area中的所有router此位必须一致,(Hello中体现) 否则邻接关系无法建立;T表示始发路由器支持TOS。

LS type,链路类型。每种类型的LSA都有唯一的通告格式。

Link State ID,这个字段标识被描述的网络环境的一部分,Link State ID的内容取决于LSA 的类型,即不同类型的LSA其Link State ID也是不同的。比如,当LSA的类型是Type 1时, Link State ID 是始发路由器的Router ID;当LSA的类型是Type 2时, Link State ID 是DR在该网段上接口的IP地址;当LSA的类型是Type 3时, Link State ID 是被通告的网络/子网的IP地址;当LSA的类型是Type 4时, Link State ID 是被通告ASBR的Router ID;当LSA的类型是Type 5时, Link State ID 是目的地的IP地址。

Advertising Router,指始发此LSA的路由器的Router ID。比如在Network-LSAs中,这个字段就是DR在该网段上接口的IP地址。

LS sequence number,用于识别LSA 包是否是一个最新包。路由器每生成一个新的LSA 时,将该序列号加1。

LS checksum用来检查LSA的完整性,包括除了LS age之外的LSA头部的内容。

Length,LSA的长度,用bytes表示。LSA的头部包括20字节。

LSA头中的链路类型、链路状态ID和通告路由器的Router ID是一个LSA的唯一标识。一个LSA将有多个实例,不同的实例通过LS的序列号、LS的校验和及LS的Age 字段来描述。因此,必须要决定其实例是否是最近的,这要通过检查LS的序列号、LS的校验和及LS的Age 字段内容。

1.3.8 LSA的类型

OSPF是基于链路状态算法的路由协议,所有对路由信息的描述都是封装在LSA中发送出去。当路由器初始化或当网络结构发生变化(例如增减路由器,链路状态发生变化等)时,路由器会产生链路状态广播数据包LSA(Link-State Advertisement),该数据包里包含路由器上所有相连的链路,也即为所有端口的状态信息。

LSA根据不同的用途分为不同的种类,主要有如下类型的 LSA:

Router LSA(Type = 1):

是最基本的LSA类型,所有运行OSPF的路由器都会生成这种LSA。主要描述本路由器运行OSPF的接口的连接状况,花费等信息。

对于ABR,它会为每个区域生成一条Router LSA。这种类型的LSA传递的范围是它所属的整个区域。

Netwrok LSA(Type = 2):

本类型的LSA由DR生成。对于广播和NBMA类型的网络,为了减少该网段中路由器之间交换报文的次数而提出了DR的概念。

一个网段中有了DR之后不仅发送报文的方式有所改变,链路状态的描述也发生了变化。

在DROther 和BDR的Router LSA中只描述到DR的连接,而DR则通过Network LSA来描述本网段中所有已经同其建立了邻接关系的路由器。(分别列出它们Router ID)。

同样,这种类型的LSA传递的范围是它所属的整个区域。

Network Summary LSA(Type = 3):

本类型的LSA由ABR生成。当ABR完成它所属一个区域中的区域内路由计算之后,查询路由表,将本区域内的每一条OSPF路由封装成 Network Summary LSA 发送到区域外。

LSA中描述了某条路由的目的地址、掩码、花费值等信息。

这种类型的LSA传递的范围是ABR中除了该LSA生成区域之外的其他区域。

ASBR Summary LSA(Type = 4):

本类型的LSA同样是由ABR生成。内容主要是描述到达本区域内部的ASBR的路由。

这种LSA与Type3类型的LSA内容基本一样,只是Type4的LSA描述的目的地址是ASBR,是主机路由,所以掩码为0.0.0.0。

这种类型的LSA传递的范围与Type3的LSA相同。

AS External LSA(Type = 5):

本类型的LSA由ASBR生成。主要描述了到自治系统外部路由的信息,LSA中包含某条路由的目的地址、掩码、花费值等信息。

本类型的LSA是唯一一种与区域无关的LSA类型,它并不与某一个特定的区域相关。

这种类型的LSA传递的范围整个自治系统(STUB区域除外)。

Multicast OSPF LSA(Type =6):

使用在OSPF多播应用程序里。

Not-So-Stubby Area(Type =7):

本类型的LSA由Not-So-Stubby area(NSSA) 区域中ASBR生成。

为了解决ASE路由(自治系统外部路由)单向传递的问题,Not-So-Stubby area(NSSA) 中重新定义了一种LSA——Type 7类型的 LSA,作为区域内的路由器引入外部路由时使用。

该类型的 LSA 除了类型标识与 Type 5 不相同之外,其它内容基本一样。这样区域内的路由器就可以通过 LSA 的类型来判断是否该路由来自本区域内。

但由于Type 7类的 LSA 是新定义的,对于不支持 NSSA 属性的路由器无法识别,所以协议规定:在 NSSA 的 ABR 上将 NSSA 内部产生的Type 7类型的 LSA 转化为Type 5类型的 LSA 再发布出去,并同时更改 LSA 的发布者为 ABR 自己。这样 NSSA 区域外的路由器就可以完全不用支持该属性。

在 NSSA 区域内的所有路由器必须支持该属性(包括NSSA的ABR),而自治系统中的其他路由器则不需要。

External-Attributes-LSA(Type =8):

特殊的LSA,还没有实现。当BGP信息需要在OSPF上承载时,需要用到此LSA。

opaque LSA(Type =9~11):

用于MPLS流量工程,有关此LSA的详细应用请参考网络学院MPLS流量工程培训教材或RFC2370文档。

当一台路由器向它的邻居发送一条LSA后,需要等到对方的确认报文。若在重传间隔时间内没有收到对方的确认报文,就会向邻居重传这条LSA。

1.3.9 邻居和邻接

在OSPF中,邻居(Neighbors)和邻接(Adjacencies)是两个不同的概念。

OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文。收到Hello报文的OSPF 路由器会检查报文中所定义的一些参数,如果双方一致就会形成邻居关系。

形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。只有当双方成功交换DD报文,并能交换LSA之后,才形成真正意义上的邻接关系。

为了交换路由信息,邻居路由器之间首先要建立邻接关系,并不是每两个邻居路由器之间都能建立邻接关系。

HELLO Interval:接口上发送报文的时间间隔,以秒为单位。OSPF邻居之间的Hello定时器的时间间隔要保持一致。Hello定时器的值与路由收敛速度、网络负荷大小成反比。

如果两路由器不具有相同的呼叫周期,则不能成为邻接关系。

DEAD Interval:如果在DEAD TIME指定的秒数内没有从已建立的邻居处收到报文,那么,邻居被宣布为故障状态。

如果Hello报文中的Dead Interval与接收端口所设置的DeadInterval值不相同,则丢弃该报文。因此,要确保两邻居路由器具有相同的参数。

在同一接口上失效时间应至少为Hello间隔时间的4倍。

说明:

Hello报文主要负责建立和维护邻接关系,周期性的在路由器的接口上发送。当路由器发现自己被列在邻居路由器的hello报文中,双向通信就建立起来。

在不同类型的链路上,hello报文工作的方式也不同。邻居建立后,还需要通过HELLO报文进行邻居关系的维持,有两个定时器来进行这项工作:

 HELLO TIME:缺省为10秒(对于NBMA网络为30秒)

 DEAD TIME:缺省为4倍的HELLO TIME

邻接关系形成之后,接下来就是同步链路状态数据库。

1.3.10 OSPF的邻居状态机

图1-5OSPF的邻居状态机

Down:

邻居状态机的初始状态,是指在过去的Dead-Interval时间内没有收到对方的Hello报文。

Attempt:

只适用于NBMA类型的接口,处于本状态时,定期向那些手工配置的邻居发送HELLO报文。

Init:

本状态表示已经收到了邻居的HELLO报文,但是该报文中列出的邻居中没有包含我的Router ID(对方并没有收到我发的HELLO报文)。

2-Way:

本状态表示双方互相收到了对端发送的HELLO报文,建立了邻居关系。在广播和NBMA类型的网络中,两个接口状态是DROther的路由器之间将停留在此状态。其他情况状态机将继续转入高级状态。

ExStart:

在此状态下,路由器和它的邻居之间通过互相交换DD报文(该报文并不包含实际的内容,只包含一些标志位)来决定发送时的主/从关系。建立主/从关系主要是为了保证在后续的DD 报文交换中能够有序的发送。

Exchange:

路由器将本地的LSDB用DD报文来描述,并发给邻居。

Loading:

路由器发送LSR报文向邻居请求对方的LSU报文。

Full:

在此状态下,邻居路由器的LSDB中所有的LSA本路由器全都有了。即,本路由器和邻居建立了邻接(adjacency)状态。

说明:

Down、2-Way、Full的状态是指稳定的状态,其他状态则是在转换过程中瞬间(一般不会超过几分钟)存在的状态。

本路由器和状态可能与对端路由器的状态不相同。例如本路由器的邻居状态是Full,对端的邻居状态可能是Loading。

1.3.11 链路状态数据库的同步过程

 链路状态数据库同步过程的主要步骤:

HELLO报文发现邻居

主从关系协商

DD报文交换

LSA请求

LSA更新

(1) LSA应答

如图1-6显示了两台路由器之间如何通过发送5种协议报文来建立邻接关系,以及邻居状态机的迁移。

RT1的一个连接到广播类型网络的接口上激活了OSPF协议,并发送了一个HELLO 报文(使用组播地址224.0.0.5)。由于此时RT1在该网段中还未发现任何邻居,所

以HELLO报文中的Neighbor字段为空。

RT2收到RT1发送的HELLO报文后,为RT1创建一个邻居的数据结构。RT2发送一个HELLO报文回应RT1,并且在报文中的Neighbor字段中填入RT1的Router ID,

表示已收到RT1的HELLO报文,并且将RT1的邻居状态机置为Init。

RT1收到RT2回应的HELLO报文后,为RT2创建一个邻居的数据结构,并将邻居状态机置为Exstart状态。下一步双方开始发送各自的链路状态数据库。

图1-6两台路由器之间建立邻接关系的过程

为了提高发送的效率,双方需先了解一下对端数据库中那些LSA是自己所需要的(如果某一条LSA自己已经有了,就不再需要请求了)。

方法是先发送DD报文,DD报文中包含了对本地数据库中LSA的摘要描述(每一条摘要可以唯一标识一条LSA,但所占的空间要少得多)。由于OSPF直接用IP 报文来封装自己的协议报文,所以在传输的过程中必须考虑到报文传输的可靠性。

为了做到这一点,在DD报文的发送过程中需要确定双方的主从关系。作为Master 的一方定义一个序列号seq,每发送一个新的DD报文将seq 加一。作为Slave的一方,每次发送DD报文时使用接收到的上一个Master的DD报文中的seq。实际上这种序列号机制是一种隐含的确认方法。如果再加上每个报文都有超时重传,就可以保证这种传输是可靠的。

RT1首先发送一个DD报文,宣称自己是Master(MS=1),并规定序列号为x。

I=1表示这是第一个DD报文,报文中并不包含LSA的摘要,只是为了协商主从关系。M=1说明这不是最后一个报文。

RT2在收到RT1的DD报文后,将RT1的邻居状态机改为Exstart,并且回应了一个DD报文(该报文中同样不包含LSA的摘要信息)。由于RT2的Router ID较大,所以在报文中RT2认为自己是Master,并且重新规定了序列号为y。

RT1收到报文后,同意了RT2为Master,并将RT2的邻居状态机改为Exchange。

RT1使用RT2的序列号y来发送新的DD报文,该报文开始正式地传送LSA的摘

要。在报文中RT1将MS=0,说明自己是Slave。

RT2收到报文后,将RT1的邻居状态机改为Exchange,并发送新的DD报文来描述自己的LSA摘要,需要注意的是:此时RT2已将报文的序列号改为y+1了。

上述过程持续进行,RT1通过重复RT2的序列号来确认已收到RT2的报文。RT2通过将序列号加1来确认已收到RT1的报文。当RT2发送最后一个DD报文时,

将报文中的M=0,表示这是最后一个DD报文了。

RT1收到最后一个DD报文后,发现RT2的数据库中有许多LSA是自己没有的,将邻居状态机改为Loading状态。此时RT2也收到了RT1的最后一个DD报文,

但RT1的LSA,RT2都已经有了,不需要再请求,所以直接将RT1的邻居状态机

改为Full状态。

RT1发送LS Request报文向RT2请求所需要的LSA。RT2用LS Update报文来回应RT1的请求。RT1收到之后,需要发送LS Ack报文来确认。上述过程持续到

RT1中的LSA与RT2的LSA完全同步为止。此时RT1将RT2的邻居状态机改为

Full状态。

说明:

以上过程是两台路由器由相互没有发现对方的存在到建立邻接关系的过程。或者可以理解为网络中新加入一台路由器时的处理情况。当两台路由器之间的状态机都已经达到Full状态之后,如果此时网络中再有路由变化时,就无须重复以上的所有步骤。只由一方发送LS Update 报文通知需要更新的内容,另一方发送LS Ack报文予以回应即可。双方的邻居状态机在此过程中不再发生变化。

1.3.12 OSPF的四种网络类型

OSPF协议计算路由是以本路由器周边网络的拓扑结构为基础的。每台OSPF路由器根据自己周围的网络拓扑结构生成链路状态通告LSA(Link State Advertisement),并通过更新报文将LSA发送给网络中的其它OSPF路由器。

根据路由器使用链路层协议的不同,OSPF将网络分为四种类型:

广播(Broadcast)类型:

当链路层协议是Ethernet、FDDI时,OSPF缺省认为网络类型是Broadcast。在该类型的网络中,通常以组播形式(224.0.0.5和224.0.0.6)发送协议报文,选举DR /BDR。

图1-7OSPF的四种网络类型

NBMA(Non-Broadcast Multi-Access)类型:

当链路层协议是帧中继、ATM或X.25时,OSPF缺省认为网络类型是NBMA。在该类型的网络中,以单播形式发送协议报文。手工指定邻居,选举DR/BDR,DR/BDR要求和DROTHER完全互连。

点到多点P2MP(point-to-multipoint)类型:

没有一种链路层协议会被缺省的认为是Point-to-Multipoint类型。点到多点必须是由其他的网络类型强制更改的。常用做法是将非全连通的NBMA改为点到多点的网络。在该类型的网络中,以组播形式(224.0.0.5)发送协议报文。多播hello包自动发现邻居,不要求DR/BDR的选举。

相关文档