研究OSPF数据结构


OSPF是相当复杂的路由协议,有许多性能和稳定性方面增强的特点。因此,OSPF使用大量的数据结构就不是奇怪的现象。每个数据结构或信息类型,用于执行一个特定的任务。所有数据结构共享一个通用头,称为OSPF头。OSPF头长度为24字节,包括以下各域:
•版本号—分配OSPF头的第一个字节用于标识版本号。当前的版本是2,但是可能会遇到更老的路由器还在运行RFC1131版本1。RFC1247、1583、2178和2328都对OSPF版本2的向后兼容作了规范。因此无需进一步的标识。
•类型—第二个字节指出5种OSPF报文类型中哪一种附加在头结构后面。5种类型(HELLO、数据库描述、链路-状态请求、链路-状态更新和链路-状态应答)用数字标识。
•报文长度—OSPF头中下面两个字节用于通知接收节点报文的总长度。报文总长度包括数据和头。
•路由器ID—区中的每个路由器被分配一个惟一的、4字节的标识号。OSPF路由器在发送任何OSPF消息给其他路由器之前,用自己的ID号填充该域。
•区ID—头中用4字节标识区号。
•校验和—每个OSPF头包括一个2字节的校验和域,用于检查在传输过程中对报文造成的破坏。发送方对每个消息运行数学计算,然后把结果存储在这个域中。接收方对接收到的报文运行相同的算法并把结果与存储在校验和域中的结果进行比较。如果报文无损到达,两个结果应一样;不相同,说明OSPF报文在传输过程中被破坏。接收方会简单地把受损报文丢弃。
•认证类型—OSPF能通过认证OSPF信息的发送者来防止会导致假路由信息这样的攻击。两字节的认证类型域标识信息中使用的各种认证形式。
•认证—头中剩下的9个字节携带的是认证数据,接收方利用此信息来确定信息的发送者。OSPF允许网络管理员使用各种级别的认证:从无认证,到简单认证,到最强大的MD认证,基本结构中包含OSPF节点所需的用于决定报文是否应接收并作进一步处理,
一点)及没有通过认证的报文会被丢弃。OSPF使用5种不同的报文类型。每种类型用于支持不同的,专门的网络功能。这5种类型是:
•HELLO报文(类型1)。
•数据库描述报文(类型2)。
•链路-状态请求报文(类型3)。
•链路-状态更新报文(类型4)。
•链路-状态应答报文(类型5)。这5种报文类型有时用编号指明,而不是用名字。所以,OSPF类型5报文实际上是指链路-状态应答报文。所有这些报文类型使用OSPF头。注意5种基本的OSPF数据结构用5个纯粹的数表示,对这些结构和大小的详细讨论超出了本章的范围。相反,这一章仅限于讨论这些数据类型的目的和使用。
1 HELLO报文
OSPF包含一个用于建立和维护相邻站点之间关系的协议(HELLO协议)。这些关系称为连接性。连接性是OSPF交换路由数据的基础。
通过这个协议和报文类型,OSPF节点能发现区中的其他OSPF节点。它的名字表明了其含义,HELLO协议在可能的相邻路由器之间建立通信。HELLO协议使用特别的子报文结构,这个结构附加到标准24字节的OSPF头后面。这些结构共同构成HELLO报文。
OSPF网络中的所有路由器必须遵守一定的规则,这个规则在整个网络中要一致。这些规则包括:
•网络掩码。
•HELLO报文广播的间隔。
•网络中的其他路由器认为一个没有反应的路由器为死节点的时间(路由器死时间间隔)。
OSPF中的所有路由器对这些参数必须使用相同值,否则网络可能不会正常工作。这些参数通过HELLO报文进行交换。它们一起构成相邻节点之间通信的基础。它们要确保在不同网络的路由器之间不形成相邻关系(连接性),并且网络中的所有成员要对多久彼此联系一次成达共识。
HELLO报文也包括最近已与其联系过的其他路由器列表(使用它们自己惟一的路由器ID)。这个Neighbor(相邻者)域使邻居发现过程成为可能。HELLO报文还包括几个其他的域,如DesignatedRouter(指定路由器)、BackupDesignatedRouter(备份指定路由器)和其他一些域。这些域对于维护连接性,支持OSPF网络的稳定周期和收敛都是有用的。DesignatedRouter和BackupDesignatedRouter的用处将在本章后面的节中描述。
2数据库描述报文
当OSPF中的两个路由器初始化连接时要交换数据库描述(DD)报文。这个报文类型用于描述,而非实际地传送OSPF路由器的链路-状态数据库内容。由于数据库的内容可能相当长,所以可能需要多个数据库描述报文来描述整个数据库。实际上,保留了一个域用于标识数据库描述报文序列。接收方对报文的重新排序使其能够真实地复制数据库描述报文。
DD交换过程按询问/应答方式进行,在这个过程中,一个路由器作为主路由器。另一个路由器作为从路由器,主路由器向从路由器发送它的路由表内容。显然,主从之间的关系会因每个DD交换的不同而不同。网络中的所有路由器会在不同时刻作用,在这个过程中既可能是主又可能是从。
3链路-状态请求报文

OSPF报文的第三种类型为链路-状态请求报文。这个报文用于请求相邻路由器链路-状态数据库中的一部分数据。表面上讲,在收到一个DD更新报文之后,OSPF路由器可以发现相邻信息不是比自己的更新就是比自己的更完全。如果是这样,路由器会发送一个或几个链路-状态请求报文给它的邻居(具有更新信息的路由器)以得到更多的链路状态信息。
请求的信息必须是非常具体的。它必须使用下面的标准规范指明所要求的数据:
•链路-状态(LS)类型号(1到5)。
•LS标识。
•通告路由器。
这些规范一起指明了一个具体的OSPF数据库子集,而不是它的一个事例。一个事例是与信息相同的子集,这个子集带有暂时边界(也就是时戳)。记住,OSPF是一个动态路由协议,它能对网络中链路状态的变化自动作出反应。因此,LS请求的接收者把对这些特定路由信息解释为最新数据。
4链路-状态更新报文

链路-状态更新报文用于把LSA发送给它的相邻节点。这些更新报文是用于对LSA请求的应答。有5种不同的LSA报文类型。这些报文类型用从1到5的类型号标识。
注意由于OSPF通常把链路-状态广播看作LSA,因此会存在潜在的混淆。然而,实际上用于更新路由表的机制为链路-状态更新报文—简记为LSU。还有另一个报文结构,链路-状态应答报文,简写为LSA;由于一些不可知的原因,这种报文称为链路-状态应答,而LSA通常是指更新报文。
这些报文类型及其LSA号,如下所述:
•RauterLSA(路由器LSA)(类型1)—路由器LSA描述了路由器链路到区的状态和耗费。所有这样的链路必须在一个LSA报文中进行描述。同时,路由器必须为它属于的每个区产生一个路由器LSA。所以,区边界路由器将产生多个路由器LSA,而区内的路由器只需产生一个这样的更新。
•NetworkLSA(网络LSA)(类型2)—网络LSA与路由器LSA相似,它描述的是连接进网络的所有路由器的链路状态和耗费信息。二者的区别是网络LSA是网络中所有链路-状态和耗费信息的总和。只有网络的指定路由器记录这个信息,并由它来产生网络LSA。
•SummaryLSA-IPNetwork(汇总LSA-IP网络)(类型3)—使用汇总LSA-IP这个名字有些不灵活,因此OSPF的设计者采用了编号策略来记LSA!只有OSPF网络中的区边界路由器能产生这种LSA类型。使用这种LSA类型把一个区的汇总路由信息和OSPF网络中相邻区路由器信息进行交换。它经常汇总缺省的路由而不是传播汇总的OSPF信息至其他网络。
•SummaryLSA-AutonomousSystemBoundaryRouter(汇总LSA-自治系统边界路由器)(类型4)—类型4与类型3LSA的关系密切。二者的区别是类型3描述区内路由,而类型4描述的是OSPF网络之外的路由。
•AS-外部LSA(类型5)—第5个LSA是自治系统外部LSA。正如其名,这种LSA用于描述OSPF网络之外的目的地。这些目的地可以是特定主机或是外部网络地址。作为和外部自治系统相联系的ASBROSPF节点负责把外部路由信息在它属于的整个区中传播。
这些LSA类型用于描述OSPF路由域的不同方面,它们直接寻址到OSPF区中的每一个路由器并同时传输。这样的洪泛确保OSPF区中的所有路由器关于网络的5个不同方面(LSA类型)有一样的信息。路由器完整的LSA数据存储在链路-状态数据库中。当Dijkstra算法应用于这些数据库的内容时会得到OSPF路由表。表和数据库的区别是数据库含有原始数据的完整集合,而路由表包含通过特定路由器接口到已知目的地的最短路径列表。
不必研究每种LSA类型的结构,只需研究它们的头就足够了。
1.LSA头
所有的LSA使用一个通用的头格式。这个头20字节长并附加于标准的24字节OSPF头后面。LSA头惟一地标识了每种LSA。所以,它包括关于LSA类型、链路-状态ID及通告路由器ID的信息。下面是LSA头域:
•LS年龄—LSA头中的前两个字节包含LSA的年龄。这个年龄是自从LSA产生时已消逝的时间秒数。
•OSPF选项—下面的字节由一系列标志组成,这些标志标识了OSPF网络能提供的各种可选的服务。
•LS类型—1字节LS类型指出5种LSA类型中的一种。每种LSA类型的格式是不同的。因此,指出何种类型的数据附加在头后面必不可少。
•链路-状态ID—链路-状态ID域4字节长用于指明LSA描述的特定网络环境区域。这个域与前面提及的LS类型域关系紧密。实际上,这个域的内容直接依赖于LS类型。比如,在路由器LSA中,链路-状态ID包含产生了这个报文的OSPF路由器ID——通告路由器ID。
•LS顺序号—OSPF路由器会递增每个LSA报文的序列号。所以,接收到两个相同LSA事例的路由器有两种选择来决定哪一个是最新的报文,LS顺序号域4字节长。检查这个域可以确定LSA在网络中已传输了多久。从理论上讲,一个新的LSA年龄比一个老的LSA年龄大是有可能的,特别是在大型复杂的OSPF网络中。所以,接收路由器比较LS顺序号。大号的LSA是最新生成的,这种机制不会因动态路由的变迁而受到损坏,而应认为其是一种更可靠的确定LSA时间的方法。
•LS校验和—3字节的LS校验和用于检查LSA在传输到目的地的过程中是否受到破坏。校验和采用简单的数学算法。它的输出结果依赖于其输入,并且有高度的一致性。给定相同的输入,校验和算法总是给出相同的输出。LS校验和域使用部分LSA报文内容(包括头,不包括LS年龄和校验和域)来生成校验和值。源节点运行Fletcher算法并把结果存于LS校验和域中。目的节点执行相同的算法并把结果与存储在校验和域中的结果比较,如果两个值不相同,就可以认为报文在传输过程中被破坏。之后,产生一个传输请求。
•LS长度—LS长度域用于通知接收方LSA的长度(以字节为单位),这个域1个字节长。
LSA报文体的剩余部分包含一个LSA的列表。每个LSA描述OSPF网络5个不同方面中的一个。所以,路由器LSA报文会广播区内已知存在的路由器信息。
2.处理LSA更新
OSPF路由表与其他路由表的本质区别是它的更新并不直接被接收站点所使用。从其他路由器接收到的更新包含“从发送路由器角度看”网络得到的信息。所以,在使用和解释接收到的LSA数据之前必须由Dijkstra算法,把它转化为自己本身的信息。
表面上讲,LSA的传输是因为一个路由器检测到了链路状态变化。所以,在接收到任何类型的LSA之后,OSPF路由器必须把LSA的内容和自身路由表的对应部分进行比较。只有通过SPF算法,使用新数据形成新的网络视图之后才能进行比较,SPF算法输出的结果是得到网络的新视图。这些结果与已存在的OSPF路由表相比较,看是否它的路由受到了网络状态变化的影响。
如果由于状态变化必须改变一条或多条路由,就要使用新的信息建造一个新的路由表。
3.复制LSA
考虑到LSA在整个OSPF区内洪泛,就有可能同时存在多个相同LSA类型的事例。因此,OSPF网络的稳定性要求路由器能够识别多个LSA中的最新者。收到两个或多个相同LSA类型的路由器会检查LSA头中的LS年龄、LS顺序号以及LS校验和域。只有包含在最新LSA中的信息才被接受,并且要经过前面一节中描述的处理过程。
4 链路-状态应答报文

第5种OSPF报文是链路-状态应答报文。OSPF的特点是可靠地分布LSA报文(LSA表示链路-状态通告(advertisement),通告而不是链路-状态应答),可靠性意味着通告的接收方必须应答。否则,源节点将没有办法知道是否LSA已到达目的地。因此,需要一些应答LSA接收的机制。这个机制是链路-状态应答报文。
链路-状态应答报文惟一地标识其要应答的LSA报文。标识以包含在LSA头中的信息为基础,包括LS顺序号和通告路由器。LSA与应答报文之间无需1对1的对应关系。多个LSA可以用一个报文来应答。
5 计算路由

OSPF虽然很复杂,却使用下面两种相当简单的方法之一计算路由耗费:
•非带宽敏感的缺省值可以用于每一个OSPF接口。
•OSPF能自动计算使用每个路由接口的耗费。
不管使用哪种方法,任何一条路由的耗费可以通过把路由上遇到的每个路由器接口耗费加起来得到。在OSPF的最短路径树中记录了每一个已知目的地的和耗费。


相关内容