RFC3093_防火墙增进协议 (FEP)

739次阅读  |  发布于5年以前

组织:中国互动出现网 (http://www.china-pub.com/) RFC文档中文翻译计划 (http://www.china-pub.com/computers/emook/aboutemook.htm) E-mail: ouyang@china-pub.com 译者:李全胜 (ghll ghll@371.net) 译文发布时间: 版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须保留本文档的翻译及版权信息。

Network Working Group J.Moy Request for Comments: 1131 Proteon, Inc. October 1989

OSPF 规范 (The OSPF Specification)

本备忘录的状态 本文档讲述了一种Internet社区的Internet标准跟踪协议,它需要进一步进行讨论和建议以得到改进。本备忘录的发布不受任何限制。

目 录 1.介绍 5 1.1 协议概述 5 1.2 定义常用术语 6 1.3 基于SPF路由技术的简要历史 7 1.4 文档的组织 7 2.拓朴数据库 8 2.1 最短路径树 12 2.2 使用外部路由信息 13 2.3 等价的多条路径 14 3.自治系统的区域划分 14 3.1 自治系统的主干 14 3.2 区域间路由 15 3.3 路由器的分类 15 3.4 一个区域配置的例子 15 3.5 支持IP子网 19 3.6 区域分割 20 4.功能汇总 20 4.1 区域间路由 21 4.2 自治系统外部路由器 21 4.3 路由协议包 21 4.4 基本实现要求 22 5. 协议数据结构 23 6. 区域数据结构 24 7. 生成邻接 25 7.1 Hello协议 25 7.2 同步数据库 26 7.3 指定路由器 26 7.4 后备指定路由器 27 7.5 邻接图 27 8. 协议包处理 28 8.1 传送协议包 28 8.2 接收协议包 30 9. 接口数据结构 31 9.1 接口状态 32 9.2 事件引起的接口状态变化 33 9.3 接口状态机 34 9.4 选举指定路由器 35 9.5 发送Hello包 36 9.5.1 在非广播网络上传输Hello包 36 10.邻居数据结构 37 10.1 邻居状态 38 10.2 引起邻居状态变化的事件 39 10.3 邻居状态机 40 10.4 是否成为邻接 43 10.5 接收呼叫包 43 10.6 接收数据库描述包 44 10.7 收到连接状态请求包 45 10.8 发送数据库描述包 45 10.9 发送连接状态请求包 45 10.10 一个示例 46 11.路由表结构 46 11.1 两个例子 48 12.连接状态公告 49 12.1 连接状态头 50 12.1.1 LS类型 50 12.1.2 连接状态ID 50 12.1.3 公告路由器 51 12.1.4 LS顺序号 51 12.1.5 LS生存期 52 12.1.6 LS检查和 52 12.3 组织连接状态公告 53 12.3.1 路由器连接 54 12.3.2 网络连接 56 12.3.3 汇总连接 56 12.3.4 自治系统外部连接 57 12.4 TOS尺度 58 13 传播过程 59 13.1 确定哪个连接状态是更新的 59 13.2 在数据库中完装连接状态公告 60 13.3 在传播过程中的下一步 60 13.4收到自己组织的连接包 61 13.5 发送连接状态确认包 61 13.6 重传连接状态公告 62 13.7 接收连接状态确认 63 14 连接状态数据库的生存期 63 15 虚拟连接 63 16 计算路由表 64 16.1 计算一个区域的最短路径树 65 16.1.1 下一跳的计算 67 16.2 计算区间路由 67 16.3 解析虚拟下一跳 68 16.4 计算自治系统外部路由 68 16.5 增量更新——汇总连接 69 16.6 增量更新——自治系统外部连接 69 16.7 路由表变化引起的事件 69 16.8 等价多路径 70 附录A 包格式 72 A.1 OSPF包的封装 72 A.2 OSPF包头 73 A.3 连接状态(LS : Link State)公告头 73 A.4 Hello包 74 A.5 数据库描述包 75 A.6 连接状态请求包 76 A.7 连接状态更新包 77 A.7.1 路由连接公告 77 A.7.2 网络连接公告 79 A.7.3 汇总连接公告 79 A.7.4 自治系统外部连接公告 80 A.8 连接状态确认包 81 附录B 结构常量 82 附录C 可配置常数 83 C.1 全局参数 83 C.2 区域参数 83 C.3 路由器接口参数 83 C.4 虚拟连接参数 84 C.5 非广播、多路存取网络参数 85 C.6 主路由参数 85 D 必要的统计信息 86 D.1 日志信息 86 D.2 累计统计 87 E 认证 90

1.介绍 本文档是关于最短路径优先(OSPF)互联网路由协议的规范。OSPF归为内部网关协议(IGP),意味着它在单个自治系统内的路由间分发路由信息。OSPF协议基于SPF或链接状态技术,这与基于Bellman-Ford的传统路由协议(距离向量)是不同的。 OSPF协议是由Internet工程任务组的OSPF工作组开发,它专为互联网环境设计,明确支持IP子网,基于TOS(服务类型)的路由和由外部驱动触发的路由信息。OSPF提供路由更新身份确认,利用IP组播传送/接收更新。另外,大量的工作是实现用最少的路由协议传送,达到在网络拓朴改变时快速响应的协议。 作者感谢Rob Coltun,Milo Medin,Mike Petry 和其它为OSPF工作组提供建议和对这个项目提供支持的人们。

1.1 协议概述 OSPF路由IP包只基于IP包头中的目的IP地址和IP服务类别。IP包被路由,即当包在自治系统内传输时不封闭任何更多的协议头。OSPF是一个动态路由协议,它可以快速确定在自治系统内的拓朴改变及在一个收敛周期内计算出新的无回路路由。这个收敛周期很短,只有少量的路由通信。 在一个基于SPF路由协议中,每一个路由器管理一个描述自治系统拓朴的数据库。每个参于的路由器有相同的数据库,数据库中的每条是一个路由器详细的本地状态(如路由器使用的接口和可以到达的邻居)。路由器使用洪泛通过自治系统分发它的本地状态。 所有的路由器并行执行同样的算法,每个路由器通过拓朴数据库以自己为根构造一个最短路径树,这个最短路径树给出在自治系统内到每个目的地的路由。外部驱动的路由信息的为树的叶结点。 OSPF对每一种服务类型(TOS)单独计算路由,当到一个目的地存在多条相等代价的路由时,通信将在他们之间平分。路由的代价是用一种简单的无尺寸度量的。 OSPF允许多个网络组成一个组,这个组叫做区域,一个区域中的拓朴信息对自治系统的其它区域是不可见的。这种信息隐藏能够减少相当多的路由通信。另外,在一个区域内部路由的确定仅需要区域本身的拓朴信息,主要保护区域内不受坏的路由数据影响。一个区域是一个普通的IP子网网络。 OSPF使用灵活的IP子网配置,OSPF分发的每条路由都含有目的地址和子网掩码。使用同一IP网络号的两个不同子网会有不同的网络尺寸(如不同的掩码)。通常称为可变长子网。包在路由时做最优匹配(使用最长子网掩码)。单机路由可考虑为子网掩码全为1(即0XFFFFFFFF)。 所有的OSPF协议交换是有认证的,即只有信任的路由器能参与自治系统的路由交换,可以使用多种认证方案,一个区域只有使用一种认证方案,这可使一些区域使用比其它区域更严格的认证。 外部驱动的路由信息(如从外部网关协议(EGP)学习的路由)透明地穿过自治系统。这些外部分驱动的路由信息和OSPF协议的链接状态数据是保持分离的。每条外部分路由都被公告路由标记,并在自治系统的边界路由器间传递附加的信息。 1.2 定义常用术语 下面选择一些在本文中针对本协议有特殊含义的术语定义,如果读者对互联网络协议族不是很熟悉,请参阅[RS-85-153]里关于IP的介绍。

路由(Router) 一个第三层网络协议包交换设备,在以前的IP文档中也叫网关。 自治系统(Autonomous System) 在相同的路由协议下的一组交换路由信息的路由器的称呼,缩写为AS。

内部网关协议(Internal Gateway Protocol) 在自治系统内路由器使用的路由协议。缩写为IGP。每个自治系统只能有一个IGP。不同的自治系统可以运行不同的IGP。

路由器ID(Router ID) 运行OSPF协议的路由器的一个32位的标识符。在自治系统内这个值唯一标识一个路由器。

网络(Network) 在本文档内,指一个IP网络或子网。一个物理的网络可被赋于多外IP地址或子网地址,我们认为这是分别的网络。点对点的物理网络除外——不管他们连接了多少的IP网络或子网数,他们都被视为单个网络。

网络掩码(Network mask) 在单个IP网络或子网中用32位数来标识一组IP地址范围。这个规则要求显示网络掩码使用16进制数。如,对一个C类网络的IP地址掩码显示为0XFFFFFF00。这个掩码在文档中一般书写为255.255.255.0。

多路访问网络(Multi-access networks) 这些物理网络支持连接到多个路由器(超过两个),连接在一块的每对路由都可以支持通信(不含多点网络)。

接口(Interface) 连接路由和网络接头的连接器。一个接口有一个相关的状态信息,可从低层的网络协议和自身的路由协议中获得。一个接口到一个网络有一个关联的单个IP地址和掩码(除非网络是未编号的点对点网络)。一个接口常常作为一个连接。

邻近路由(Neighboring routers) 两个路由的接口在同一个网络内。在多路访问网络中,邻近路由是通过Hello协议动态发现的。

邻接(Adjacency) 在选定的邻近路由器中的关系表,用来交换路由信息。并不是每对邻近的路由器都可以成为邻接。

连接状态公告(Link state advertisement) 提交的本地网络或路由器的状态,包含路由器的接口及邻接的状态。每个连接状态公告将传播到整个路由范围内。从所有路由器和网络得到的连接状态公告形成协议的拓朴数据库。

Hello协议(Hello protocol) 是OSPF协议的一部分,用来建立和管理主要的邻近关系。在多路访问网络中,Hello协议可动态地发现邻近路由器。

指定路由器(Designated Router) 在多存存网络中在至少两个路由器中有一个是指定路由器。指定路由器在多路访问网络中生成连接状态公告及在运行协议中的特殊责任。指定路由器由Hello协议选出,指定路由器的概述可在多路访问网络中减少邻接请求的数量,同时也就减少了大量的路由协议传递和拓朴数据库的尺寸。

低层协议(Lower-level protocols) 为网际协议和OSPF协议提供服务的低层网络存取协议。如公共数据网(PDNs)提供的X.25和帧中继,以太网中的以太网数据链接层。

1.3 基于SPF路由技术的简要历史 OSPF是基于最短路径优先(SPF)的路由协议。这个协议可以在连接状态或分布式数据库协议的文献中查到。本节给出在OSPF协议中发展的基于SPF技术的一个简要历史。 第一个基于SPF技术的路由协议用于ARPANET网络的包交换上,这个协议在[McQuilan]中有描述,它是所有其它基于SPF技术协议的起点,在相同的Arpanet环境,如在同步串行线路上单厂家包交换,原始协议的简单设计和实施。 在[Perlman]中提议修改本协议,修改的细节增加了路由协议的容错,还有其它的一些,如增加了连接状态公告的校验(测试数据库的错误)。这个本文还包含有关于减小基于SPF协议的路由信息头的意见,通过一种类似于棒棒糖形状的顺序空间来同步拓拓朴数据库,形成新的邻接表,在连接状态公告的间隔时间会增加一定的数据量。 ISO的IS-IS路由协议也是基于SPF技术实现的路由协议,这个协议在[Dec]中有描述。它包含一些在广播网络上减少数据和路由传输的方法,实现方法是在每个广播网络中指定一个指定路由器,由指定路由器生成本网络的连接状态公告。 Internet工程任务组(IETF)下的OSPF小组委员会在OSPF协议中发展了这项工作,指定路由的概念大大减少了路由传输需求的数据量。组播的使用更尽一步地减少了路由对带宽的使用。一个能使用信息隐藏/保护/简化的区域路由方案已经开发了出来。最后,按照在互联网环境下高效操作要求对这个算法作了修改。

1.4 文档的组织 本规范的前三章给出了协议的功能和作用的简要概述,第4-16章详细解译了协议的机制。附录中包含了包格式,协议组成,配置项目和管理要求统计。 在文本中像Hello间隔这样的标识是受协议约束的,可以配置或不配置。结构约束在附录B中描述,配置约束在附录C中描述。 协议的详细描述在数据结构的每项中提供,这样做是想按顺序提供更有价值的说明,实现协议需要支持功能描述中的细节,但不必要使用本文档中准确的数据结构。

2.拓朴数据库 自治系统的拓朴数据库描述为一个有向图,图的端点由路由器和网络组成,一个物理上的点对点网络表示为图上边界的两个路由器的连接。边界连接的是一个路由器在网络上的一个接口。 图的端点可用相应的功能表示,只有一些类型能传输数据,通信既不是本地组织的也不是传往本地的。端点能传递信息的在图上用进或出的箭头表示。 端点类型 端点名称 可传输数据 1 路由器 可以 2 网络 可以 3 根网络 不可以 OSPF支持以下类型的物理网络:

点到点网络 一个网络连接只两下路由器。一个56K的串行线路是一个点到点网络的例了。 广播网络 支持多个(超过两个)连接的路由器,具有将单个物理信息传递到所有连接的路由器的能力(广播)。邻接路由器使用Hello协议动态地发现。Hello协议本身就使用广播方式。如果支持组播,则协议尽一步使用组播的功能。以太网是广播网络的一个例子。 无广播网络 支持多个(超过两个)连接的路由器,但没有广播的功能。邻接路由器通过使用Hello协议的网上发现。然而由于缺乏广播功能,对于Hello协议的正确运行需必要的配置信息。在这样网络上,OSPF协议包正常通过组播传到每一个邻接路由器上,一个X.25公共数据网(PDN)就是无广播网络的例子。

在图上,每个网络结点的邻居依靠网络是否支持多路访问能力(广播或无广播)决定,路由器有一个接口在这个网络上。图1中用三种情形表示。方框表示路由器,长方形椭圆表示多路访问网络。路由器的名字用加前缀RT表示,网络用加前缀N表示。路由器的接口名字用加前缀I表示,在路由间的点对点网络用直线表示。左边的图表示一个网络和它连接的路由器,右边为结果图示。

物理点到点网络

多路访问网络

多路访问根网络 图1:网络组件图 点对点网络中的两个路由器在连接图上用有向线的边界表示,每个方面一条线。物理点对点网络的接口不必要标识IP地址。这种点对点网络称为无编号。这样图形可以正常支持这种无编号点对点网络的表示。当存在接口地址时,可以做为根路由模式。每一个路由都会有根连接到其它的路由器的接口地址(参见图1)。 当多个路由器连接到多路访问网络时,有向线表示所有的路由和网络结点是双向连接的。如果只有一个路由器连接到多路访问网络上,网络上出现一个有向的根连接图示。

图2 一个自治系统示例 每一个网络(根或横越)在图上都有IP地址和网络掩码。这个掩码指示网络结点的数量。直接和路由器(指主机路由)连接的主机在图上显示为根网络。主机路由的网络掩码一般为0XFFFFFFFF,表示是一个单结点。 图2是一个自治系统图的例子,标有H1的方框表示一个主机,通过一条串行线路接口协议(SLIP)连接到路由器RT12,路由器RT12因此公告一条主机路由,和路由器之间的线路表示一条物理的点对点网络。唯一条点赋有IP地址的点对点网络是在RT6和RT10之间的连接。路由器RT5和RT7通过外部网关协议(EGP)连接到其它自治系统。所有的路由器上都将有从EGP学来的路由信息集。 图3 方向图结果表示 在每个路由器的接口输出端都有相关联的代价值,这个代价值是由系统管理员配置的,越低的代价值,接口就越使用它进行数据通信。由外部驱动的路由数据同样有相关联的代价值(如从外部网关协议(EGP)学习的路由)。 图4单独连接状态组件 图2的有向图结果描绘在图3中,在弧线上标有相关路由器输出接口的代价值。弧线上无标识的代价为0。注意从网络到路由器的弧线永远都是0,另外外部驱动的路由数据在图上表示为根。 拓朴数据库(即出现在有向图上的信息)是从路由器生成的连接状态公告中一条条的收集而成。每个传输端点的邻居表示为单个的,独立的连接状态公告。图4显示了两种传输端点的连接状态表示的图形:路由器和多路访问网络。路由器R12有一个接口到两个广播网络和一个由SLIP连接的主机。网络N6是带有三个路由器的广播网络。所有从网络N6到相连接路由器的代价都为0。网络N6的连接状态公告是由与它相连的一个路由器生成的:即在这个网络中被选定的指定路由器的那个路由器。 图5 路由器RT6的最短路径树

2.1 最短路径树 当没有OSPF区域配置时,在自治系统内的每个路由器有相同的拓朴数据库,用相同的图形表示。路由器用自己作为根计算最短路径树来生成它的路由表,显然,最短路径树依赖于路由器的计算。路由器RT6的最短路径树在图5中表示。 这个树给出了到任何目的网络或主机的整个路由。然而,在向前传输数据时只使用到目的地的下一跳的路由。但到任一个路由器的最优路由都经过了计算。在处理外部数据时,我们注意到下一跳和任一路由器的距离都公告到外部路由器上。路由器RT6最后的路由表见表1。到任一编号的串行线路都有单独的一条路由(如在RT6和RT10间的串行线路)。 目的 下一跳 距离 N1 RT3 10 N2 RT3 10 N3 RT3 7 N4 RT3 8 Ib

7 Ia RT10 12 N6 RT10 8 N7 RT10 12 N8 RT10 10 N9 RT10 11 N10 RT10 13 N11 RT10 14 H1 RT10 21

RT5 RT10 6 RT7 RT10 8 表1 路由器RT6本地目的地的部分路由列表 路由器(如N12)到其它自治系统的网络的最短路径在图5上用虚线表示,使用这种外部驱动路由信息在下一章进行讨论。

2.2 使用外部路由信息 外部路由信息在树生成后进行检查,这些路由信息可能由如外部网关协议(EGP)生成,或者是由手工配置(静态路由)。缺省路由也作为外部路由信息的组成部分。 外部路由信息不加修改地在自治系统内传播。在我们的例子中,在自治系统中的所有的路由器都知道路由器RT7有两个外部路由,尺度分别为2和9。 OSPF支持两种类型的外部尺度,类型1的外部尺度和连接状态尺度相同,类型2的外部尺度大于任何内部到自治系统路径的代价。使用类型2的外部尺度假设在自治系统的路由之间路由包是主要的化费,并且排除转换外部化费到内部连接状态尺度的需要。 这儿有一个处理类型1的外部尺度的例子,假定路由器RT7和RT5在我们的例子中是公告类型1的外部尺度,对每一个外部路由,到路由器RT6的距离被计算并作为外部路由的化费的汇总和公告路由器到路由器RT6的距离。对每一个外部的目的地,路由公告的最短路由被发现,到公告路由器的下一跳成为到目的地的下一跳。 路由器RT5和RT7都公告到目的网络N12一条外部路由,路由器RT7被选中,因为公告到N12的到路由器RT6的距离为10(8+2),它比路由器RT5的距离14(6+8)要优。表2显示了外部路由检查后加到路由表中的整个内容。 目的地 下一跳 距离 N12 RT10 10 N13 RT5 14 N14 RT5 14 N15 RT10 17 表2 路由器RT6外部目的地的部分路由列表 处理类型2的外部尺度相对简单。自治系统边界路由器选择最短的外部路由进行公告,不论它到自治系统边界路由器的内部距离。在我们的例子中,假定路由器RT5和RT7都公告类型2的外部路由,那么所有目的地为网络N12的通信将传向路由器RT7,因为2<8。当存在多个类型2的路由代价相等时,到公告路由器的内部距离将用来打破这种局面。 所有类型1和类型2的外部尺度可能同时在自治系统内同时出现,这时,类型1的外部尺度总是优先使用。

2.3 等价的多条路径 上面讨论是只是简单考虑只有一个路由器到达任何地点的情形。实际中,如果多条到达目的地的等价路由存在,他们都将被发现并使用。这不需要改变算法,我们将放到考虑生成树处理时讨论它的的细节。 由于有多路代价相等,路由器就有多条可用的下一跳通往给定的目的地了。

3.自治系统的区域划分 OSPF允许把连邻接的网络和主机选到一起作为组,对于一个组,组内路由器的接口连接的网络内的设备,统称为一个区域。每个区域运行独立的基于SPF路由算法的拷贝。这意味着每个区域有自己的拓朴数据库和相应的图,就和上节解释的一样。 区域的拓朴结构对区域外部是不可见的。相反,给定区域内的路由器对本区域外的拓朴结构细节是一无所知的。这种隔离技术使得协议和把整个自治系统作为一个SPF域相比在路由传输上会有相当显著的减少。 在介绍区域时,在自治系统内所有路由器拥有相同的拓朴数据库不再是准确的了,一个路由器实际上对于它所连接的区域有独立的拓朴数据库(连接多个区域的路由器叫边界路由器)。两个属于同一区域内的路由器,仅在那个区域,有同样的区域拓朴数据库。 发生在自治系统内的路由有两级,依据源和包的目的地址是在相同区域内(使用区域内路由)或不同区域内(使用区域中路由)。在区域内路由,包被路由只需要区域内的信息即可,不需要使用从外区域得到的路由信息,这样可保护区域内路由不会注入错误的路由信息。我们将在第3.2节讨论区域中路由。

3.1 自治系统的主干 组成主干的网络将不含在任何区域内,主干所连接的路由器属于多个区域。主干必须是连续的。 有可能在定义区域时造成主干不再连续,如果出现这种情况,系统管理员就通过配置虚连接恢复主干的连通。 虚拟连接可以在一个普能的无主干区域内有接口的两个主干路由器间配置连接。虚拟连接属于主干。协议认为通过虚拟连接连能的两个路由器像通过无编号的点对点网络连通一样。在主干的图示上,这样的两个路由器上的弧线上标示的代价为两个路由器在内部区域内的距离。通过虚拟连接的路由协议传输就像在内部区域内路由一样。 主干负责在区域间传播路由信息。 主干有一个区域的所有属性。对每一个区域主干的拓朴结构都是不可见的,当然主干自己也不知道区域的拓朴结构。在增加虚拟连接之前,主干可能存在多个组件,这些组件中任何一个的路由都不会受任何区域生成的信息的影响。沿着虚拟连接的路由当然受到相关区域的拓朴指示。

3.2 区域间路由 在两个区域中间路由时要使用主干,包传递的路径可分为三个连续的片段:从源到区域边界路由器的区域内路径,在源和目的区域间的主干路径,和到目的区域的另一个区域内路径。算法找到具有最小代价的一组路径集。 从另一个角度来看,区域中间路由可以表示成在自治系统内的星形结构,主干相当于一个集线器(HUB)和每个区域相接。 主干的拓朴指出在区域间主干的路径。主干的拓朴可以用增加虚拟连接的方式增强,这可以给系统管理员通过路由器对区域间的通信做一些控制。 包存在于源区域时,选择正确使用的区域边界路由器,同样也选择用来做为外部路由公告的路由器。在一个区域的每一个区域边界路由器都汇总本区域到外部区域的所有网络的代价。在这个区域的最短路径树计算出来后,计算到其它网络的路由来核对区域边界路由器的汇总信息。

3.3 路由器的分类 在区域介绍之前,只有一些OSPF路由器有公告外部路由信息的特殊功能,如图2中的路由器RT5。当自治系统划分了OSPF区域后,路由器按针对功能细化为以下四种有重叠操作的四类:

内部路由器(Internal routers):路由器连接的所有网络都在同一个区域内。和主干只有一个接口的路由器也属于此类。这些路由器只运行一份基本的路由算法。

区域边界路由器(Area border routers):所有不是内部路由器的路由器。边界路由器运行多份基本路由算法,针对每个连接的区域运行一份,针对主干运行一份。区域边界路由器浓缩和它连接的区域的拓朴信息然后分发给主干,主干再分发信息到其它区域。

主干路由器(Backbone routers):有一个接口在主干的路由器,包含接口在多个区域的所有路由器(如区域边界路由器)。然而,主干路由器不能作为区域边界路由器。所有接口都连接在主干的路由器划分为内部路由器。

自治系统边界路由器(AS boundary routers):和其它自治系统的路由器交换路由信息的路由器。该路由器向自治系统公告它有的自治系统外部路由。在自治系统中的每一个路由器都知道到自治系统边界路由器的路径。这个分类完全不靠前面的分类:自治系统边界路由器可以是内部或区域边界路由器,有可能参与主干。

3.4 一个区域配置的例子 图6显示一个区域的配置实例,第一个区域由N1-N4组成,属于它的路由器为RT1-RT4。第二个区域由N6-N8网络组成,属于它的路由器为RT7,RT8,RT10和RT11。第三个区域由N9-N11网络和主机H1组成,属于它的路由器为RT9,RT11和RT12。在公告外部路由到该区域时,由网络N9到N11和一个主机H1组成的第三区域经过配置,组合成一条路由(更多细节见3.5节)。 在图6中,RT1、RT2、RT5、RT8、RT9和RT12是内部路由器,RT3、RT4、RT7和RT10是区域边界路由器,最后,RT5和RT7属于自治系统边界路由器。 图7显示区域1的拓朴数据库的结果,图于完全描述了区域中的内部路由器,同时了完全显示了内部路由器RT1和RT2的网络互联。作为区域边界路由器的工作,RT3和RT4向区域1公告所有目的地为外部区域的距离,在图7中用短虚线表示路由。同样,RT3和RT4必须公告自治系统边界路由器RT5和RT7的位置到区域1中。最后,从路由器RT5和RT7的外部公告将在整个自治系统内传播,部分穿过区域1。这些公告将包括区域1的数据库和到网络N12-N15的路由。 路由器RT3和RT4必须汇总区域1的拓朴分发给主干,主些主干的公告在表3中显示。这些汇总显示了包含在区域1的中网络(如网络N1-N4)及RT3和RT4到这些网络的距离。 图6 一个OSPF区域配置示例 主干的拓朴数据库在图8中表示。图中的路由器集为主干路由器。路由器R11因为它属于两个区域划分主干路由器。为了保持主干的连接,在路由器R10和R11间配置了虚拟连接。 此外,路由器RT3、RT4、RT7、RT10和RT11属于区域边界路由器,像上面的路由器RT3和RT4一样,他们聚合联结的区域路由信息分发到主干,即出现在图8中的短虚线。路由器RT5和RT7是自治系统边界路由器;图8中用短线表示他们的外部驱动路由信息。 图7:区域1的数据库 图8:主干的数据库 主干使在区域边界路由器间交换汇总信息成为可能,每个区域边界路由器听取所有其它区域边界路由器的区域汇总,通过检查收集到的公告,再加上在主干中到每个公告路由器的距离,生成一张到它区域外部所有网络距离的图形。 网络 RT3公告 RT4公告 N1 4 4 N2 4 4 N3 1 1 N4 2 3 表3:路由器RT3和RT4向主干公告的网络信息 再用路由器RT3和RT4作为例子,执行过程为:首先计算主干的最短树径树(SPF),它可以给出到其它区域边界路由器的距离。需要注意的是到网络和自治系统边界路由器的距离都属于主干,在表4中显示了这个计算结果。 区域边界路由器 从RT3的距离 从RT4的距离 到RT3 * 21 到RT4 22 * 到RT7 20 14 到RT10 15 22 到RT11 18 25

到Ia 20 27 到Ib 15 22

到RT5 14 8 到RT7 20 14 表4:路由器RT3和RT4计算的主干距离 下一步,查看人这些区域边界路由器来的区域汇总,RT3和RT4能确定到它区域外的所有网络的距离,这些距离再通过RT3和RT4公告到本区域内。表5中为RT3和RT4公告到区域1的信息。 距离 RT3公告 RT4公告 Ia,Ib 15 22 N6 16 15 N7 20 19 N8 18 18 N9-N11,H1 19 26

RT5 14 8 RT7 20 14 表5:由路由器公告到区域1的目的地 这些信息使区域1中的内部路由器,如RT1,可以智能地选择区域边界路由器。路由器RT1将使用RT4和网络N6通信,使用RT3和网络N10通信,将在这两者间负载平衡地和网络N8通信。 重复这种逻辑,路由器RT1能决定通过RT5和RT7和目的地在另一个自治系统通信(N12-N15的网络)。 路由器RT6和RT10之间线路的故障会引起主干断路。在路由器RT7和RT10之间配置另一个虚连接可以给主干提供更在上述故障时的连通。在路由器RT7和RT10之间的虚连接了可在第三区域(包含N9)和路由器RT7之间允许更短的路径,可以向外部网络N12公告一条更好的路由。

3.5 支持IP子网 OSPF在公告路由时会附加IP地址的掩码,这个掩码指示特定路由所对就的地址范围。如汇总公告目的地址为128.185.0.0的掩码为0XFFFF0000准确描述了一个到目的地址128.185.0.0-128.185.255.255集的路由。同样,主机路由总是使用0XFFFFFFFF做为掩码,表示只有一个目的地址。 目的地址带有掩码的每一条公告使实现通常称为可变条子网掩码成为可能。这意味道单一的A、B和C类IP地址可以被分为不同尺寸的多个网络。如网络128.185.0.0可被分为64个可变尺寸的子网:16个大小为4K的子网,16个大小为256的子网,32个大小为8的子网,下表为一些用此掩码的网络地址: 网址 IP地址掩码 子网大小 128.185.16.0 0XFFFFF000 4K 128.185.1.0 0XFFFFFF00 256 128.185.0.8 0XFFFFFFF8 8 有多种方法来划分A、B和C类网络为可变大小的子网,讲解这些方法已超出本规范的范围,本文给出以政提示:当一个IP包被传输时,总是传到和包目的地址最佳匹配的网络。这个最佳匹配和最长或最多细节匹配是同义的。如缺省路由地址为0.0.0.0,掩码为0XFFFFFFFF表示所有的IP地址,但和其它匹配相比细节最少。带子网掩码对任何目的IP地址的最佳匹配都没有二义性。 OSPF区域的概念模型是在IP子网之后,OSPF区域是网络集合的松散定义。实际上,OSPF区域是指定的一系列地址范围(细节参见C.2节)。每个地址范围定义为一对[地址,掩码]。多个单独的网络可以包含在一个单独的地址范围内,就像一个子网可以包含多个单独的子网一样。区域边界路由器合并区域的范围(分发到主干)对每个地址范围公告一条路由。路由的代价为在特定范围内到任意网络的最小代价。 例如,一个IP子网可以配置为一个OSPF区域。这样,这个区域将只定义一个地址范围:对于A、B和C类网络使用其自然IP掩码。在区域内,可定义任意数量的变长子网,对区域外,对整个子网只向外分发一条路由,根本上隐蔽了网络子网化的事实。这条路由的代价取子网组件中代价最小的值。

3.6 区域分割 OSPF不会自动修复分割的区域。当一个区域被分割时,每个组件简单成为一个独立的区域。主干在新区域间形成路由,一些在分割前区域内的路由现在将需要区域间的路由了。 在上一节中,一个区域是一系列地址范围的描述,任何一个特定的地址范围在区域分割时必须保持为单独的组件。这样使得区域组成可汇总到主干。当然,主干自己是不能被分割的,如果那样做的话,自治系统的部分区域将变得不可到达。 另一种考虑区域分割的方法是年第2章中对自治系统介绍的图形。区域ID号可被图形端点的颜色标示。每个图形的端点连接一个网络,或者是一个点对点网络,这样端点用颜色标示着网络的区域ID值。 一组端点,用同一种颜色表示,有矢量线相连,表示一个网络。如果一个自治系统的拓朴是完整的,图形中将有多种颜色,每种表示不同的区域ID。 当自治系统的拓朴改变时,区域中的一个可能会被分割,自治系统的图形中将有相同颜色的多个区域(区域ID),自治系统的路由将继续有效,直到这些相同颜色的区域被单个主干相连接。

4.功能汇总 每个区域运行一份独立的基本路由算法。路由器到多个区域的接口将运行多份基本算法的拷贝。结基本算法作如如下汇总: 当一个路由器启动时,第一步初始化路由协议的数据结构,接着路由器等待接口功能的低层协议的指示信息。 路由器接着使用Hello协议获得邻居,路由器向它的邻居发送和接收Hello包。在广播网络,路由器使用组播地址发送Hello包,动态检查邻近路由器。在多路访问网络,Hello协议使用网络选出的指定路由器。 路由器使用它最新收到的邻居信息生成邻接表,拓朴数据库在邻接路由器间同步生成。在多路访问网络,指定路由器确定哪个路由器作为邻接。 邻接控制路由协议包的发送,路由协议包只在邻接路由器上发送和接收。一个路由器的邻接被它的连接状态公告的内容面改变。在邻接和连接状态之间的关系允许协议适时地检测无效的路由器。 连接状态公告将在整个区域内传播。这种传播算法的可造靠的,确保一个区域内的所有路由器有相同的拓朴数据库。这个数据库包含从属于这个区域内每个路由器收到的连接状态公告的集合。从这个数据库中,每个路由器依自己为根,计算一份最短路径树,这个最短路径树即为协议的路由表。

4.1 区域间路由 前一节描述了在单一区域内的协议操作,对于区域内路由,没有其它相关的路由信息。为了能路由到区域外的目的地址,区域边界路由器在区域中加入了附加的路由信息,这个附加的路由信息是自治系统中其余部分的拓朴精华。 这个精华的来源为:每个区域边界路由器被定义连接到主干,每个区域边界路由器汇总它所连接的区域拓朴信息后传输到主干,当然也传到其它区域边界路由器。这样区域边界路由器就有了关于主干的完整的拓朴信息,并且从每一个其它区域边界路由器得到区域汇总。根据这些信息,路由器就可计算出不含它所连接的区域的所有目的地址的路径。路由器接着将这些路径公告到它所连接的区域,这使得区域内的路由器在往区域外的目的地址传输时使用最好的出口路由器。

4.2 自治系统外部路由器 有关于其它自治系统信息的路由器可以把这个信息在整个自治系统中传输。这些路由被逐字分发到每个参与的路由器。 为了利用这些信息,在整个自治系统内到路径连接的所有的路由器都必须知道这些外部驱动信息。因为这个原因,区域边界路由器汇总了这些自治系统边界路由器的位置。

4.3 路由协议包 OSPF协议直接在IP上运行,使用IP协议89。OSPF不提供显式的分块和组合支持。当必须要分块时,IP分块和组合被使用。OSPF协议包已设计为将大的协议包可以按一般方式分为若干个小的协议包。这是被推荐的惯例;IP分块在可能情况下都会避免使用。 路由协议包在传输时IP的服务类型(TOS)字段总是设为0。在可能情况下,当同时传送和接收时,路由协议包的优先权应高于普通IP数据包。作为实现的辅助,OSPF协议包应当在互联网控制数值中有自己的IP优先级字段(参见RFC791)。 所有的OSPF协议包共享一个普通的协议包头,在附录A中描述。OSPF定义如下的包类型,他们的格式也将在附录A的描述。 OSPF的Hello协议使用Hello包去发现和管理邻接关系。数据库描述和连接状态请求包用来生成邻接表。OSPF的可靠更新机制是告连接状态更新和连接状态确认包实现的。 类型 包名字 协议功能 1 Hello 发现/管理邻居 2 数据库描述 汇总数据库内容 3 连接状态请求 数据库下载 4 连接状态更新 数据库更新 5 连接状态确认 回复确认 每个连接状态更新包带着距组织点一跳距离的新连接状态集合的公告,单个连接状态更新包会包含多个路由器的连接状态公告。每个公告标示有组织路由器的ID值和连接状态内容的检查和。一个连接状态公告可能是四种类型的一种,将拓朴数据库分为四类:

路由器连接公告:由所有路由器组织,这种公告描述了一个区域内路由器的接口状态,只传输到单个区域中。

网络连接公告:由广播网络组织,这种公告包含连接到网络的一系列路由器,只传输到单个区域中。

汇总连接公告:由区域边界路由器组织,传播到相连接的区域。描述到外区域的一条路由,但还是在自治系统内。(如区域间路由器)

自治系统外部连接公告:由自治系统边界路由器组织,传播到整个自治系统。由目的地为另一个自治系统的路由组成。 如上所述,OSPF路由包(除Hello包)仅在邻接中传输。即总味着所有协议包只传输一个IP跳数,除了在虚拟邻接上传输的包。这些OSPF协议包的IP源地址是一个路由器邻接的端点,目的地址是另一个邻接的端点或IP组播地址。

4.4 基本实现要求 实现OSPF需要下列系统支持几条:

计时器:需要两种不同类型的计时器,第一种称为单发计时器,一次点火,引发处理协议动作。第二种称为间隔计时器,在连续的时间间隔点火,用于在定期的时间间隔内传输包,一个很好的例子就是定期广播的Hello包(在广播网络)。这两种计时器的精度要求均为秒。

IP组播:某些OSPF包使用IP组播。支持发送和接收IP组播,需要适当的低层协议支持。这些IP组播包的传输不会超过一跳。关于IP组播参见RFC1112。

低层协议支持:低层协议在这里是指网络访问协议,如以太网的数据链路层。网络接口在线或不在线的标识应能通过低层协议传给OSPF,如在以太网上当以太网的收发器电缆没有插入时应给出相就的数值。

无广播低层协议支持:无广播网络是多路访问网络,如X.25共同数据网(PDN)。在这些网络,在企图向一个已死亡或不存在的路由器发送OSPF信息时Hello包必须能向OSPF提供辅助的标识。如在公共数据网一个死亡的路由器在X.25接收到标识后将可能的原因及诊断清楚地将这些信息传给OSPF。

处理简单的列表:大部分术语描述的OSPF功能是对连接状态公告列表的处理。如公告一直传送到从邻居的路由器收到确认列表为止。在很多这些表中教师都会有公告的细节,要实现OSPF需要能够管理这些表,在必要时增加和删除公告的组成。

任务支持:在本规范中描述的特定的过程会调用其它的过程,同时,在本过程执行完毕之前,那些过程应当在线执行,这用文字执行(execute)表示。另一种情况,仅当当前过程执行完成后其它过程才能执行,这用文字调度(schedule)表示。

  1. 协议数据结构 在本规范中对OSPF协议在操作时的多种协议数据结构作了描述,下面为经过精减的上层OSPF数据结构,需要被初始化的作了注明,区域、OSPF接口和邻接及和数据结构有关联的内容将在规范的后面作解释。

路由器ID:一个32位数,在自治系统中唯一标识一个路由器。一种可能的实施策略为使用属于路由器接口的最小的IP地址。

区域结构指针:和路由器相联结的每个区域都有自己的数据结构,这个数据结构描述了基本算法的工作。记住每个区域运行独立的一份基本算法拷贝。

主干结构指针:把主干作为一个区域时的基本算法操作。基本这种原因主干表示成一个区域结构。

虚拟连接配置:将路由器作为一个端点进行虚拟连接配置,这个路由器自己必须是一个区域边界路由器。虚拟连接在另一端用路由器的ID号标识――另一个区域边界路由器。虚拟连接是主干的一部分,就像是一条建立在两个路由器之间的无编号点对点连接网络。一个虚拟连接使用它穿过区域的区域内部路由来传输包,通过在穿过区域建立的最短路径树决定虚拟连接的连通和断开。

外部路由列表:目的地为自治系统外部的路由,通过其它路由协议(如外部网关协议)直接得到或通过配置信息,或两者的结合(如由OSPF配置的尺度公告的外部动态信息)。拥有这些外部路由信息的路由器称为自治系统边界路由器,路由器将从自治系统外部的连接公告得到的这些路由再公告到整个自治系统。

自治系统外部连接公告列表:拓朴数据库的一部分。由自治系统边界路由器生成。他们组成到自治系统外部的目的地路由。注意,路由器自己是一个自治系统边界路由器,则这些自治系统外部连接公告中的一部分是它自己组织的。

路由表:由拓朴数据库生成,每个可到达的路由表示为一个代价和一组路径。一个路径用它的类型和下一跳表示。更多的信息参见第11节。

图9显示一个典型的路由器的数据结构汇集,路由器为RT10,取自于图6。注意路由器RT10和RT11之间有一个虚拟连接,区域2为连接的穿过区域,在图9中用虚线表示。当虚拟连接激活时,通过区域2构造的最短路径树,它成为主干的一个接口(见图9中的两个主干接口)。 图9:路由器RT10的数据结构 6. 区域数据结构 区域数据结构包含所有用来运行基本路由算法的信息,每个区域管理自己的拓朴数据库,路由器接口和邻接都属于单个区域。 主干有区域的所有属性,基于这个原因它也用区域数据结构表示。但要注意结构中的一些项目在应用时主干和区域的不同性。 区域拓朴(或连接状态)数据库由路由器的连接、网络的连接和区域路由器组织的公告汇总连接汇集成。这个信息只在单个区域内传播。自治系统外部公告列表也作为每个区域拓朴数据库的一部分。

区域ID:一个标识区域的32位数。0保留为主干的区域ID号。如果指派子网作为独立的区域,则IP网络地址可用作区域ID号。

组件地址范围列表:这些地址范围定义了区域,每个地址范围描述为一对[地址,掩码],区域内每个网络指定的地址范围就落于上述定义中(但地址范围不允许重复)。作为一个例子,如果一个IP子网将成为一个单独的OSPF区域,则这个区域由单个地址范围组成,一个IP地址和它的自然掩码(A、B和C类网络)。

路由器关联接口:路由器的接口连接到区域,一个路由器的接口属于一个且仅能属于一个区域(或主干)。对于主干的结构,这个列表还包含虚拟邻接。一个虚拟邻接是另一端路由器的ID值,代价为在这两个路由器作为内部区域路由器时的代价。

路由器连接公告列表:路由器连接公告由区域中的每个路由器生成。它描述了路由器的接口到区域的状态。

网络连接公告列表:一个网络连接公告是由在区域中每个穿过多路访问网络生成。它描述了连接到网络的当前路由器的集合。

连接公告汇总列表:连接公告汇总由区域的区域边界路由器组织,它描述了到自治系统内部,即区域外部的目的地址的路由。

最短路径树:区域内的最短路径树,路由器自己作为根得出。使用Dijkstra算法从收集的路由器连接和网络连接中得出。

认证类型:在一个区域内使用的认证类型。认证类型在附录E中定义。所有OSPF包交换都是认证的。不同的区域可使用不同的认证计划。

如无特别说明,本文档的余下章节都是针对单个区域的协议操作。

  1. 生成邻接 OSPF在相邻的路由器间生成邻接的目的是交换路由信息,但并不是每两个相邻的路由器都会成为邻接,本节包含生成邻接的一般性内容,更深的细节见第10章。

7.1 Hello协议 Hello协议是用来建立和管理邻居关系的,它了保证了在邻居间的双向通信。Hello包定期在路由器的所有接口传出,双向通信可使路由器在邻居的Hello包中看到自己。 在多路访问网络中,Hello协议选择网络指定的路由器,指定路由器控制网络中生成什么样的邻接(见下文)。 Hello协议在广播网络中和非广播网络比较工作是不同的,在广播网络中,每个路由器通过定期的组播Hello包来公告它自己,允许动态地发现邻居,这些Hello包含有和指定路由器等同的路由器的视图,和最近收到Hello包的路由器的列表。 在非广播网络对Hello协议的操作必须配置一些信息,每个可能成为指定路由器都有一个与网络相连的其它路由器的列表,一个可能成为指定路由器的路由器,路由器的接口在所连接的非广播网络第一次开始操作时向所有其它可能成为指定路由器发送Hello信息,试图在网络中找到指定路由器。如果路由器自己被选为指定路由器,它开始向与网络中相连的其它路由器发送Hello包。 在发现一个邻居之后,确认双向通信,如果在一个多路访问网络则选择一个指定路由器,并决定是否将邻居作为邻接(见10.4节)。在点对点网络和虚拟连接中总是试图建立邻接。建立邻接的第一步是同步相邻的拓朴数据库,在下节讲解。

7.2 同步数据库 在基于SPF的路由算法中,所有路由器的拓朴数据库保持同步是很很重要的。OSPF只是简单地请求邻接的路由器保持同步。同步处理在开始试图建立邻接时就开始了,每个路由器通过向邻居发送一系列的数据库描述包来解释它自己的数据库,当邻居看到一个连接状态公告比它自己的同样的公告还要近时,它就注解这个新的公告应当为请求包。 这种传送和接收数据库描述包被称为“数据库交换处理”,在这个过程中,两个路由器形成一个主/次关系,每个数据库交换包有一个顺序号,数据库描述包由主(查询)方发送,由次方通过对照顺序号进行确认。所有的查询和响应组成了连接状态数据的汇总。主方是仅允许传输数据库描述包,它在固定间隔内传送,这个长度配置为常量:RxmtInterval。 每个数据库描述包含一个后面有包的指示-即M位,当路由器由到一个发送的数据库包中的M位置为结束时,数据库交换处理才算结束。 在数据库交换处理结束后,每个路由器有一个邻居已最后更新的连接状态公告的列表。这些会在连接状态请求包中请求。连接状态请求包是在固定的时间间隔RxmtInterval内没有完成的请求。当所连接状态请求都完成后,数据库得到了同步,路由器也完成了邻接建立。此时邻接已全功能运行,在两个路由器连接状态公告中广播。 邻接在数据库交换过程开始时用来传播,这种简单的数据库同步,保证了在预定的固定时间内完成。

7.3 指定路由器 每个多路访问网络都有一个指定路由器。指定路由器完成下面路由协议的两个重要功能:

7.4 后备指定路由器 为了平滑过渡到新的指定路由器,在每个多路访问网络中有一个后备的指定路由器。后备的指定路由器在网络中和其它的路由器邻接,在前面的指定路由器失败时成为指定的路由器。如果网络中没有后备的指定路由器,当必须产生一个新的指定路由器时,在路由器之间及和网络连接的其它路由器之间生成新的邻接。部分生成邻接的过程了是拓朴数据库同步的过程,这可能化费很长一段时间,在这段时间里,网络将不能可靠地传输数据。后备的指定路由器消除了这个过程,因为它已经存在。这意味着传输中断的周期仅是一次新的连接状态公告在网络中传播的时间(宣布新的指定路由器)。 后备的指定路由器不在网络中生成网络连接公告(如果这样做,则传输一个新的指定路由器将非常的快,然而,这需要在数据库的大小和当指定路由器消失后收敛速度之间权衡)。 后备的指定路由器也是由Hello协议选出,每个Hello包中有一个字段为网络标识后备的指定路由器。 在广播的一些步聚中,后备的指定路由器伴演一种消极的角色,让指定路由器做更多的工作。这可大大减少本地路由的能信,详细信息参见13.3节。

7.5 邻接图 一个邻接绑定到网络是两个路由器所共有的。如果两个路由器共有多个网络,则在他们之间有多个邻接。 可以用一种无向图表示网络中邻接的集合。竖向由路由器组成,如果两个路由器为邻接则有一条边界线相连。邻接图描述了穿越自治系统的路由协议包的流向和详细的连接状态更新。 可能有两种图,依赖于网络是否为多路访问网络。在物理的点对点网络(和虚拟连接),在他们的数据库同步后,网络中的两个路由器将成为邻接。在多路访问网络,所有指定路路由器和后备的指定路由器是与网络连接的其它路由器的邻接,及所有邻接的帐户。 这些图在图10中表示。后备的指定路由器和指定路由器在广播过程中完成很少的功能(见13.3节)。这也是用虚线连接后备的指定路由器的原因。 图10:邻接图 8. 协议包处理 本节讨论路由协议包的常规处理,路由器的拓朴数据库保持同步是非常重要的,因为这个原因,路由协议包无论在发送和接收上,都应该比常规的数据包更优先对待。 路由协议包只在邻接问发送(Hello包除外,它用于发现邻接)。这意味着所有的协议包只传送一个IP跳数,除了那些在虚拟连接上的传送。 所有的路由协议包都有标准的头,下面的内容给出如何填写和校验这个标准的包头。对每个包类型,给出了针对此类型处理的更多细节。

8.1 传送协议包 当一个路由器传送一个路由协议包时,它填写如下的标准包头的字段,关于包头的更多细节参见附录2。 图11:接口状态发生变化 版本#:设置为1,在本规范中的协议文档版本号。

包类型:OSPF包类型,如连接状态更新或Hello包。

包长度:用字节表示的整个OSPF包长度,包括标准包头。

路由器ID:标识路由器自己的号(谁组织的包)。

区域ID:包将被传递的区域号。

检查和:对标准IP的整个OSPF包生成的16位余数检查和,包含64位的认证字段。这个检查和应当在将包传送到相应的认证过程之前计算出来。

认证类型和认证:每个OSPF包交换都是经过认证的。认证类型按协议划分详见文档的附录D。不同的认证类型可以用在OSPF的每个区域。64位的认证字段由相应的认证过程设置。这个过程应当是在形成发送包的最后一个被调用。认证字段的值的设置由包的内容和认证关键字(基于每接口配置)共同确认。

包的IP目的地址按如下选择:在物理点对点网络,IP地址总是设为AllSPFRouters。在其它类型网络中(含虚拟连接),多数的OSPF包使用单播,如直播传送到另一端的邻接,假如这样,IP目的地址正好是另一端邻接的邻居的IP地址(见第10章),只在广播网络不使用单播,在这些网络中Hello包使用组播目的地址AllSPFRouters。指定路由器和它的后备在发送连接状态更新和连接状态确认包都使用组播地址AllSPFRouters,其它路由器发送他们的连接状态更新和连接状态确认包都使用组播地址AllDRouters。 重传连接状态包总是使用单播。 IP源地址就设为发送接口的IP地址。接口到无编号点对点网络无连接的IP地址,在这样的接口,IP源地址设为路由器的其它任意的IP地址。为此原因,路由器必须至少有一个连接的IP地址(路由器的所有接口都是无编号点对点连接是可能的,如果这样,路由器必须设一个IP地址,这个地址在路由器的路由连接公告中作为一个主机路由)。大部分情况下,虚拟连接正好同样可以做为无编号点对点网络,然而,每个虚拟连接都有一个接口IP地址(在构造路由表处理是发现)在虚拟连接上发送包时作为IP源地址。 特点包类型格式的大部分信息构成如下: 类型 包名字 详述章节 1 Hello 9.5节 2 数据库描述 10.8节 3 连接状态请求 10.9节 4 连接状态更新 13.3节 5 连接状态确认 13.5节

8.2 接收协议包 只要路由器接收到一个协议包,它就标注上是接收包的接口。对于配有虚拟连接的路由器,将不能立即发现与包相连的接口,例如,图6中的路由器RT11,如果RT11在它的接口到网络N8的OSPF协议包,它可能想把它与在区域2的接口相联,或与路由器RT6的虚拟连接相联(是主干中的部分)。下面我们假定包初始与无虚拟连接相联。 为了使包在IP级别上接受,在包传递到OSPF处理以前,必须进行以下测试:

下一步,包被认证。这依赖于特定的认证类型(见附录D)。所有其它类型的包都只在邻接间传递。即包必须传到路由器的一个活跃的邻居。发送者的路由器ID号(源路由器)可在OSPF的包头中找到。接收接口相关联的数据结构由活跃的邻居列表组成。和任意的活跃邻居都不匹配的包被丢弃。 在这点上,所有接收到的协议包都与活跃的邻居相联,更深地特定包类型的输入处理过程,参考以下章节: 类型 包名字 详细章节(接收) 1 Hello 10.5节 2 数据库描述 10.6节 3 连接状态请求 10.7节 4 连接状态更新 13节 5 连接状态确认 13.7节

  1. 接口数据结构 一个OSPF接口是路由器和网络之间的连接。对每个连接的网络都有单一的一个OSPF接口结构;每个接口结构至少有一个IP接口地址(见下文)。对一个接口多个地址的支持需要更深的考虑。 一个OSPF接口可以考虑成属于包含相连网络的一个区域,所有由路由器组织通过这个接口的路由协议包都标有这个接口的区域号。一个或多个路由器邻接通过一个接口发展,一个路由器的连接状态公告反映了这个接口的状态和他们相连的邻接。 下面是与接口相关的数据选项,注意这里的一些选项是与相关网络的配置信息,这些选项对与网络相接的路由器必须是相同的。 类型(Type):与接口相接的网络类型。它的值可以为:广播(broadcast)、非广播但为多路访问、点对点或虚拟连接。 状态(State):一个接口的功能层次。状态确定是否在所有接口上允许全邻接。状态也会在连接状态公告中反映。 IP接口地址:与接口相连的IP地址。通过些接口组织的所有路由协议包中都会把它作为源IP地址出现。无编号点对点网络无相连的IP地址。 IP接口掩码:标识与相联结的网络的IP地址的一部分。常常指子网掩码。用接口的IP地址和此掩码进行掩模得到相连网络的IP网络数量。 区域ID:相连网络属于的区域ID值。所有由此接口组织的路由协议包中都标有此区域ID号。 Hello间隔(HelloInterval):用秒表示的时间长度,路由器通过接口发送Hello包的时间间隔。从此接口发送出去的Hello包中公告。 路由器死亡间隔:在路由器的邻居宣布它关闭前的秒数,当他们停止收听路由器的Hello时。从此接口发送出去的Hello包中公告。 接口传输延迟:通过这个接口传输一个连接状态更新包估计经过的秒数。更新包中的连接状态公告在传输前要增加此值到他的生命中。这个值应当计入传输帐户和传播延迟,它必须大于0。 路由器优先级:一个8位的无符号整数。当连结到网络的两个路由器都想成为指定路由器时,其中优先级高的将获得。一个优先级被设为0的路由器在相连接的网络上要成为指定的路由器是不合格的。从此接口发送出去的Hello包中公告。 Hello计时器:一个间隔计时器,使接口定期发送Hello包。每隔Hello间隔后激发。在无广播网络中每个单独的Hello包被发往每个有资格的邻居。 等待计时器:一个单发计时器,使接口退出等待状态,结果在网络中选定一个指定路由器。时间的长度为路由器死亡间隔。 邻居路由器列表:与这个网络相接的其它路由器。在多路访问网络中,这个表由Hello协议形成,邻接将成为这些邻居的一部分。检查所有这些邻居的状态可以确定邻接的邻居集。 指定路由器:为连接的网络选择的指定路由器。在多路访问网络中由Hello协议选出指定路由器。有两个标识保留给指定路由器:路由器ID和在网络上接口的IP地址。指定路由器在网络中广播连接状态,网络连接状态公告中标有指定路由器的IP地址,这个项目初始值为0,表示没有指定路由器。 后备的指定路由器:后备的指定路由器也是在多路访问网络中由Hello协议选出的。网络中所有的路由器都与指定路由器和后备的指定路由器邻接。在当前指定路由器失效时后备的指定路由器成为指定路由器。初始值为o,表示没有后备的指定路由器。 接口出口代价:通过这个接口发送包的代价,用连接状态尺度表示。在路由器的连接公告中作为接口的连接代价公告。对每个IP服务类型可能会有不同的值,接口的代价值必须大于0。 连接公告间隔:对属于这个接口的邻接,在连接状态公告重传间的间隔秒数。也用于重传数据库描述和连接状态请求包。 认证关键字:这个配置数据允许认证过程生成或检验OSPF头中的认证字段。认证关键字可基于每接口配置。如,如果认证类型要求简单的口令,认证关键字将是64位的口令。在组织路由协议包时这个关键字直接插入到OSPF包头中,且对不同的网络可以有单独的口令。

9.1 接口状态 本节中将讲解路由器接口的多种状态。这些状态按处理功能列表,如:无效状态列在第一个,接下来为中间状态,后是最终状态,所有的状态都列出。这样可做为参考时按顺序使用,如“这些接口的状态大于X”。 图11是一个接口状态变化图,图上的弧线上标有引起状态变化的事件,这些事件在9.2节说明。接口状态表将在9.3节详细描述。 关闭(Down):这是接口的初始状态。即低层协议标识接口不能用。在这样的接口不会有协议通信的传送和接收。接口的参数应设为它的初始值。所有的接口计时器都应是关闭的,接口应当没有相关的邻接。 回环(Loopback):这种状态下,路由器的接口到网络是回环的,接口可以是硬件或软件方式。接口对正常的数据传输是不可用的。但它可以提供接口查询所期望的信息,可通过发送ICMP的ping命令或其它的位错误测试。这样,在回环状态IP包仍可通过编址到接口。这种接口在连接状态公告中作为单主机路由广播,它的目标地址为接口的IP地址。 等待(Waiting):这种状态下,接口试图确定网络后备的指定路由器的标识。路由器监视它接收到的Hello包。路由器不允许选定后备的指定路由器或指定路由器直到等待状态的时间超出为止。这样可阻止(后备的)指定路由器的不必要变更。 点对点(Point-to-point):这种状态下,接口是可操作的,连接可以是物理上的点对点连接也可是虚拟连接。基于这种情况,路由器试图和相邻的路由器形成邻接,Hello包在每个Hello间隔内发到邻居的路由器。 非指定路由器(DR Other):接口在多路访问网络中,但该网络已有指定路由器。而它自己也没有被选为后备的指定路由器。该路由器和指定路由器及后备的指定路由器(如果存在)形成邻接。 后备(Backup):这种状态下,路由器自己在它连接的网络上是后备的指定路由器。在当前指定路由器失败的情况下它会成为指定路由器。它和网络上其它连接的路由器形成邻接。后备的指定路由器执行和指定路由器相比在广播过程中轻微的不同功能(见13.3节)。后备的指定路由器执行的功能在7.4节详细描述。 指定路由器(DR):这种状态下,路由器在它连接的网络上是指定路由器。它和网络上所有其它的路由器形成邻接。该路由器必须为网络结点组织网络连接公告。这个公告将包括网络连接的所有路由器(包括指定路由器自身)。指定路由器执行的功能将在7.3节中详述。

9.2 事件引起的接口状态变化 状态的变化可能由一系列的事件引起,这些事件在图11中的弧线上标识。这些标识在下面列出。关于这些事件对OSPF协议动作的影响见9.3节。

接口起动(Up):低层协议标识网络接口可运行。这将使接口从关闭状态转出。如果在虚拟连接,接口运行标识着最短路径计算的结果。 等待计时器(Wait Timer):等待计时器点为,指示在选择一个(后备的)指定路由器时须在等待周期结束后。 了解后备(Backup seen):路由器已测试到网络存在或不存在一个后备的指定路由器。这可有一或两种方法,第一,可能从相邻路由器收到一个Hello包宣布自己为后备的指定路由器,第二,从相邻路由器收到一个Hello包宣布自己为指定路由器,或标识没有后备的指定路由器。这种和相邻路由器的交流是双向的,如路由器必须出现在邻居路由器的Hello包中。这个事件将结束等待状态。 邻居变化(Neighbor Change):与相邻路由器相连的接口可能会发生变化,这将导致(后备的)指定路由器需要重新计算。以下的邻居变化将导致邻居变化事件。关于邻居状态的解释详见10.1节.

9.3 接口状态机 下面对接口状态改变作详细的描述。每个状态改变都是一个事件引起的(见9.2节)。这些事件依赖于接口当前的状态会产生不现的影响。基于这个原因,下面状态机的组织由当前接口状态和收到的事件。状态机的入口描述新状态的结果和对附加事件集的需求。 当一个接口状态改变时,它可能必须组织一个新的路由连接公告。详见12.3节。 下面一些要求的动作涉及到的是邻居状态机中的普通事件。如当一个接口变为不起作用时,所有与这个接口相连的邻居都受到破坏。关于邻居状态机的信息详见10.3节。

状态: 关闭(Down) 事件: 接口起动(Interface Up) 新状态: 依赖于动作程序 动作: 启动Hello计时器(Hello Timer),使能定期从接口发送Hello包。如果相立即的网络是物理的点对点或虚拟连接,则接口状态转为点对点(Point-to-Point)。否则,如果路由器不符合成为指定路由器的条件则接口状态转为非指定路由器(DR other)。 如果相连的网络为多路访问并且路由器符合成为指定路由器的条件,这种情况下,尝试发现相连网络的指定路由器,接口状态设为等待(Waiting)并且启动一个短的等待计时器(Wait Timer)。如果相连的网络是非广播性质,检查接口的邻居的配置列表并且对每个符合成为指定路由器的邻居生成邻居事件开始(Start)。

状态: 等待(Waiting) 事件: 了解后备(Backup Seen) 新状态: 依赖于动作程序 动作: 计算相连网络的后备的指定路由器和指定路由器,如9.4节显示的,作为计算的结果,接口新的状态可能为:DR other、Backup或DR。

状态: 等待(Waiting) 事件: 等待计时器(Wait Timer) 新状态: 依赖于动作程序 动作: 计算相连网络的后备的指定路由器和指定路由器,如9.4节显示的,作为计算的结果,接口新的状态可能为:DR other、Backup或DR。

状态: DR other、Backup或DR 事件: 邻居变化(Neighbor change) 新状态: 依赖于动作程序 动作: 重新计算相连网络的后备的指定路由器和指定路由器,如9.4节显示的,作为计算的结果,接口新的状态可能为:DR other、Backup或DR。

状态: 任意状态 事件: 接口关闭(Interface Down) 新状态: 关闭(Down) 动作: 所接口变量重新设置,接口的计时器无效。并且,所有与接口相连的邻居被破坏。在相连的邻居上生成事件KillNbr完成这个动作。

状态: 任意状态 事件: 循环标识(Loop Ind) 新状态: 循环(Loopback) 动作: 既然这个接口不再和相连的网络连接,与上面的接口关闭的动作将执行。

状态: Loopback 事件: 非循环标识(Unloop Ind) 新状态: 关闭(Down) 动作: 无需相关动作。在接口进入状态Loopback时,接口变量已经被重置。注意在接口重新成为全功能之间必须接受接口起动(Interface Up)事件。

9.4 选举指定路由器 指定路由器的选举过程如下:请求路由器计算路由器X。连接到网络的邻居并与路由器X建立双向通信的列表被检查。这个列表正好是路由器X邻居的集合(在这个网络上)且它们的状态应该大于或等于2-Way(见10.1节)。路由器X自己也被作为列表中的一员。从列表中删除能成为指定路由器的不合格数据。(路由器优先级为0的不能成为合格的指定路由器。)仅对保存在列表中的这些路由器,按以下步骤进行计算:

  1. 标注网络的指定路由器和后备的指定路由器的当前值。目的为后面的比较使用。
  2. 按以下计算网络的新的后备的指定路由器。如果有一或多个路由器已经宣称自己为后备的指定路由器(它们已经在他们的Hello包中列出自己为后备的指定路由器),一个具有最高优先级的路由器宣称自己为后备的指定路由器。在此情况下,具有最高路由器ID的一个被选中。如果没有路由器宣称自己为后备的指定路由器,选择具有最高路由器级别的,包括那些已经自己宣称为指定路由器的,再次使用路由器ID打破此局面。
  3. 以下为网络计算新的指定路由器。如果一或多个路由器已经宣称自己为指定路由器(它们已经在他们的Hello包中列出自己为指定路由器),一个具有最高路由器级别的宣称为指定路由器。在此情况下,选中具有最高路由器ID的作为指定路由器。如果没有路由器宣称自己为指定路由器,则将新的后备的指定路由器作为指定路由器。
  4. 如果路由器X现在作为新的(后备的)指定路由器,或不再为(后备的)指定路由器,则重复第二和第三步。例如,路由器X现在为指定路由器,当执行第二步时X不再作为后备的指定路由器选择的合格者,这将确保无路由器宣称自己既为后备的指定路由器和指定路由器。
  5. 作为这些计算的结果,路由器自己现在将成为指定路由器或后备的指定路由器。详细信息见7.3和7.4节。路由器的接口状态将被设置。如果路由器自己现在为指定路由器,新的接口状态为DR。如果路由器自己现在为后备的指定路由器,新的接口状态为Backup。否则,新的接口状态为DR Other.
  6. 如果相接的网络为非广播网,并且路由器自己已经成为(后备的)指定路由器,它将启动向那些不符合成为指定路由器的邻居发送hello(参见9.5.1节)。这通过对每个邻居的路由器优先级为0的引入邻居事件Start完成。
  7. 如果以上计算导致(后备的)指定路由器的标识改变,与接口相连接的邻接设置将被更改。一些邻接需要生成,一些将被断开。要达到此目的,产生事件AdjOK?在所有邻居的状态至少为2-Way。这将引起他们是否符合邻接进行检验(见10.3和10.4节)。

在选举算法的复杂的原因是期望在当前指定路由器失败时,后备的指定路由器有序地转换为指定路由器。这种有序转换是通过滞后引导确认的:没有新的后备路由器产生,直到老的后备接受它新的指定路由器职责。 如果路由器X不符合成为指定路由器条件,那么或者是一个后备的指定路由器或一个指定路由器将在上面的过程中被选出。另外注意如果路由器X是相连网络上仅有的符合指定路由器条件,它将选择它自己作为指定路由器且网络上不再有后备的指定路由器。

9.5 发送Hello包 Hello包在路由器的每个功能接口上传送。用来发现和管理邻居关系。在多路访问网络,Hello也用来选举指定路由器和后备的指定路由器,并用来确定形成什么样的邻接。 Hello包的格式细节在附录A.4中。Hello包由路由器的路由器优先级(Router Priority)(用来选举指定路由器),和在Hello广播的时间间隔(HelloInterval)组成。Hello包也指定一个邻居必须在多久内保持活跃(RouterDeadInterval)。HelloInterval和RouterDeadInterval在共同连接的网络上的所有路由器都必须为相同值。 为了确保在邻接的路由器上保持又向通信,Hello包容纳有最近看到呼叫的路由器的列表。Hello包也含有为指定路由器和后备的指定路由器的路由器的当前选择。这些域的值为0意味着还没有一个被选择。 在广播网络和物理点对点网络,Hello包每HelloInterval秒向IP组播地址AllSPFRouters发送。在虚拟连接上,Hello包作为单播发送(地址直接为虚拟连接的另一端),每隔HelloInterval秒一次。在非广播网络,Hello包的发送比较复杂,将在下节讲述。

9.5.1 在非广播网络上传输Hello包 在非广播网络,为了Hello协议的功能,静态配置信息是必要的(见附录C.5)。每个连接的符合成为指定路由器的路由器都有它在网络上所有邻居的一个配置列表,每个列表上的邻居都标有它的指定路由器的符合度。 任意Hello包在传送时接口状态至少为等待(Waiting)。呼叫直接传到(作为单播)邻居路由器的一些接口。有时呼叫通过一个定时器定期传递,有时是作为收到呼叫的一种响应传递。一个路由器的呼叫传送动作常依赖于路由器自己是否符合成为指定路由器。 如果路由器符合成为指定路由器,它必须定期向所有符合成为指定路由器的邻居发送呼叫包。另外,如果路由器自己是指定路由器或后备的指定路由器,也必须定期地向邻居发送呼叫包。这意味着任意两个可符合的路由器是经常交换呼叫包,也是指定路由器选择算法中的正常操作的必须。要最小化呼叫包的发送,在非广播网络上符合条件的路由器应保持最小。 如果路由器不符合成为指定路由器,它必须定期发送呼叫包到指定路由器和后备的指定路由器(如果存在),它也必须向符合条件的路由器发送的呼叫包进行应答(非当前的指定路由器和后备的指定路由器)。这是和任意潜在的指定路由器建立和初始化双向关系的需要。 当定期向邻居发送呼叫包时,在呼叫包之间的时段由邻居的状态确定,如果邻居状态为关闭,呼叫包则每隔PollInterval秒一次,其它情况下则每隔HelloInterval秒一次。

10.邻居数据结构 一个OSPF路由器和它的邻居路由器进行对话,每个单独的会话可描述为一个“邻居数据结构”。每个会话关联到一个特定的路由器接口,并用邻居路由器的OSPF路由器ID或邻居的IP地址(见下)。即如果OSPF路由器和其它的路由器有多条连接的网络,就会有多个会话,每个描述为一个独立的邻居数据结构。每个独立的会话在文中简单地称为一个独立的“邻居”。 邻居数据结构由在两个路由器间形成邻接或相关的形式的所有信息。(然而,记住并不是所有邻居都会成为邻接)。一个邻接可以视为两个路由器间的高度发展。 状态(State) 邻居会话的功能级别。将在下面几节中详细描述。 不活动定时器(Inactivity Timer) 一个单点定时器,当最近没有收到邻居的呼叫包时开始计时。 主/从(Master/Slave) 当两个邻居交换数据库时,即形成一个主从关系。主控制发送第一个数据库描述包,也是仅允许的部分被传播。从设备只可以响应主控制的数据库描述包。主/从关系在ExStart状态时进行协商。 顺序号(Sequence Number) 单个数据库描述包的一个32位标识。当邻居进入ExStart状态时,顺序号应当设为一个邻居路由器以前没有用过的值。一个可能的计划是使用机器的日期计数时间。顺序号在每个新的数据库描述包传送时由主控制递增。从方的顺序号标识从主方接收到的最后一个包。同一时间只能允许有一个包出现。 邻居ID(Neighbor ID) 邻居的路由器ID值。 邻居优先级(Neighbor priority) 邻居路由器的路由器优先级。包含在邻居的呼叫包中,在连接网络上选择指定路由器时使用。 邻居IP地址(Neighbor IP Address) 相连网络的邻居路由器接口的IP地址。当协议包作为单播向邻居传递时使用此IP地址。同时也用于在当邻居路由器被选为指定路由器时作为组织网络的连接状态组织的IP地址。邻居IP地址是通过从邻居接收到的呼叫包中学到的,如果是虚拟邻接则是配置时设置的(详见附录C.4)。 邻居的指定路由器(Neighbor's Designated Router) 邻居对指定路由器的想法。如果是邻居自己,在本地计算指定路由器是很重要的,只在多路访问网络中定义。 邻居的后备指定路由器(Neighbor's Backup Designated Router) 邻居对后备的指定路由器的想法。如果是邻居自己,在本地计算后备的指定路由器是很重要的。只在多路访问网络中定义。 以下为连接状态公告中的变量列表,这些列表描述了区域拓朴数据库的子集。在一个区域拓朴数据库中的连接状态公告有四种不同的类型:路由器连接、网络连接、汇总连接和AS外部连接。 连接状态传播列表(Link state retransmission list)连接状态公告列表已经传播但未收到邻接的确认。这些将会在一定间隔后重传,直到收到确认或邻接被破坏。 数据库汇总列表(Database summary list) 连接状态公告的完整列表组成区域拓朴数据库,同时邻居同时进入数据库交换状态。这个列表通过数据库描述包传到邻居。 连接状态请求列表(Link state request list) 连接状态公告列表需要从邻居接收,目的是同步两个邻居的拓朴数据库结构。这个列表作为数据库描述包生成接收的。邻居再发送连接状态请求包直到初始化列表为空为止。

10.1 邻居状态 邻居状态(邻居状态的改变由邻居路由器决定)归档在下面章节中。这些状态按功能的增强列出。如,无效状态列在第一位,跟着是中间状态和最终状态,所有的功能状态都列出了。这种有序的特殊方式可以作为对“邻居/邻接比状态X高的状态”的参考。图12和图13显示了邻居状态变化图。图上的弧线标有引起状态变化的事件,邻居事件将在下节讲解。 图12显示了由呼叫协议引起的状态变化。呼叫协议是邻居请示和维护的请求,在邻居间确认双向通信。 在图12中事件KillNbr强制为关闭状态,事件Inactivity定时器强制为关闭状态,事件LLDown强制为关闭状态。 在图13中事件Seq Number不匹配导致ExStart状态,事件1-Way导致Init状态,事件KillNbr导致Down状态,事件Inactivity定时器导致Down状态,事件AdjOK?导致邻接形成或中断。 尝试 双向

 开始                 呼叫接收      单向

 关闭     呼叫接收     初始化     双向接收

                                                  A

图12 邻居状态变化(呼叫协议) A

ExStart  NegDone     Exchng    ExchngDone     Loading

                                         Loading
                                         Done
                                                Full

图13:邻居状态变化(数据库交换) 图13中显示形成邻接,并不是每两个邻居路由器都成为邻接(见10.4节),当邻居状态为ExStart是开始形成邻接。在两个路由器形成他们的主/次关系后,状态转为Exchange。在这点起邻居开始使用广播过程,两个邻居的路由器开始同步他们的数据库。当这个同步完成后,邻居进入Full状态,这时我们说两个路由器是全邻接。这时邻接在连接状态公告中列出。 邻居状态变化的更加详细的描述,包括引起状态变化的附加事件,见10.3节。 关闭(Down):这是邻居会话的初始状态。标识最近没有从邻居收到信息。在非广播网络,呼叫包可能会一直向关闭的邻居发送,尽管在减少频率(见9.5.1节)。 尝试(Attempt):此状态只对连结到非广播网络的邻居有效(或虚拟连接上的邻居)。它标明最近无从邻居收到的信息,但更有效应该是接触的邻居,这可通过定时HellInterval的间隔向邻居发送呼叫实现(见9.5.1节)。 初始化(Init):在此状态,刚从邻居收到一个呼叫包,然而,和邻居间的双向通信尝未建立(如:路由器自己还没出现在邻居的呼叫包中)。所有处于此状态的邻居(或更高状态)将列出在相关接口发送的呼叫包中。 双向(2-Way):在此状态,两个路由器的双向通信已建立,这可以通过对呼叫协议包的操作确认,这是在建立邻接开始前的短暂的状态。(后备的)指定路由器在双向或更高状态的邻居中选举产生。 交换开始(ExStart):这是在两个邻居的路由器间生成邻接的第一步。这一步的核心是确定哪个路由器为主,这取决于初始顺序号。在此状态或更高状态的邻居会话称为邻接。 交换(Exchange):在此状态下路由器通过向邻居发送数据库描述包来说明它整个连接状态数据库。每个数据库描述包有一个顺序号,需要明确的应答。一次只能有一个数据库描述包允许传出。在此状态或更高状态下所有邻接都用于广播过程。实际上,这些邻接是全负荷地用于传输和接收所有类型的OSPF路由协议包。 调入(Loading):在此状态下,连接状态请求包发往邻居问询更多的已经在交换状态路路由器的最近公告。 完全(Full):在此状态,邻居路由器处于全邻接。这些邻接将出现在路由器的连接和网络连接的公告中。

10.2 引起邻居状态变化的事件 状态变化可由一系列的事件引起。这些事件在图12和图13中的弧线上列出,解释如下: 呼叫收到(Hello Received):从邻居收到一个呼叫包。 开始(Start):标志着在间隔HelloInterval秒向邻居发送呼叫包。这个事件只在与非广播网络相连的邻居中产生。 双向接收(2-Way Received):在两个邻居的路由器间双向通信已经建立。这可从其它的呼叫包中看到自己来标识。 协商完成(NegotiationDone):主/从关系已经协商,顺序号已经交换。这标志着开始发送/接收数据库描述包。更多关于生成此事件的信息见10.8节。 交换完成(Exchange Done):所有的路由器已经完成全部顺序的数据库描述包传输。每个路由器现在知道它连接状态数据库的部分是过时的。关于此事件的更多信息见10.8节。 顺序号失配(Seq Number Mismatch):收到一个数据库描述包,或有一个意料之外的顺序号,或意料之外的初始化位设置。这指现在建立邻接的过程中发生了一些错误。 错误的连接状态请求(BadLSReq):收到一个连接请求要求一个不包含在数据库中的连接状态公告。这标识在同步过程中出现一个错误。 调入完成(Loading Done):所有超出日期部分的数据库收到连接状态更新。在处理一个连接状态更新之后,连接状态请求列表为空标识。 邻接成功(AdjOK?):决定在邻居间是否生成邻接必须要(或再)确认。这个事件将启动一些邻接形成,和破坏其它的邻接。

下面事件导致邻居回到更小的状态。不像上面的事件,这些事件在邻居会话的任一个状态中都可能发生。 单向(1-Way):从邻居收到了一个呼叫包,但这个路由器从未提及过。这指出和邻居间的双向通信还没有建立。 关闭邻居(KillNbr):这指出和邻居间的通信都不可能,导致邻居关闭。 不活跃定时器(Inactivity Timer):不活跃定时器开始计时,意味着最近没有从邻居收到呼叫包。 低层协议断开(LLDown):从低层协议得到的指示邻居不可到达。例如,在一个X.25网络这个标识通过X.25的诊断清楚的指出问题的原因。

10.3 邻居状态机 下面是对邻居状态变化的详细的描述,每个状态变化都由一个事件引起(见10.2节)。一个事件依据于邻居当前的状态,可能引起不同的效果。基于这个原因,下面的状态机按当前邻居的状态和收到的事件组成。状态机的每个入口描述了新邻居状态的结果和需求的事件系列。 当一个邻居状态变化时,它可能会返回到选举指定路由器的运算。这由接口的邻居变化事件确定。另外一个接口在DR状态(路由器自己是指定路由器),邻居的状态变化可能会引起组织一个新的网络连接公告。 当网络状态机需要调用接口状态机时,它将通过一个计划任务去做。这是很简单的事情,确保两者的状态都能循环的执行。 状态:Down 事件:Start 新状态:Attempt 动作:向邻居发送一个呼叫包(这个邻居常与一个非广播网络连接)并且对邻居启动一个不活动计时器。计时器最后会标识与邻居的通信不再相接。

状态:Attempt 事件:Hello 收到 新状态:Init 动作:为邻居重新启动不活动计时器,因为又从邻居收到了呼叫。

状态:Down 事件:Hello收到 新状态:Init 动作:为邻居启动不活动计时器,计时器最终导致标识邻居死亡。

状态:Init或更高 事件:Hello收到 新状态:无变化 动作:为邻居重新启动不活动计时器,因为又从邻居收到了呼叫。

状态:Init 事件:2-Way 收到 新状态:依据动作例程 动作:确定是否和邻居建立一个邻接(见10.4节)。如果不建立,新邻居状态为2-Way. 否则(建立了邻接)邻居状态转换为ExStart。依据此状态,路由器增加这个邻居的顺序号,如果这是第一次和邻居建立请求,顺序号应赋一个唯一值(如天和时间)。然后宣布自己为主(设置主/从位为主),开始传送数据库描述包,设置初始化(I),更多(M),主(MS)位。否则这个数据库描述包应当为空。这个数据库描述包将在RxmtInterval秒后重传直到进入下一个状态为止(见10.8节)。

状态:ExStart 事件:NegDone 新状态:Exchange 动作:路由器必须在邻居的数据库汇总列表中表出它的整个区域连接状态数据库组成。区域连接数据库包括路由器的连接、网络连接和在区域结构中的汇总连接,包括在整个区域结构中的自治系统外部连接。自治系统外部连接公告在虚拟邻居的数据库汇总列表中省略。公告的生存期为MaxAge的增加到邻居的连接状态重传列表中。一个汇总的数据库汇总列表将在数据库描述包中传到邻居。每个数据库描述包有一个顺序号,并且要求确认。一次只有一个数据库描述包允许传出。关于发送和接收数据库描述包的更多的细节,见10.8和10.6节。

状态:Exchange 事件:Exchange完成 新状态:Loading 动作:开始向邻居发送连接状态请求包(见10.9节)。向邻居请求最近的公告(在Exchange状态中发现)。这些公告将在与邻居相关的连接状态请求列表中表列出。

状态:Loading 事件:Loading完成 新状态:Full 动作:无动作要求,这是邻接的最终状态。

状态:2-Way 事件:AdjOK? 新状态:依据于动作例程 动作:决定是否和邻居路由器形成邻接(见10.4节)。如果不,邻居状态保持2-Way,否则,邻居状态转换为Exchange并且执行与状态Init和收到事件2-Way后的入口。

状态:ExStart或更高 事件:AdjOK? 新状态:依据于动作例程 动作:确认邻居路由器是否处于邻接,如果是,则无必要改变状态,否则,邻接被破坏,邻居状态变为2-Way,在连接状态公告中的连接状态重传列表、数据库汇总列表和连接状态请求列表被清空。

状态:Exchange或更高 事件:Seq 号不匹配 新状态:ExStart 动作:邻接关闭,并试图重新建立。邻居状态第一次变为ExStart。在连接状态公告中的连接状态重传列表、数据库汇总列表和连接状态请求列表被清空。路由器为邻居增加顺序号,宣布自己为主(设置主/从关系位为主),并开始发送数据库描述包,并设初始化、更多、和主位。这个数据库描述包应当置空。

状态:任意状态 事件:KillNbr 新状态:Down 动作:在连接状态公告中的连接状态重传列表、数据库汇总列表和连接状态请求列表被清空,不活动计时器关闭。

状态:任意状态 事件:LLDown 新状态:Down 动作:在连接状态公告中的连接状态重传列表、数据库汇总列表和连接状态请求列表被清空,不活动计时器关闭。

状态:任意状态 事件:Inactivity Timer 新状态:Down 动作:在连接状态公告中的连接状态重传列表、数据库汇总列表和连接状态请求列表被清空。

状态:2-Way或更高 事件:1-Way 收到 新状态:Down 动作:在连接状态公告中的连接状态重传列表、数据库汇总列表和连接状态请求列表被清空。

状态:2-Way或更高 事件:2-Way 收到 新状态:不变 动作:无动作需要

状态:Init 事件:1-Way 收到 新状态:不变 动作:无动作需要

10.4 是否成为邻接 邻接是在路由器邻居中的子集中建立的,路由器通过点对点连接或虚拟连接常成为邻接。在多路访问网络,所有路由器和指定路由器和后备的指定路由器邻接。 邻接形成在两种邻居状态机中发生,第一,当在邻居中初始化双向通信时,第二是相联网络的(后备的)指定路由器变化时。如果不试图建立邻接,邻居的通信状态停为2-Way。 至少满足下面的一个条件,一个邻接应当在双向的邻居之间建立:

10.5 接收呼叫包 本节讲述处理接收到呼叫包的处理细节(附录A.4有呼收包的格式)。通常OSPF包的输入处理将检查IP包头及OSPF包头的有效性。接着,将针对收到接口的配置检查收到的呼叫包的网络掩码、HelloInt和DeadInt等字段值。任一不匹配将导致停止处理并丢弃包。也就是说,上面的字段是对相连网络配置的真实描述。 呼叫包的源应该和接收接口的邻居相匹配。源用在OSPF包头中的路由器的ID或呼叫的IP头中IP地址标识。接口的当前邻居列表包含在接口的数据结构中。 如果找不到邻居的匹配项,(如第一次测试到邻居)就生成一个。在生成时,邻居结构中的邻居ID和邻居IP地址被设置。邻居的初始状态设为Down。 现在呼叫包的剩余部分被检查,向邻居和接口状态机生成事件。这些状态机要么进入executed要么scheduled(见4.4节)。如,以下邻居状态机在线执行,收到一个呼叫包许多邻居的状态都可能改变:

10.6 接收数据库描述包 本节解释收到数据库描述包的处理。收到的数据库描述包已经和相连的邻居和收到的接口相连系(见8.2节)。对数据库描述包更深的处理依据于邻居的状态。如果邻居的状态为Down或Attempt包被丢弃。否则,如果状态为: Init:邻居状态机在收到事件2-Way Received进行计划。这将立即引起状态改变为2-Way或ExStart。当前包的处理在新状态下继续进行。 2-Way:包被忽略。数据库描述包只用来生成邻接的目的。 ExStart:收到的包如果匹配下面的情况,邻居状态机在收到事件NegotiationDone后执行(引起状态变为Exchange)并且包在下一个序列接收和深层处理。否则,包被忽略。

当路由器下一次接受到一个收到的数据库描述包的包中的顺序号进行如下处理,对每一个列出的连接状态公告,路由器在它的数据库中查找是否在连接状态公告中有它的实例。如果没有,或如果数据库拷贝小于当前(见13.1节),连接状态公告放入连接状态请求列表,在邻居状态变为Loading时可以被请求。 当路由器接收收到的数据库描述包作为下一个顺序,依据于它的主/从状态,它将执行下面动作: Master:增加顺序号。如果路由器已经发送完它整个数据库描述序列,将包中的更多标志置为0。邻居事件Exchange Done生成。否则,它将发送一个新的数据库描述到从路由器。 Slave:设置顺序号为收到包中出现的顺序号。从方必须发送一个数据库描述包作为回应。如果接收到的包的更多位设为0,从方发送的包也将更多位设为0,邻居事件Exchange Done生成。注意从方总是先生成此事件。

10.7 收到连接状态请求包 本节解释处理收到连接状态请求包的细节。收到连接请求包中有一个连接状态公告的列表是邻居希望收到的。连接状态请求包在邻居状态为Exchange、Loading和Full时由主方接收。连接状态请求包在邻居状态为Loading和Full时由从方接收。在其它状态时连接状态请求被忽略。 每个连接状态公告对应的连接状态请求包应在路由器的数据库中有定位,并拷贝到连接更新包传输到邻居。这些连接状态公告不应该放在对邻居的连接状态重传列表中。如果一个连接状态公告不能在数据库找到,则同步过程可能出了问题,邻居事件BadLSReq事件生成。

10.8 发送数据库描述包 本节描述数据库描述包是如何发往邻居的。发送这些包要依据于邻居的状态。在状态ExStart时路由器发送空数据库描述包,将初始化、更多和主位进行设置。这些包每隔RxmtInterval秒重复发送一次。 在Exchange状态数据库描述包实际包含路由器所有的连接状态信息的汇总。在区域拓朴数据库的每个连接状态公告(此时邻居状态为Exchange)都列出在邻居的数据库汇总列表里。当一个新的包发送时,顺序号会增加,并在包中描述新的数据库汇总列表。上次包中被确认的项目从数据库汇总列表中移出。 在Exchange状态,确定何时发送包依据于路由器是主方还是从方。 Master:包发送的时间为a)从方回显顺序号确认上一个包收到b)过RxmtInterval秒后没收到确认,即上一个包需要重传。 Slave:包传送仅是作为对从主方收到包的响应。如果从主方收到的包是新的,则传一新的包,否则传送上次的包。 在Loading和Full状态,从方必须重传最后收到的包作为从主方收到包的复制为作响应。基于这个原因从方应在RouterDeadInterval秒后释放最后一个包。在这个时间之后从主方接收一个包将生成事件Seq Number Mismatch.

10.9 发送连接状态请求包 当邻居状态为Loading,连接状态请求列表包含一系列从邻居来的连接状态公告。这个列表的开始是传往邻居的连接状态请求包的封装。 当邻居通过发送相应的连接状态更新包成功完成请求时,连接状态请求列表被截断并传送新的连接状态请求包。不成功的连接状态请求在RxmtInterval秒后重传。这儿应当至少在任一时间内传送一个连接状态请求包。 当连接状态请求列表为空时,邻居事件Loading Done生成。

10.10 一个示例 图14显示了一个邻接形成的示例。路由器RT1和RT2在一个广播网络上全连接,假定RT2为网络的指定路由器,RT2的路由器ID值比路由器RT1高。 邻居状态改变列在图在每个路上器的下面。 图14中的开始,路由器RT1到网络的接口变成可操作,开始发送呼叫,但它并不知道有指定路由器或其它邻居的路由器。路由器RT2收到呼叫包(将邻居状态设为初始化),并在它的下一个呼叫包中标识它自己为指定路由器和收到RT1的呼叫。这使RT1的状态变为ExStart,并开始形成邻接。 Down Down Hello (DR=0,Seen=0) Init Hello (DR=RT2, Seen=...RT1) ExStart D-D (Seq=x, I, M, Master) D-D (Seq=y, I, M, Master) ExStart Exchange D-D (Seq=y, M, Slave) D-D (Seq=Y+1, M Master) Exchange D-D (Seq=Y+1, M, Slave)

                    D-D (Seq=Y+n, Master)
   Loading          D-D (Seq=Y+n, Slave)
                    LS    Request                    Full
                    LS    Update
                    LS    Request
                    LS    Update
    Full

图14. 邻接形成示例 RT1开始假定自己为主,当它看到RT2为实际的主时,RT1改变自己为从并用邻居的顺序号。数据库描述包开始交换,从主RT2发送到从RT1接收。这个数据库描述包的顺序号在M标志位关闭后结束传输和响应。 本例中,假定RT2完全交换了数据库。即RT2先进入Full状态,RT1在必要的自己数据库更新后进入Full状态。通过发送连接状态请求包和接收连接状态更新包响应完成。

11.路由表结构 路由表数据结构包含转发IP数据包到目的地址的必要的所有信息。每个路由表入口描述了到一个特定目的地最优路径的集合。当转发一个IP数据包时,路由表入口提供IP包中目的地址的最佳路径匹配。路由表入口标识到包目的地址的下一跳。OSPF还提供缺省路由。当缺省路由存在时,它将匹配所有的IP目的地址(但其它匹配入口更优)。 每个路由器在每个连接的网络上基于连接状态信息构建单个的路由表。一个路由器从检查它相接区域的拓朴数据库开始构建它的路由表(路由连接和网络连接)。从这些数据库中,路由器为每个区域构造一个最短路径树,并将它自己作为根。这即为周知的内部区域路由。这个计算的副产品是到所连接区域的路由器的距离。 通常,到区域边界路由器的距离是知道的。通过检查由区域边界路由器组织的汇总连接公告,所有区间路由被发现,和到所有自治系统边界路由器的路由。最终,检查由自治系统边界路由器组织的自治系统外部连接公告,发现所有有路由集。构造路由表的细节将在第16节讲述。 一些路由表入口描述在构建路由表时使用的中间目的地,如区域边界路由和自治系统边界路由器。一个路由表可由以下的域组成: 目的类型:目的可分为三类,只有第一类,网络,是在传输IP数据是使用的,其它只用在构建路由表的处理过程。 网络:一个IP地址范围,指定IP数据可以传送。包括IP网络(A、B、C类),IP子网和单个IP主机。缺省路由也归于此类。 区域边界路由器:连结到多个OSPF区域的路由器。这些路由器组织汇总连接公告。这些路由表入口用来计算区域间路由,也用作配置虚拟连接的相关项。 自治系统边界路由器:组织自治系统外部连接公告的路由器。这些路由表入口用来计算自治系统外部路由。 目的ID:目的标识或名字。这依据于目的点的类型。对于网络,即为IP地址,对于其它类型,标识为OSPF路由器ID。 地址掩码:只有网络有定义。网络IP和它的掩码共同定义一个范围。对于IP子网,地址掩码也作为子网掩码。对于主机路由,掩码为全1(oxffffffff)。 服务类型:对每个IP服务类型可以有分别的路由集。 区域:本域标识一个区域的路由表入口路径选择集的连接状态信息。称为入口相接区域。对于区域外部路径,这个域没有定义。对于目的为区域边界路由,这有不同的路径集(不同的路由表入口)与每个区域相接。通常发生在当两个区域边界路由器共享多个区域时。对于其它目的类型,只有与最佳区域相连的路径被保留。 下面的路由表入口描述了到描述目的路径的细节。下面字段为部分路径说明: 路径类型:共有三种可能的路径类型用于路由到目的的通信,按优先选择列出:内部路径、区间路径和自治系统外部路径。内部路径标识目的属于路由器相接的网络。区间路径是路径在其它OSPF区域的目的路径。这通过检查收到的汇总连接公告得到。自治系统外部路径是到自治系统外部的路径。通过检查收到的自治系统外部公告得到。 代价:到目的地址的代价。对于内部路径和区间路径,代价为连接状态尺度。对于自治系统外部路径,标识为连接状态尺度的综合。对于类型I外部尺度,为路径的全部代价,对类型II,为到公告自治系统路由器的距离。 对自治系统外部目的地,有以下的特定域: 外部尺度类型:由自治系统路由器公告的外部尺度类型。类型1(可比的连接状态)或类型2(不可比的连接状态)。类型2的尺度通常大于内部和区间路径的代价。 类型2代价:类型2描述为外部尺度,代价由自治系统边界路由器公告。 多个到同一目的地相等代价路径如果同时存在则都保存,所有这些路径都应与同一区域相接。每个路径都有更深入的字段描述: 下一跳:当向目的地址传送通信时使用的路由器接口。在多路存取网络,下一跳包括到达目的路径上下一个路由器的IP地址。下一个路由器通常为邻接邻居中的一个。 公告路由:只在区间和自治系统外部路径有效。这个域标识路由器公告汇总连接或外部连接到此路径的路由器ID。

11.1 两个例子 以下两个例子基于前面图2的网络。相应的有向图在图3中。注意所有这些图显示了每个输出接口的单个尺度,且路由并不全基于类型服务。 首先假定没有区域配置,所有网络和路由器属于主干。路由器RT6对路由表的计算在表2.1中描述。路由表结果有表6中显示。目的类型缩写为:网络为N,区域边界路由器为BR,自治系统边界路由器为ASBR。区域内路径在路径域值为1,区间路径为2,自治系统外部路径为3。 Type Dest Area Path Type Cost Next Hop(s) Advertising Router(s) N N1 0 1 10 RT3

12.连接状态公告 在自治系统内的每个路由器发起一或多个连接状态公告。有四个明显的连接状态公告类型,在4.3节中进行描述。连接状态公告的汇集形成连接状态或拓朴数据库。每个独立的公告类型有独立的功能。路由连接和网络连接公告描述了一个区域的路由器和网络是如何连接的。汇总连接公告提供了一汇总区域路由信息的方法。自治系统外部公告提供了向整个自治系统传送外部驱动路由信息公告的方法。 每个连接状态公告都开始于一个标准的20字节的头。这个连接状态头将在下文讨论。

12.1 连接状态头 连接状态头包括LS类型,连接状态ID和公告路由器字段。这三个字段合起来唯一标识一个连接状态公告。 在当前的自治系统中可能同时有多种公告的实例,必须要确认哪一个实例更新,这通过检查LS顺序号得到,这些字段都包含在连接状态头的20个字节中。 许多OSPF包类型在连接状态公告中列出。当实例不存在时,通过LS类型、连接状态ID和公告路由器(看连接状态请求包)选出一个公告。否则,LS顺序号、LS生存期和LS检查和字段都需要确认。 连接状态头的字段信息详细说明如下。

12.1.1 LS类型 LS类型字段指示连接状态公告的格式和功能。不同类型的公告有不同的名字(如路由器连接或网络连接)。所有的公告类型,除了自治系统外部连接公告(LS类型为5),只在单个区域传播。自治系统外部公告传播穿过整个自治系统。每个单独的公告类型简要描述如下: LS类型1:路由器连接公告。描述了路由器接口的状态,更多信息见12.3.1。 LS类型2:网络连接公告。描述了路由器连接的网络集合。更多信息见12.3.2。 LS类型3或4:汇总连接公告。描述了区间路由,并使区域边界路由信息得到浓缩。由区域边界路由器组织,类型3公告描述路由器到网络而类型4公告描述了路由器到自治系统边界路由器。 LS类型5:自治系统外部连接公告。由自治系统边界路由器组织,描述了自治系统到外部目的地的路由。

12.1.2 连接状态ID 本字段在公告中标识路由域的片段。依据于下面的LS公告类型和连接状态ID的值: 路由器连接:源路由器的路由器ID 网络连接:网络上指定路由器的IP接口地址。注意这个ID是网络IP地址和子网掩码计算后的值。 汇总连接:类型3的公告,目的网络的IP地址。对于类型为4的公告,为自治系统边界路由器的路由器ID。 自治系统外部连接:目的网络的IP地址。

12.1.3 公告路由器 这个字段对应于公告组织者的OSPF路由器ID。对于路由器连接公告,本字段等同于连接状态ID字段。网络连接公告由网络的指定路由器组织。汇总连接公司由区域边界路由器组织。最后,自治系统外部公告由自治系统边界路由器组织。

12.1.4 LS顺序号 顺序号字段是一个32位整形数。它用来测试老的和重复的连接状态公告。顺序号的空间号有一个定义的顺序。给出两个不现的顺序号,这个顺序取决于哪一个顺序号更新。在本文中,用newer标识。 顺序号的外形空间外形如图15所示。这个顺序号空间在[Perlman]和[DEC]中有描述。通常称为棒棒糖形。顺序号空间的尾是直线,入口是环形比尾部更新。 (N-1)/2

             0
      N-2

       -N+1

               -N (unused)

图15.棒棒糖状顺序号空间 更新的定义算法如下,定义中用一两个补码的算法。〈用于两个补码间的比较,-用于两个补码间的减法。N指常数231。如果按以下方式顺序号a将比顺序号b更新。 b<0, a>b or a>0, b>0, (N-1)/2>(a-b)>0 or a>0, b>0, (a-b)<(N-1)/2 连接状态公告的顺序号在一个新的公告实例组织前进行增加。当一个新的顺序号增加超过N-2时,它变为0。这是顺序号的逻辑循环。顺序号值N-1是非法的。 顺序号-N保留(没使用)。老的顺序号为(-N+1)。当一个路由器第一次组织任意的连接状态公告时使用此顺序号。路由器也可能增加这个顺序号值当前一次的实例的连接状态公告还存在于自治系统中时。在13.4节中讲解。

12.1.5 LS生存期 本字段为用秒表示的连接状态公告的生存期。它被作为一个16位整形数处理。在连接状态在组织时它的值为0,在传播过程中的每一跳它的值增加InfTransDelay。连接状态公告的生存期也保存在每个路由器的数据库中。 连接状态的生存期从不会增加到超过MaxAge。在路由表计算中生存期为MaxAge的公告是不被使用的。当一个公告的生存期第一次等于MaxAge时,它将再次广播。当一个连接状态公告不再含有任一邻居的连接状态重传列表时在数据库中被置为MaxAge生存期。这标明它已经被所有邻接的邻居所确认。 当一个路由器收到两个连接状态公告且有相同的顺序号和检查和的实例时要检查生存期,带有MaxAge生存期的实例通常作为最近接收的,这允许老的公告从路由器的域中进行刷新。否则,如果生存期不同于MaxAgeDiff,则具有较小生存期的实例作为最近接收的。

12.1.6 LS检查和 这个字段是除了生存期外公告中所有其它内容的检查和。生存期排除在外可以使它更容易更新。公告的长度也包括在连接状态的头中。检查和的使用和ISO无连接数据报一样,通常称为发送检查和。在RFC994中有文档。 检查各用来测验公告中是否有数据错误,这种错误通常发生在公告在传播时,或当它保存在路由器的内存中时。LS检查和字段值不能为零;如果出现这样的值就算为检查和错误。换句话说,检查和的计算不是随意的。 连接状态公告的检查和校验有两种途径:a)当收到一个连接状态更新包b)在连接状态数据库的生存期更新期间。检查到检查和失败导致不同的事件,详情见13和14节。 无论LS顺序号字段同时标识两个相同的公告实例,LS检查和被检查。如果不同,则检查和大的实例作为最近的公告。 12.2 连接状态数据库 路由器对它连接的每个区域有单独的连接状态数据库。连接状态数据库在拓朴数据库的别外有对应。所有属于同一区域的路由器标识区域的拓朴数据库。 对每一个不同区域的数据库通常作为不同的对待。最短路径计算对每个区域独立对待(见16节)。区域拓朴数据库的组件只在区域中传播。最终,当一个邻接(属于区域A)中断时,只有区域A的数据库在两个路由器间同步。 区域数据库的部分:路由器连接公告,网络连接公告,区域的汇总连接公告(列出所有区域的数据结构)和整个自治系统的自治系统外部连接公告。注意自治系统外部公告对整个区域数据库是相同的。 OSPF的实现必须能够存取区域数据库的单个部分。这种查找功能是基于LS类型、连接状态ID和公告路由器。在数据库中对每个连接状态公告可能有单个的实例(最近期的),使用这种查找功能,路由器可以确定它自己是否组织了一个特定的连接状态公告,如果这样,将包括LS的顺序号。

12.3 组织连接状态公告 一个路由器可能组织多种类型的连接状态公告。一个路由器对它所属的每个区域组织一个路由器连接状态公告。如果路由器在它所连接的一个网络中是指定路由器,它将为这个网络组织连接状态包。 区域边界路由器为每个已知的中间区域目的地组织一个单独的汇总连接公告。自治系统边界路由器为每个已知的自治系统外部目的地组织一单独的自治系统外部连接公告。目的地址同时及时公告以便单个路由的改变可以广播而不是将整个路由表进行广播。记住许多连接状态公司可以包含在单个连接状态更新包中。 作为例子,考虑图6中的路由器RT4,它是一个区域边界路由器,有一条连接到区域1和主干。路由器RT4向主干组织5个不同的连接状态公告(一个路由器连接,对网络N1-N4每个网络一个汇总连接)。路由器RT4将向区域1组织8个不同的连接状态公告(一个路由器连接和在图7中的七个汇总连接公告)。如果路由器RT4在网络N3中被选为指定路由器,它还将为区域1组织一个为N3的连接状态公告。 同样在这个图中,路由器RT5将组织3个不同的自治系统外部连接公告(对网络N12-N14每个网络一条)。并将在整个自治系统内广播。 当一个连接状态公告新的实例组织时,LS顺序号被增加,LS生荐期设为0,LS检查和进行计算,公告添加到连接状态数据库并传播到相应的接口。细节见13.3节。 引起组织一个连接状态公告新实例的事件为:

12.3.1 路由器连接 一个路由器为每个它所属的区域组织一条路由器连接公告。这条公告描述了路由器连接到区域的状态收集。这个公告只在特定的区域传播,不进行扩展。 路由器连接公告的格式见附录A(A.7.1节)。公告的前20字节由在12.1节讨论过的普通连接状态头组成。路由器连接公告的LS类型为1。 通过在路由器连接公告的相应位设置值来标识一个路由器是否为一个区域边界路由器或自治系统边界路由器。这使得到这类路由器的路径保存在路由表中,作为以后处理汇总连接公告和自治系统外部连接公告的条件。 路由器连接公告描述了路由器工作连接的区域。每个连接都标出。这些连接类型标出连接另一端的实体类别。每个连接都标有连接ID。这个ID给出到连接另一端入口的一个名字。下面汇总类型和连接ID字段的值。 连接类型 描述 连接ID 1 到路由器的连接 邻居路由器ID 2 到穿过网络的连接 指定路由器的接口地址 3 到子网的连接 IP网络数 另外,连接数据字段对每个连接是不同的。这个字段对连接给出32位的外部信息。对于到路由器和穿过网络,这个字段为相连路由器接口的特定的IP地址(这需要通过路由表计算)。对于到子网的连接,这个字段对应于网络IP地址的掩码。 最后,使用这条连接出口的代价也标出(对不同的服务类型可能为不同的代价)。连接的出口代价是可配置的,它必须为非零值。 为了描述构建连接记录列表的处理,假设一个路由器希望一个区域A构建路由器连接公告。路由器检查它的接口数据结构的集合,对每一个接口,做以下的步骤:

Link ID=192.1.4.0 ;IP网络号 Link Data=0xFFFFFF00 ;网络掩码 Type=3 ;连接到根网络

Other metrics=0

Tos 0 metric=2 ;路由器RT3到主干的路由器连接公告 LS age=0 ;对组织者为0 LS type=1 ;标识路由器连接 Link State ID=192.1.1.3 ;RT3的路由器ID Advertising Router=192.1.1.3 ;RT3的路由器ID bit E=0 ;不是自治系统边界路由器 bit B=1 ;RT3是区域边界路由器

Link=1

Link ID=18.10.0.6 ;邻居的路由器ID Link Data=0.0.0.0 ;无编号串行接口 Type=1 ;连接到路由器

Other metrics=0

Tos 0 metric=8

12.3.2 网络连接 网络连接公告对每个穿过的多路访问网络都生成。(一个穿过网络是一个网络有两个或多个路由器)。网络连接公告描述了所有连接到网络的路由器。 指定路由器在网络中组织公告。指定路由器仅在与至少一个网络中的其它路由器形成全邻接时组织公告。网络连接公告传播到穿过网络的所有区域。在公告中列出的路由器是那些与指定路由器形成全邻接的路由器并在公告中用路由器ID标识。每个连接从穿过网络到连接的路由器代价为0。 网络连接公告的连接状态ID是指定路由器的IP接口地址。 作为一个例子,再考虑图6中的区域配置。网络连接公告的组织有区域1中的网络N3,区域2中的网络N6和N8,区域3中的网络N9。假设路由器RT4已被选为网络N3的指定路由器,下面网络连接公告在网络N3上由RT4生成(地址见图16): ;对网络N3的网络连接公告 LS age=0 ;在组织时为0 LS type=2 ;标识网络连接 Link State ID=192.1.1.4 ;指定路由器的IP地址 Advertising Router=192.1.1.4 ;路由器RT4的路由器ID Network Mask=0xFFFFFF00 Attached Router=192.1.1.4 ;路由器ID Attached Router=192.1.1.1 ;路由器ID Attached Router=192.1.1.2 ;路由器ID Attached Router=192.1.1.3 ;路由器ID 12.3.3 汇总连接 每个汇总连接公告描述了一个路由器到单个目的地址的路由。汇总连接公告仅在一个区域内传播。目的地址描述的是到区域外部的一个地址,但仍属于自治系统内部。 汇总连接公告由区域边界路由器生成。公告到一个区域的路由汇总片段是通过检查路由表结构确定的(见第11节)。只有区域内部路由公告到主干。所有区域内部和区间路由都公告到其它区域。 为了确定哪个路由公告到连接的区域A,每个路由表入口处理如下:

12.3.4 自治系统外部连接 每个自治系统外部连接公告描述了一个路由到目的地址存在于自治系统外部的地方。自治系统外部连接公告是连接状态公告中仅有的类型传播到整个自治系统中。所有其它类型的连接状态公告是针对特定的区域的。自治系统外部连接公告由自治系统边界路由器组织。 一个自治系统边界路由器对它学来的每个外部路由组织一个简单的自治系统外部连接公告,或通过其它路由协议(如EGP),或通过配置信息得到路由信息。一个缺省路由可能也被公告。缺省路由的目的地址被定义这DefaultDestination。 对于外部路由的公告尺度可能有一到两种类型,类型1的尺度和连接状态尺度相近,类型2的尺度假设比自治系统内任一路径都大。 作为一个例子,再参考图6中的自治系统,有两个自治系统边界路由器RT5和RT7,路由器RT5组织三个外部连接公告,对网络N12-N14。路由器RT7组织两个外部连接公告,对网络N12和N15。假设路由器RT7通过EGP学到了到N12的路由,它希望公告一个类型为2的尺度到自治系统。RT7对N12会组织以下的公告: ;对网络N12的自治系统外部连接公告 ;由路由器RT7组织 LS age=0 ;组织者为0 LS type=5 ;标识为自治系统外部连接 Link State ID=N12's IP network number Advertising Router=Router RT7's ID bit E=1 ;类型2尺度 TOS=0 metric=2 12.4 TOS尺度 在每个连接状态公告中,对不同的IP服务类型(TOS)可以有不同的尺度。连接状态公告中的TOS字段直接映射到对应的IP头中的TOS字段。 TOS的尺度0经常被指定,对其它TOS值的尺度也可以指定;如果不是,这些尺度假设等于TOS为0的尺度。 作为例子,假定图16中在路由器RT3和RT6间的点到点连接作为一个卫星连接。自治系统管理员可能想鼓励使用此线路作为宽带传输。通过人工设置TOS的尺度来实现。路由器RT3将向主干组织如下的路由器连接公告: ;RT3向主干组织的路由器连接公告 LS age=0 ;组织时值为0 LS Type=1 ;标识为路由器连接 Link State ID=192.1.1.3 ;RT3的路由器ID Advertising Router=192.1.1.3 bit E=0 ;不是自治系统边界路由器 bit B=1 ;RT3是一个区域边界路由器

Links=1

Link ID=18.10.0.6 ;邻居的路由器ID Link Data=0.0.0.0 ;无编号串行线路接口 Type=1 ;连接到路由器

Other metrics=1

TOS 0 metric=8 TOS=2 ;高带宽 metric=1 ;通信选择 相反,假定管理员不想有任何的带宽通过特定的连接,则TOS 2的连接代价值应设为LSInfinity。 汇总连接公告和自治系统外部连接公告属于单个目的地址(IP网络或自治系统边界路由器)。然而,对于每种类型的服务一个单个地址可能有多条不同的路径,及单独的路由表入口。当为目的地构建汇总连接公告时所有这些入口必须被考虑,对每个TOS如果存在的话一个公告必须匹配分别的代价。 13 传播过程 连接状态更新包提供了传播连接状态公告的机制。一个连接状态更新包可能包含多个不同的公告,从组织点每个公告传播一跳或更多。为了使传播过程更可靠,每个公告必须被分别确认。确认在连接状态确认包中传回。许多不同的确认可以组织为一个包。 当一个连接状态更新包已接收时传播过程开始。许多一致性检查将在收到包后和发出传播过程前进行(见8.2节)。通常,连接状态更新包与特定的邻居和特定的区域相关。如果邻居是低于Exchange状态,包就不做深层处理即丢掉。 任何类型的连接状态公告,除了自治系统外部连接,都与特定的区域相关。公告本身不含区域信息字段,然而,区域必须可以从连接状态更新包头中推出。 对包中的每个连接状态公告,执行以下的步骤: 1.校验公告的连接状态检查和。如果检查和测试是无效的,丢弃公告并从连接状态更新包中取一下记录。 2.查找路由器连接状态数据库看是否包含当前的连接状态公告实例。如果数据库中没有,或收到的公告比数据库的更新(见13.1节确认哪个公告更新)执行下面的步骤: (a)立即在路由器接口的其它子网中传播新的公告(见13.3节)。通常(如,接收接口的状态是DR且公告从非后备的DR收到)公告将被传回收到接口。这发生在要求用来确认的处理过程(见13.5节)。 (b)从连接状态公告列表中移去当前数据库的拷贝(如,从所有邻居的连接状态重传列表)。 (c)在连接状态数据库中安装新的公告(替换当前数据库拷贝)。这将引起路由表重新计算过程。公告安装处理将在13.2中深入讨论。 (d)通过向接收接口回发一个连接状态确认包使收到的公告得到确认。这将在13.5节中进行解释。 (e)如果这个新的连接公告指示是路由器自已组织的,路由器必须建议公告的连接状态顺序号,并出示一个新的公告示例(见13.4节)。 3.否则,如果收到的公告是数据库的拷贝相同(如,不是最新的)则执行下面的两步: (a)如果公告列出在连接状态重传列表中做为接收邻接,路由器自己期待一个公告确认。路由器应当对待接收公告作为一个确认,通过在连接状态重传列表中移去公告实现。用术语“实施确认”。应当在后面使用确认处理时注意。 (b)通过向接收接口回送一个连接状态确认包来对收到的公告进行确认。在13.5节进行解释。 4.否则,数据库拷贝是最近的。注意网络管理中的不平常事情,丢弃公告及处理包中的下一个连接状态公告。

13.1 确定哪个连接状态是更新的 当一个路由器遇到连接状态公告的两个示例时,它必须确认哪一个是更新的。这发生在当比较收到的公告和数据库的拷贝进行比较时。这种比较在邻接建立时数据库交换过程必须做完。 一个连接状态公告由LS类型、连接状态ID和公告路由器标识。对相同公告的两个示例,LS顺序号、LS生存期和LS检查和字段都用来确认哪个示例是更新的。

13.2 在数据库中完装连接状态公告 在数据库中安装一个新的连接状态公告,或作为传播的结果或一个自己组织的新的公告,都可能引起路由表结构的重新计算。如果存在老公告的话,新公告的组织应当和老的公告进行比较。如果比较没有什么不同,则没有必要重新计算路由表。(注意即使内容相同,LS检查和可能不同,因为检查和包含LS顺序号)。 如果内容不同,依据于LS类型字段,下列路由表分项可能需要重算: 路由器连接、网络连接:整个路由表必须重新计算,对每个区域开始最短路径计算(不仅仅是拓朴数据库改变的区域)。原因是最短路径计算不能只限在变化的单个区域,事实是自治系统边界路由器可能属于多个区域。一个区域中当前提供最佳路由的一个改变可能使路由使用不同区域提供的内部路由。 汇总连接:由汇总连接公告描述的到目的地的最佳路由必须重算(见16.5节)。如果目的为自治系统边界路由器,它可能必须重算所有自治系统外部连接公告。 自治系统外部连接:由自治系统外部连接公告描述的到目的地的最佳路由必须重算(见16.6节)。 另外,当新的公告安装时,任何老版本的公告必须从数据库中移出。这个老版本必须从所有连接状态公告的列表中移出(如对所有邻居的连接状态重传列表,见10节)。 13.3 在传播过程中的下一步 当一个新的(最近的)公告收到时,它必须被传播到路由器的其它接口。传播公告的接口集依赖于公告的类型。

自治系统外部连接:自治系统外部连接在整个自治系统传播。符合条件的接口是所有接口,与相接区域无关,包括虚拟连接。 所有其它类型:所有其它类型都是针对一个区域(如区域A)。符合条件的接口是与区域相接的所有接口。如果区域A是主干,则包括所有的虚拟连接。 连接状态数据库必须与所符合条件的接口的相关的邻接保持同步。这通过在每个符合条件的接口执行以下步骤实现。如果相接邻居很可能性已收到公告,则需要注意的是这个步骤可能决定不传播连接状态公告到特定的接口。然而,在这种情况下传播过程必须准确确认邻居由到这个公告,以使公告保持增加到每个邻接的连接状态重传列表中。对每个符合的接口: 1.每个与接口相接的邻居被检查,确认他们是否必须接收新的公告。对每个邻居执行以下步骤: (a)如果邻居状态比Exchange低,则不需要此公告,接着检查下一个邻居。 (b)否则,如果邻接不是Full(邻居状态为Exchange或Loading),检查与邻接相关的连接状态请求列表,如果在列表中有新的公告示例,则标识邻居路由器中已有公告的示例。和邻居的拷贝比较新的公告:

13.4收到自己组织的连接包 通常发生在通过传播过程收到一个自组织的连接状态公告,如收到的公告比最后路由器组织的示例还要新,则路由器必须特殊处理。 接收到这种包标识着在路由域中路由器重启的最后时间之前组织了连接状态公告,路由器必须对过去收到的公告的顺序号进行增加而得到的顺序号,并组织一个新的公告。 另外如果公告的类型为汇总连接或自治系统外部连接,路由器可能不再有到目的地的路由,这种情况下,还必须组织一个新的公告,且尺度为LSInfinity。

13.5 发送连接状态确认包 每个新的收到的连接状态包必须被确认,这通常通过发送连接状态确信包完成。然而,也可以通过发送连接状态更新包进行确信。(见13节的3a)。 多个确认可以打包放在一个连接状态确认包中。这个包从收到公告的接口发回。包可以用一个或两个方式发送:延迟一定间隔后发送,或直接发送到特定的邻居。使用特定的确认策略依据于收到公告时的周围环境。 发送延迟确认完成几件事:它易于使多个确认包合成一个包;它可使一个包一次标识到多个邻居的确认(通过组播);它使连接到多路访问网络中的多个路由器随机发送确认包。在路由器间延迟传输的固定间隔必须很短(比RxmtInterval短)或不需要重传确认。 直接确认是对收到的重复的连接状态公告发送到特定的邻居。这些确认使用单播发送,当重复收到时立即发送。 发送连接状态确认包是准确过程是在下表中给予说明。在表左栏列出的是收到公告时的周围环境,在右边的一到两栏列出的为确认动作。这个动作依据于接口的状态;接口为Backup时和其它状态是不同的。 环境 状态中的事件

后备状态 其它状态 公告传回收到接口(参见13节,步骤2a) 无确认发送 无确认发送 公告比数据库拷贝新,但没传回到收到接口 如果从DR收到公告,则延迟确认。 延迟发送确认 公告重复,作确认对待 如果从DR收到公告,则延迟确认。 无确认发送 公告重复,不作为确认对待 直接发送确认 直接发送确认 延迟确认必须传递到与接口相连的所有邻接。在广播网络,通过组播发送延迟的连接状态确认包实现。使用的目的IP地址依据于接口的状态。如果状态为DR或BDR,使用AllSPFRouters用为目的地址。其它状态时,使用目的地址AllDRouters。在非广播网络,在单个邻接上必须单独使用单播确认(邻居状态大于Exchange)。 在上面的包作为组播发送之后的推断最好用一个例子解释,考虑图16中的网络配置,假定在网络N3中,RT4被作为DR,RT3作为BDR,当路由器RT4发送一个新的公告到网络N3时,将有RT1、RT2和RT3收到。这些路由器不会将公告传回到网络RT3,但他们仍假定他们的数据库拓朴与他们的邻接保持一致。因此,路由器RT1、RT2和RT4将等待从RT3收到确认。同样,RT3和RT4也会等待从RT1和RT2收到确认。在这种情况下用组播方式完成确认信息的传递是最好的。 对后备DR的确认逻辑有些不同的原因是在传递连接状态公告时执行的不同。(见13.3节,第4步)

13.6 重传连接状态公告 公告扩散到邻接后放入邻接的连接状态重传列表中,为了确认扩散是可用的,这些公告将被重传直到确认为止。重传的间隔时间是每接口可配置的值RxmtInterval。如果一个接口的值设置太低,将会有很多不必要的重传。如果值设得太大,扩散的速度将面临丢包的可能。 多数的重传公告将填入一单个的连接状态更新包,当公告重传时,只有适合一单个连接状态更新包的大小被传递。其它重传包当一些公告确认时传递,或在下一次重传时间到来时传递。 连接状态更新包携带重传信息通常使用单播方式传送(直接传送到邻居的物理地址),从不使用组播方式传送。每个公告的LS生存期在输出包时增加值InfTransDelay(必须大于0),直到生存期达到最大值MaxAge。 如果邻接路由器关停止工作,重送将继续直到Hello协议破坏邻接关系。当邻接被破坏时,连接状态重传列表被清除。

13.7 接收连接状态确认 在接收到的连接状态确认包传往扩散过程之前要进行许多一致性检查。通常,它与一个特定的邻居关连。如果邻居的状态低于Exchange,包将被丢弃。 否则,每个确认包将执行以下步骤:

14 连接状态数据库的生存期 每个连接状态公告都有一个生存期域,这个生存期用秒表示。一个公告的生存期在它包含到一个路由器的数据库时被增加。另外,当它拷贝到一个连接状态更新包扩散到特定的接口时,公告的生存期将增加值InfTransDelay。 一个公告的生存期的增加是从不会超过MaxAge的值。路由器会老化它的连接状态数据库,一个公告的生存期可达MaxAge。在这时,公告被重新扩散就像它是新组织的公告。这样的扩散过程在13.3节中有讲解。另外,当增加公告到邻居的数据库汇总列表时,这些带有生存期为MaxAge的公告将替换到邻居的连接状态重传列表。 公告的生存期达到MaxAge是很少发生的,通常,公告在老化到清除之前都将被新的实例替换。 带有生存期为MaxAge的公告在计算路由时是不用的。当这样的公告不再包含在任一邻居的连接状态重传列表中时,它将从连接状态数据库中移出。 在处理连接状态数据库老化时,一个公告的生存期与多个检查期相关,它的检查和将被校验。如果检查和不正确,一个程序或内存错误将被测试到,最起码路由器自己将被重新启动。

15 虚拟连接 单个主干区域(区域标识为0)是不能被断开的,或自治系统的一些区域将不可到达。这是因为所有的区域间通信都要通过主干。主干也用来分发区域间的路由信息。 建立和管理主干的连通性,虚拟连接可以穿过非主干区域配置。虚拟连接用于连接分离的主干。虚拟连接的两个端点是区域边界路由器。虚拟连接必须在这两个路由器上同时配置。在每个路由器上的配置信息包括另外一个虚拟端点(另一个区域边界路由器),和两个路由器所在的非主干区域(也称为通过区域)。 虚拟连接被作为一个无编号点到点网络对待(属于主干)加入到两个区域边界路由器中。将尝试通过虚拟连接建立邻接关系。当邻接建立起来后,虚拟连接将包含在主干的路由器的连接状态公告中,和属于主干区域的OSPF包将传到邻接点。这种邻接称为虚拟邻接。 虚拟连接的存在只能被两个端点的路由器探测到。这两个路由器必须确认虚拟连接的生存性和代价值。这个确认的步骤的机制如下:

16 计算路由表 本节详解OSPF路由表的计算过程。用与它相连的区域连接状态数据库作为输入,路由器运行以下算法,一步步构造路由表。每一步,路由器必须存取连接状态数据库的不同的数据片段(如与一个特定路由器相关的路由连接状态公告)。存取方法见12.2节讨论的查找过程。这个查找过程将返加一个连接状态公告,它的LS生存期为MaxAge。这样的公告不用在路由计算过程中,但作查找过程失败对待。 OSPF路由表的组成在11节讲解。计算路由表的第一步是使当前路由表无效。然而老的路由表内容还应当记住,这样可用来标记路由的改变。 对路由表的改变模式可使OSPF协议产生更多的动作,如区域内的路由改变会引起区域边界路由器组织新的汇总连接公告(见12.3 节)。 路由表计算包括下列步骤: 1、 当前路由表无效。路由表要重新构建,老的路由表保存作为比较使用。 2、 区域内路由通过构建与它相接区域的最短路径树计算得到。特别是所有目的类型为区域边界路由器的路由表入口都在这步计算。这步分为两部分,首先只考虑在路由器和经过的网络的连接构造树,然后子网络合并到树中。 3、 区域间路由的计算是通过检查汇总连接公告得到。如果路由器与多个区域连接(如区域边界路由器),只有主干汇总连接公告被检查。 4、 对于路由入口的下一跳为虚拟连接的,真实的(物理上)的下一跳被计算。真实的下一跳为与路由器直连的网络之一,这一步只发生在配置有虚拟连接的路由器上。 5、 自治系统外部路由计算是通过检查自治系统外部连接公告得到。自治系统边界路由器的位置(他们组织自治系统外部连接公告)在步骤2-4中确认。 步骤2-5将在下面作更深入讲解。本讲解只针对一单个TOS的计算。通常,每个计算必须考虑到多个TOS中的不同的路由。对第个TOS的任何连接状态公告都可能对应一个特别的代价(见12.4节)。TOS 0的代价必须指定,当其它任一TOS的代价没有指定时,缺省为TOS 0的代价。

16.1 计算一个区域的最短路径树 这个计算得出在一个区域内相关的区域内路由器的集合(以下你为区域A)。一个路由器在计算最短路径树时把自己为作根。最短路径树的形式分为两步完成,第一步,只有路由间的连接和通过的网络参与,使用Dijkstra算法,从连接状态数据库的子集中形成一个树。第二步,将连接到的根网络作为叶子加入到树中。 这个过程将使用第二节中的图形术语进行介绍。区域的连接状态数据库表示为一个有向图,图中的端点为路由器、通过的网络和根网络。过程的第一阶段只包含通过的端点(路由器和通过的网络)和他们之间的连接。每个通过的端点有一个相关的连接状态公告。通过最短路径树的计算,以下数据将与通过的端点相关连: 端点(结点)ID 端点的标识。对路由器端点这是一个OSPF路由器ID值。对网络端点,则为网络的指定路由器的IP地址(公告的发出源)。无论如何,端点ID和相关连的连接状态公告的连接状态ID值是一致的。 到根的距离 从根到端点的当前最优距离,用连接状态尺度表示。 下一跳列表 从根到这个端点的当前最优路径的下一跳列表。可能有多条相等代价多条路径的最优路径。 这个过程的第一阶段可以汇总如下:在任一步,都有一个候选端点的列表。从根到这些端点的最优路径还没有找到。最靠近根的候选端点被加入到最短路径树中(和路由表中),从候选表中移出,它的邻接端点将被检查看是否可能加入到候选列表中。算法反复进行,直到候选表中确认为空时为止。 详细见下面描述。记住我们在为区域A计算最短路径树,所有对连接状态数据库的参考查找都是在区域A的数据库中。 步骤0 初始化算法数据结构。清除候选端点列表。初始化最短路径树为仅此为根(即路由器自己)。 步骤1 简称刚加入到树的端点为端点V。检查与端点V相连的连接状态公告。这是基于端点标识在连接状态数据库中查找,每个由公告说明的连接给出了邻接端点的代价。对每一个公告的连接,(称为加入到端点V的端点W):

16.1.1 下一跳的计算 本节讲解如何计算增加到最短路径树中的每个端点的下一跳集合。本计算的输入为新增加的端点(也你为目标)和它在树中的父端点。 如果在根和新增加的端点间有至少一个介入的路由器,则新增加的端点简单继承它父端点的下一跳集合。否则,有两种情况,第一种,父端点为根(计算的路由器自身),这意味着目标为一个直连的网络或直连的路由器。这种情况下的下一跳为新增加连接的接口。不需要到一跳的IP地址。 第二种情况为,新增加的端点为路由器,它的父端点为网络。则下一跳的列表是通过检查新增加的路由器的连接状态公告确定。对指回到父网络公告中的每一个连接,连接的连接数据域提供一到下一跳的IP地址。

16.2 计算区间路由 区间路由通过检查汇总连接公告计算得到。如果路由器与多个区域相连接,只有主干汇总连接被检查。只连接到一个区域的路由器检查区域的汇总连接。这两种情况下,下面的汇总连接检查是一个单区域连接状态数据库的所有部分(称为区域A)。 汇总连接公告由区域边界路由器组织。依次考虑在区域A中的每个汇总连接公告。记住在汇总连接公告中描述的目标要么为一个网络要么为一个自治系统边界路由器。对每个汇总连接公告:

16.3 解析虚拟下一跳 本步骤只有在配置了虚拟连接的区域边界路由器上有必要。在这些路由器中,一些路由表入口可能含有虚拟下一跳。简言之,在16.1和16.2节中已经找到的下一跳的有一或多个可能是虚拟连接。然而,当向目的地传输数据时,下一跳必须是一个直连的网络。 这样的话,每个虚拟的下一跳要被一个真实的下一跳替代。在这个处理中一个新的路由表目的地会计算出来,它可能比前面计算的距离要小。这样的话,下一跳的列表被剪裁,只包含那些新的最短距离,从而路由表入口被更新。 只有目的类型为网络和自治系统边界路由器才需要解析虚拟下一跳。假若一个路由表的入口下一跳为虚拟连接。这通过以下步骤来确定:路由表的入口路径要么为区域内要么为区域间,与路由表入口相联连的区域应该是主干,下一跳属于另一个不现的区域(虚拟连接通过的区域)。 假若N为上面说的入口目标,A为虚拟连接通过的区域。真实的下一跳(新的目标)是通过以下步骤计算的。D为距离计数器,让真实下一跳NH为空值。接着,在区域A的数据库中查找所有汇总连接公告N,对每一个公告执行下列步骤:

  1. 查找组织这个公告的边界路由器BR,如果在与A相连的区域中没有BR的路由入口(如BR在区域A中不可到达),则检查下一条公告。
  2. 否则,让X等于从区域A到BR的距离。如果BR公告的代价(称为Y)到目标的距离为LSInfinity,则检查下一条汇总连接公告。否则,通过区域边界中路由器BR到目标N的路离为X+Y。
  3. 如果下一跳NH为空或X+Y小于值D,则让D等于X+Y并设下一跳NH为路由器BR的下一跳入口。 此时,真实的下一跳NH应该有值,计算出的距离D应当小于或等于在目标N的路由表入口中原始组织时的代价。对所有N的虚拟下一跳进行同样的计算,并让N的新代价值等于计算的距离中的最小值,用它的新的下一跳的集合,合并了非虚拟连接和重算的到这个距离的下一跳的值。

16.4 计算自治系统外部路由 自治系统外部路由是通过检查自治系统外部连接公告计算出来的。每个自治系统外部连接公告都要进行考虑。一个自治系统外部连接公告的目标通常是一个网络。对每个自治系统外部连接公告:

16.5 增量更新——汇总连接 当一个新的汇总连接公告收到时,没有必要重新计算整个路由表。称汇总连接公告描述的距离为N,A为公告所属的区域。 在路由表入口中查找N。如果下一跳到N是穿过区域A的虚拟连接(意味着与入口相连的区域为主干,列出的下一跳不属于主干,但属于区域A),则真实的下一跳需要重算。即仅运行16.3节中计算到目标N的算法。 否则,如果是到目标N为区域内路由器则什么也不需要做(区域内路由总是优先)。否则,如果区域A是路由器唯一连接的区域,或区域A为主干,则使用16.2中描述的算法,但只对目标到N的那些汇总连接公告。在这个过程执行之前,当前到N的路由表应当置为无效(保留作为比较使用)。如果这个过程指下一个虚拟的下一跳,在又将使用16.3节中的算法来计算真实的下一跳了。 如果N的路由表入口发生变化,且N为一个自治系统边界路由器,则自治系统外部连接将重新被检查(即16.4节)。

16.6 增量更新——自治系统外部连接 当收到一个新的自治系统外部连接公告时,不必要重新计算整个路由表。称自治系统外部连接公告所描述的距离为N,如果已经存在到目的地的区域内或区间路由,则不要重新计算(这些路由将优先使用)。 否则,使用16.4节中的过程,但仅计算那些到目的N的自治系统外部连接公告。在过程使用之前,当前到N的路由表入口置为无效。

16.7 路由表变化引起的事件 路由表入口的变化将引起OSPF的区域边界路由器执行附加的动作。这些路由器将执行以下的路由表变化动作:

16.8 等价多路径 OSPF协议管理多条到所有目的地的等价路径。这可在上面计算路由表的步骤中看到,也可在路由表的结构定义中看到。 每个等价的路由将有相同的类型(区域内、区间或自治系统外部),代价,及相同的连接区域。然而,每个路由将对应一个不同的下一跳和公告路由器。 运行OSPF的路由器无需保存所有到目的地的所有等价路由。可选择保留到相同地址固定数目的路由信息。这并不影响本规范中所描述的任何算法。

参考: [BBN] McQuillan, J.M., Richer, I.and Rosen, E.C.ARPANET Routing Algorithm Improvements. BBN Technical Report 3803, April 1978. [DEC] Digital Equipment Corporation. Information processing systems——Data communications——Intermediate System to Intermediate System Intra-Domain Routing Protocol. October 1987. [McQuilan] McQuilan, J.et.al. The New Routing Algorithm for the Arpanet. IEEE Transactions on Communications, May 1980. [Perlman] Perlman, Radia. Fault-Tolerant Broadcast of Routing Information. Computer Network, Dec. 1983. [RFC 791] Postel, Jon. Internet Protocol. September 1981. [RFC 944] ANSI X3S3.3 86-60. Final Text of DIS 8473, Protocol for Providing the Connectionless-mode Network Service. March 1986. [RFC 1010] Reynolds, J.and Postel, J.Assigned Numbers. May 1987. [RFC 1112] Deering, S.E.Host extensions for IP multicasting. May 1988. [RS-85-153] Leiner, Dr.Barry M., et.al. The DARPA Internet Protocol Suite. DDN Protocol Handbook, April 1985.

附录A 包格式

本附录给出多数OSPF的包格式。对每个包类型,每个区域用分隔线分开,并列出每个区域。每个OSPF包都开始于一个标准备的24字节的头。这个头将在与包的类型相关部分的前面描述。 所有OSPF包类型(除了OSPF的Hello包)都和连接状态公告列表相关。如,连接状态更新包完成在OSPF路由域内扩散公告的功能。每个连接状态公告开始于一个标准的20字节的连接状态头。既然所有的包(除Hello包)都参与连接状态头,那连接状态头将在本附录的最前面描述。 共有四种连接状态公告(路由连接、网络连接、汇总连接和自治系统外部连接公告)。所有公告都通过连接状态更新包传输;基于这个原因将单独给出连接状态更新包的公告格式。

A.1 OSPF包的封装

OSPF直接运行在IP的网络层。OSPF包将单独由IP和本地网络头进行封装。 OSPF并没有定义一种方法分割它的协议包,当包的尺寸大过可传输的链路层尺寸时依赖IP的分割传输。OSPF类型的包为较大的包(数据库描述包、连接状态请求、连接状态更新和连接状态请求包)常分解为几个单独的包。推荐作法是尺量避免IP分割。基本这个原因,一种想法是限制包的尺寸,在虚拟连接上不超过576字节。然而,如果可能,OSPF包的长度可以达到65535字节(包括IP包头)。 其它关于IP封装的重要内容如下:

A.2 OSPF包头

每个OSPF包都开始于一个共同的24字节的头。这个包头包含所有必须的信息用来确定这个包是否需要接收并做深层处理。这个确定在第8.2节的相应地方描述。

0 8 16 24 32 版本 类型 包长度 路由器 ID 区域 ID 检查和 辅助类型

身份证明

版本 OSPF的版本号。本规范为协议的版本1。 类型 OSPF的包类型如下,每个包类型的格式将在后继节中描述。 1——Hello 2——数据库描述 3——连接状态请求 4——连接状态更新 5——连接状态确认 包长度 用字节表示的包长度。这个长度包括标准OSPF包头。 路由器ID 包的源路由器ID值。在OSPF中,路由协议包的源和目的为邻接的两个端点。 区域ID 一个32位值标识这个包所属于的区域值。所有OSPF包都与一单个区域相连,而且大多数包只传输一个跳。通过虚拟连接的包标记为主干区域ID值0。 检查和 包所有内容的标准IP检查和,不包括64字节的身份证明字段。这个检查和是除身份证明字段外包中所有按16位字的补码的求和计算得到。如果包的长度不正好是16位字的宽度的倍数,在计算检查和前将用零值填充包。 辅助类型 标明包的身份认证方案。身份认证将在本规范的附录E中讨论。身份认证类型值大于255的作为单个自治系统使用。身份认证类型值在0~255之间的保留为本规范定义使用。当前定义的值为: 0——不使用 1——简单口令 身份认证 一个64位长的字段用作身份认证计划。

A.3 连接状态(LS : Link State)公告头

拓朴数据库是由单个的连接状态公告组成。每个公告描述了路由域中的一些本地片段,如一个路由连接公司(LS 类型为1)标识连接到特定路由器的网络及邻居。 所有连接状态公告开始于一个共同的20字节长的头。这个连接状态公告头包含足够的信息唯一标识这个公告(LS类型,连接状态ID和公告路由器)。 在路由域中同时可能存在连接状态公告的多个实例,所以有必要确定哪个实例更新。这通过检查在连接状态头中的LS生存期、LS顺序号和LS检查和字段确认。

  0             8            16            24           32

LS生存期 LS类型 连接状态ID 公告路由器 LS顺序号 LS检查和 长度

LS生存期 用秒表示的从连接状态公告组织开始计时。 LS类型 连接状态公告类型。每个连接状态类型有一个单独的公告格式,这些格式在A.7节中讲解。连接状态类型如下(12.1.1有深入解释): 1——路由器连接 2——网络连接 3——汇总连接(IP网络) 4——汇总连接(自治系统边界路由器ASBR) 5——自治系统外部连接 连接状态ID 这个字段标识将要在公告中使用的网络环境值。这个值在12.1.2节有详细描述。这个字段的内容依赖于公告的LS类型,对于连接状态公告类型1和4,它是路由器的ID值,对类型3和5它是IP网络号,对类型2它是指定路由器接口的IP地址(从IP网络号得到)。 公告路由器 组织连接状态公告的路由器的ID值。对类型1的公告,这个字段标识为连接状态ID。对类型2的公告,它是网络的指定路由器的路由器ID值。对类型3和4的公告,它是区域边界路由器的路由器ID值。最后,对类型5的公告,它是自治系统边界路由器的路由器ID值。 LS顺序号 用来确定连接状态公告的旧或重复值。连续的连接状态公告实例将给出连续的LS顺序号。 LS检查和 为连接状态公告所有内容的检查和。详细内容见12.1.6节。 长度 用字节表示的连接状态公告的长度。它包括连接状态头的20字节。

A.4 Hello包

Hello包是OSPF包类型1。这些包定期发送所有接口,包括虚拟连接。关联的邻居的建立和管理都是通过交换呼叫包完成的。在那些物理网络运行组播或广播兼容的网络上这些包使用组播。这可以动态发现邻居路由器。 连接到相同网络上的路由器必须同意特定的参数(网络掩码,呼叫和死亡时间)。这些参数包括在呼叫包中,这样形成不同的邻居关系将被禁止。双向通信的确定包括最近收到呼叫包的所有路由器的集合。包的字段路由器优先级、后备的指定路由器和指定路由器可使(后备的)指定路由器通过呼叫包的交换选择出来。

0 8 16 24 32

1

OSPF 包头

网络掩码 死亡时间 呼叫时间 路由优先级 指定路由器 后备的指定路由器 邻居(每个邻居一行) . . . . . .

网络掩码 这个接口相连的网络掩码。如,如果接口为B类地址,它的第三个字节用于子网,则网络掩码为0xffffff00。如果网络为A类地址,则网络掩码为0xff000000。 死亡时间 在宣布一个沉默的路由器为关闭状态之前的秒数。 呼叫时间 在路由器的呼叫包间的秒数。 路由器优先级 路由器的优先级。用于选举(后备的)指定路由器。如果设置为0,路由器将不能成为(后备的)指定路由器。 指定路由器 在这个路由器的公告中标识这个网络中的指定路由器。指定路由器的标识在这里是在网络上接口的IP地址。如果没有指定路由器则设为0。 后备的指定路由器 在路由器的公告中标识这个网络中的后备的指定路由器。后备的指定路由器的标识在这里是在网络上接口的IP地址。如果没有后备的指定路由器则设为0。 邻居 网络上最近收到有效呼叫包的每个路由器ID值。最近指在最后的死亡时间内。

A.5 数据库描述包

数据库描述包是OSPF的包类型2。这些包在初始化邻接时进行交换。它描述了拓朴数据库的内容。有多个包来描述这个数据库。基于这个目的将使用查询响应过程。一个路由器指定为主设备,另一个为从设备。主设备发送数据描述包(发出),由从设备(响应)发出收到数据库描述包的确认。响应是通过发出包的顺序号连接起来的。 数据库描述包的格式是连接状态请求及连接状态确认包的格式相似。这三种包的主要部分为一些项目的集合,每个项目描述了拓朴数据库的一部分。

0 8 16 24 32

2

OSPF 包头

0 0 0 0 I M MS 数据库描述顺序号 LS类型 连接状态ID 公告路由器 LS检查和 LS生存期 . . . . . .

0 这些字段保留,必须置为0。 I 位 初始化位。设为1时,这时数据库描述包的第一个顺序号。 M位 更多位。设为1时,标识后面还有数据库描述包。 MS位 主/从位。设为1时,标识在数据库交换处理中路由器为主。否则,为从设备。 数据库描述顺序号 用来顺序化数据库描述包的次序。初始值(初始化位为1)应为不重复值。顺序号在数据数据库描述信息没有传输完整时依次增加。 包的剩余内容为拓朴数据库的信息片段,每个数据库的信息片段包括:LS类型、连接状态ID、公告路由器、LS顺序号、LS检查和及LS生存期。加在一起,这些字段唯一标识一个公告及它的实例。这些字段都包含在公告的连接状态头中。更深入的信息见A.3节。

A.6 连接状态请求包

连接状态请求包为OSPF的类型3。在和邻居的路由器交换过数据库描述包后,路由器会发现它的部分拓朴数据库是过时的。连接状态请求包就是用来向邻居请求更新的数据库信息。可能会用到多个连接状态请求包。发送连接状态请求包是路由器成为邻接的最后一步。 路由器发送的连接状态请求包中有它需求的数据库部分的准确信息(由请求号、LS检查和及LS生存期定义)。在响应中它可能收到更新的实例。

0 8 16 24 32

3

OSPF 包头

LS类型 连接状态ID 公告路由器 . . . . . .

每个公告请求包括特定的LS类型、连接状态ID和公告路由器。这些信息唯一标识个公告,但不是这个实例。连接状态请求包应理解为请求最新的实例(有时也不一定)。

A.7 连接状态更新包

连接状态更新包为OSPF包类型4。 这些包完成扩散连接状态公告任务。每个连接状态更新包携带一组从组织的路由器一跳距离的连接状态公告包。多个连接状态公告可以放在单个包中。 连接状态更新包在支持组播和广播的网络上使用组播方式。为了使扩散过程更可靠,连接状态更新包通过连接状态确认包进行确认。如果需要重传,重传的连接状态更新包使用单播方式。

0 8 16 24 32

4

OSPF 包头

公告数 连接状态公告 . . . . . .

公告数 本更新包中连接状态公告的个数

每个连接状态公告包括一个类型字段。连接状态公告的四种类型的每种的格式都是不同的。他们的格式在下面章节讲解。所有的公告开始于一个 20字节的头,即连接状态公告头。在A.3节有讲解。

A.7.1 路由连接公告

路由器连接公告是连接状态公告中的类型1。一个区域中每个路由器都要组织路由器连接公告。公告描述了路由器连接到的区域的状态的集合。(路由器连接到一个区域可以从路由器的接口数据结构和主路由器的配置中得到,见12.3.1节)。公告的连接状态ID为路由器的OSPF路由器ID。这样的公告只在单个区域内扩散。 路由器连接是连接到一个通过网络,根网络(包括连接的主机),或其它路由器。每个连接都有一个相关的32位的数据字段;对于根网络它为网络掩码,对其它连接类型则为相应接口的IP地址。主路由器是根据连接到根网络且网络掩码为0xffffffff分类的。 所有到一个区域的路由器连接必须在单个路由器连接公告中描述。多个公告可以放在单个的连接状态更新包中。对每个连接,对每个服务类型(TOS)可能有单独的尺度。对TOS0是尺度是必须包含的,并且列在第一位。

0 8 16 24 32

1

连接状态头

E B 0 连结个数 连接ID 连接数据 类型 TOS值 TOS 0的尺度 TOS 0 尺度 . . . . . . TOS 0 尺度 . . . . . .

位E 为1时,路由器为自治系统边界路由器(E为外部)。 位B 为1 时,路由器为区域边界路由器(B为边界)。 连接数 本公告中描述的路由器连接个数。应该为这个区域所有路由器连接数的集合。

下面的字段用来描述每个路由器连接。每个路由器连接是分类的(见下面的类型字段),指示路由器连接到的目标类型。可能是通过的网络,或另一个路由器,或是一个根网络。路由器连接中的其它字段的值的解释依赖于连接的类型。

连接ID 标识路由器连接到的目标。这依赖于连接类型字段。当连结的目标也组织连接状态公告时(如另一个路由器或通过的网络),则连接ID等于另一个公告的连接状态ID。这提供了在连接状态数据库中查找另一个公告的关键字。见12.2节中的细节。另外注意连接到的通过网络的网络号可能包括相应网络的网络ID。 类型 连接ID 1 邻居路由器ID值 2 指定路由器的IP地址 3 IP网络/子网络号 连接数据 内容依赖于连接类型字段。对于根网络,它对应于网络掩码。对于其它连接类型,则为与路由器相连接口的IP地址。这些信息在构造路由表时,计算下一跳的IP地址时使用。详见16.1.1节。 类型 路由器连接的类型,可以为:

下面为每种尺度的描述。对每种服务类型可能有一种尺度。如果没有其它服务类型说明,TOS0的尺度将用于所有类型的服务。

TOS IP服务类型所对应的尺度。这个值和出现在IP包头中的TOS字段值相等。有效值为0~7。 尺度 使用特定的TOS时,路由器连接出口的代价。

A.7.2 网络连接公告

网络连接公告是类型为2的连接状态公告。一个网络连接公告是对区域中每个通过的网络组织的。通过网络是多播网络则有多个路由器相连接。网络连接公告是由网络中的指定路由器组织的。公告描述了所有连接到网络中的路由器,包括指定路由器自身。公告的连接状态ID字段列出了指定路由器的接口IP地址。 对所有的服务类型,从网络到所有连接的路由器的距离为0。这就是为什么在路由器连接公告中没有TOS和相应尺度字段的原因。

0 8 16 24 32

2

连接状态头

网络掩码 相连路由器 . . . . . .

网络掩码 网络的IP网络掩码。如,A类网络的掩码为0xff000000。 相连路由器 与网络相连的每个路由器的路由器ID值。实际上,只有与指定路由器相邻接的路由器被列出。列表中也包括指定路由器自已。包含的路由器的数目可以从连接状态公告的长度字段中推算出来。

A.7.3 汇总连接公告

汇总连接公告是类型为3和4的连接状态公告。这些公告是由区域边界路由器组织的。对每个属于自治系统的目的地(路由器所知道的),但不属于本区域,都会生成一条单独的汇总连接公告。当目的地为IP网络时,使用类型3的连接状态公告。这种情况下公告的连接状态ID字段为网络的IP号。 当目的地为一个自治系统边界路由器时,使用类型4的公告,连接状态ID字段为自治系统边界路由器的OSPF路由器ID。为什么有必要公告本地的每个自治系统路由器,详见16.4节。 除了连接状态ID字段值不同外,类型3和4的连接状态公告格式是一样的。 对每IP服务类型可能有不同的代价,但TOS 0的代价必须赋值,且列在第一位。如果对特定的服务类型没有说明,则缺省使用TOS 0对应的代价值。

0 8 16 24 32

3或4

连接状态头

网络掩码 TOS 尺度 . . . . . .

网络掩码 对类型3的连接状态公告,为目的网络的IP地址。如,当公告本地的一个A类网络时值为0xff000000。对类型4的连接状态公告则置为0。

对每种服务类型,定义了以下字段。路由器所包括的TOS的个数可以从连接状态公告的长度字段中计算出来。TOS 0的值必须组出,并列在第一位。 TOS 标识代价栏内容所对应的服务类型。 尺度 路由代价。和路由器连接公告中接口代价值相等。

A.7.4 自治系统外部连接公告

自治系统外部连接公告是类型为5的连接状态公告。这些公告由自治系统边界路由器组织。对本自治系统外部的每个目的地(路由器所知道的)都生成单独的公告。目的地通常为IP网络,公告的连接状态ID字段对应为IP网络号。 如果对特定服务类型的路由不包括,则使用和TOS 0相同的服务类型值。TOS 0的代价必须包括,且列在第一位。

网络掩码 被公告的目的地的网络IP地址掩码。如,当公告一个A类网络时,使用掩码0xff000000。 对每一种服务类型,下面的字段被定义。TOS路由的数目通过连接状态公告的长度字段计算出来。TOS 0的值必须有,且应放在第一位。 0 8 16 24 32

3或4

连接状态头

网络掩码 E TOS 尺度 外部路由标志 . . . . . .

E位 外部尺度类型。 如果设置,则尺度为类型2外部尺度。即这个尺度认为大于任何的连接状态路径。如果E为0,则对应为类型1的外部尺度。意味着是和直连的连接状态尺度兼容(不需要翻译)。 TOS 服务类型所对应的代价类型。 尺度 路由器的代价。依据外部类型标识(E位)进行翻译。 外部路由标识 与每外外部路由相关的一个32位字段。不用于OSPF协议自身。它可用于在自治系统边界路由器间交换信息。这个信息的特性的使用已超出本规范内容。

A.8 连接状态确认包

连接状态确认是类型为5的OSPF包。为了使扩散连接状态公告可靠传输,公告需要明确的确认。确认通过传送和接收连接状态确认包完成。多个连接状态公告可以通过一个包确认。没有确认的公告将会重传。 根据发送接口的状态和公告源,一个连接状态确认包可以用组播地址AllSPFRouters,或组播地址AllDRouters,或单播方式传送确认信息。详见13.5节。 这个包的格式和数据描述包同似。包的主体是简单的连接状态公告描述列表。 0 8 16 24 32

5

OSPF 包头

LS类型 连接状态ID 公告路由器 LS顺序号 LS检查和 LS生存期 . . . . . . 包中对数据库项目的描述和数据描述包内容相同。LS类型、连接状态ID和公告路由器字段标识了一个特定的公告,而LS顺序号、LS检查和以及LS生存期字段隔开公告的实例。详见A.3节的讲解。

附录B 结构常量

大多OSPF协议参量都有固定的结构值。这些参量是用名字表示的文本如LSRefreshTimer。相同名字约定用来配置协议参量。他们在另一附录中。 每个结构常量名字如下,附有值及简短的功能说明。

LSRefreshTime 在显式组织任意特定连接状态公告间的最大时间值。对路由器组织的每个连接状态公告,间隔定时器应设定为此值。定时器减为零时将引起组织一个新的连接状态公告。LSRefreshTime的值为30分钟。 MinLSInterval 在显式组织任意特定连接状态公告间的最小时间值。MinLSInterval值设定为5秒。 MaxAge 连接状态公告能达到的最大生存期。当一个公告的生存期达到MaxAge时,就将重新传送。在这个扩散确认后即从数据库中移出,如从所有邻居的连接状态重传列表中移出。公告的生存期为MaxAge时不参与路由表的计算。MaxAge必须大于LSRefreshTime。MaxAge的值为1小时。 CheckAge 当一个连接状态公告(包含在连接状态数据库里)的生存期包含多个检查期。在检查点时,公告的检查和将被检验。此时不正确的检查和标识一个严重错误。CheckAge 设为5分钟。 MaxAgeDiff 一个连接状态公告在自治系统中传播时,可以传播的最大时间。大多数这个时间是在传播过程中路由输出队列的连接状态公告中统计的(不是生存期)。MaxAgeDiff值设为15分钟。 LSInfinity 标识距离不可到达的连接状态尺度值。它定义为所有值都是1的二进制数。它的大小依赖于尺度字段的尺寸,在路由器连接公告中为16位,在汇总连接公告和自治系统外部连接公告中为24位。 DefaultDestination 目标ID指缺省路由。当路由表入口中找不到相匹配的路由时使用。缺省目标仅能用在自治系统外部连接公告中公告。它的值为IP地址0.0.0.0。

附录C 可配置常数

OSPF有相当多的可配置常数。这些常量将在下面列出。它们按常规功能分类(区域参数,接口参数等等)。一些参量将会给出示例值。 一些参数需要的值需要在一组路由器的相一致。如在同一个区域中的所有路由器必须使用相同的区域配置值,所有连接到一个网络的路由器必须使用相同的IP网络号和掩码。 一些参数由超出本规范的路由器算法确定(如通过SLIP连接到路由器的主机地址)。从OSPF的观点看,这些项仍是可配置的。

C.1 全局参数

仅有的可配置参数是路由器的路由器ID值。这是在自治系统中唯一标识路由器的值。与路由器ID相关的一个算法是选取相应IP地址的最大或最小值。

C.2 区域参数

所有在同一区域的路由器必须用相同的区域配置值。两相路由器使用不同的区域配置值将不可能在它们之间形成邻接,也不能形成路由协议的传输。以下项为一个区域的必配置值。 区域ID 标识一个区域的32位值。区域ID为0保留为主干用。如果区域表示一个子网,则子网的IP网络号可用于区域ID号。 地址范围列表 一个OSPF区域定义为一个[IP地址,掩码]对列表。每对描述了一个IP地址范围。连接到区域中的网络和主机都靠他们的地址是否洛入这个区域定义的区域范围中。路由器看作连到多个区域也依赖于它连接到的网络的区域关系。路由信息在区域边界进行汇聚。区域的外部,对每个地址范围仅公告一条路由。 作为一个例子,假若一个IP子网是一个OSPF区域。这个区域仅配置为一个地址范围,它的IP地址为子网地址,掩码为标准A、B或C类网络掩码。对区域外部仅会公告一条路由器,用来描述整个子网。 认证类型 每个区域都可配置单独的认证类型。见附录E关于认证类型定义的描述。

C.3 路由器接口参数

一些可配置的路由器接口参数(如IP接口地址和子网掩码)隐含着相应网络的属性,而且与相应网络上所有的路由器相一致。必须配置的路由器接口参数有: IP接口地址 接口的IP协议地址。它是在整个互联网上的唯一标识。在串行线路上可以不用IP地址,这样的串行线路称为无编号。 IP接口掩码 标识相应网络的IP接口地址的一部分。通常对应于子网掩码。 接口输出代价 通过接口发送包的代价,用连接状态尺度表示。这在路由器连接公告的连接代价中公告。对每种IP服务类型可能有不同的代价。接口输出代价通常必须大于0。 RxmtInterval 对一个接口所属的邻接,在连接状态公告重传间的秒数。也用于在数据库描述和连接状态请求包重传时。它应当比期望在任意两个与网络相连的路由器间的延迟要长。这个值的设定应当保持或无需重传发生为准。它应当大于低速串行线路和虚拟连接的速度。本地区域网络的值如:5秒。 InfTransDelay 化费在一个接口上传输一个连接状态更新包所需秒数的估计值。连包含在更新包中的接状态公告的生存期必须在传输前加上这个值。这个值应当算入接口的传输延迟计算中。它必须大于0,本地区域网络值如:1秒。 路由器优先级 一个8位无符号整形数。当连接到一个网络的两个路由器同时竟争指定路由器,则高优先级的路由器成功。如果还有竟争,则还是高优先级的获胜。优先级为零的路由器在相连的网络上是不符合成为指定路由器的条件。路由器优先级只用在多路存取网络的接口上配置。 HelloInterval 在路由器接口发送呼叫包之间用秒表示的时间长度。这个值在路由器的呼叫包中告知。它在相同的网络连接的路由器必须是相同的。呼叫间隔越短,拓朴变化侦测到越快,但传送更多的路由信息。如对X.25 PDN网络的值为:30秒。对本地网络如:10秒。 RouterDeadInterval 在邻居宣布路由器关闭前,没有收到一个路由器的呼叫的秒数。这个值在路由器呼叫包中为DeadInt字段。它应当为HelloInterval的倍数(如4)。这个值同样要求与相同网络连接的路由器使用同一值。 认证字 本配置允许认证过程处理生成或验证在OSPF包头中的认证字段。如,如果认证类型为明文密码,则认证字为64位密码。这个值在组织路由协议包时直接插入到OSPF包头中。对每个网络应有不同的密码。

C.4 虚拟连接参数

虚拟连接可在一对与相同区域(非主干)相连的边界路由器间配置。虚拟连接出现在主干的图形上为无编号点对点连接。虚拟连接必须在两个区域边界路由器上配置。 出现在路由连接公告(对主干)中的虚拟连接就是像对主干的单独路由器接口一样。同样,它有和路由器接口相关的所有参数(见附录C.3)。但虚拟连接作为一个无编号点对点连接,它有一个相连的IP接口地址,这个地址使用发送虚拟连接协议包中的源IP地址,在路由表构造过程中它是个动态地址。虚拟连接的接口出口代价动态设为区间两个路由器间路径的代价。参数“RxmtInterval”必须要配置,且应当超过两个路由器间来回的延迟时间。这可能使得建立虚拟连接很困难。最好在一边设设为足够大以免出错。路由器优先级在虚拟连接上没有使用。 一个虚拟连接通过两个参数配置:虚拟连接另一端点的路由器ID值和虚拟连接工作时通过的区域(非主干)。

C.5 非广播、多路存取网络参数

OSPF对待一个非广播、多路存取网络就像对待一个广播网络一样。既然与网络相连有多个路由器,就会产生指定路由器。由这个指定路由器组织网络连结公告,由它列出与非广播网络相连的所有路由器。 然而,由于缺乏广播网络的能力,有必要在产生指定路由器时使用配置参数。仅需要在选为指定路由器的那些路由器上配置参数(如,网络中那些路由器的DR优先级设为非0值)。 列出所有其它相连的路由器 所有其它与非广播网络相连的路由器列表。列表中有每个路由器在网络上的IP地址。另外,对每个列出的路由器,路由器可能成为指定路由器的标识必须定义。到非广播网络的一个接口起动时,呼叫包仅传递到那些可能选为指定路由器的路由器,直到标识出指定路由器为止。 PollInterval 如果一个邻居路由器变为非活动状态(超过RouterDeadInterval秒没有收到呼叫包),可能仍需向死亡的邻居发送呼叫包。这些呼叫将以PollInterval的低速发送,它将比HelloInterval时间长很多。如PDN X.25网络上值为:2分钟。

C.6 主路由参数

主路由是在网络连接公告中作为带有掩码0Xffffffff的根网络公告的。它们批出或是点到点网络的路由接口,路由器循环接口,或同路由器直接的IP主机(如通过SLIP线路)。对任一直接连接的主机,以下项目必须配置: 主机IP地址 主机的IP地址。 到主机的代价 发送包到主机的代价,按照连接状态尺度计算。注意只有当主机为多宿主机时才有用。

D 必要的统计信息

一个OSPF的实施必须提供一个标识协议操作状态最小集的统计信息。这个统计必须是用户可获得的,并且通过一些网络分类管理接口可以实施的。 希望这些统计信息对实现的调试过程有帮助,及在协议性能的分析方面也有帮助。 统计信息可能分为明示的两类,第一部分包括我们将使用的日志信息。这些信息是实事产生的,通常是单个协议事件产生的简单信息。这些信息通常也作为中断时的参考。 第二类为附加的统计信息。这些信息是长时间的数据收集,如在过去数小时内连接状态重传的次数。这些转出信息接不同的路由数据结构分类给出。

D.1 日志信息 对每个重要的协议事件都应当生成日志。下面列出主要的事件。这些事件中的大部分指示在路由域中的拓朴变化。然而,一些日志信息可能是路由域长时期保持工作的信息。如,在连接状态刷新定时器触发时发生的连接状态组织更新。 任一与连接状态公告对应的信息都会记录与公告相关的区域信息。自治系统外部连接公告则没有相关区域。 以下列出了在路由域中拓朴变化时批示出的日志信息: T1 路由器接口状态变化。接口状态变化写在9.3节的文档中。通常,将引起生成新的连接状态公告。日志信息将包括接口的IP地址(或其它名字)、接口类型(虚拟连接等)及新旧两种状态(见9.1节的文档)。 T2 邻居的状态变化。邻居状态变化写在10.3节的文档中。日志信息产将包括邻居的IP地址及新旧状态值。 T3 任一相连网络的(后备的)指定路由器变化。见9.4节。日志信息将包括网络的IP地址及新旧(后备的)指定路由器。 T4 路由器组织一个新的连接状态公告实例。日志信息将包括LS类型、连接状态ID和与公告关连的公告路由器(见12.3)。 T5 路由器收到一个新的连接状态公告实例。路由器在连接状态更新包中收到这些公告实例。这将引起重算路由表。日志信息将包括公告的LS类型、连接状态ID和公告路由器。当然还要包括从哪个邻居收到的公告。 T6 路由表入口变化(见11节)。日志信息将包括目的类型标识、目的ID和到目的地的新旧路径。 以下日志信息将指出网络配置一个错误: C1 收到的一个OSPF包,因它的IP/OSPF头错误而拒绝。这种拒绝的原因在8.2 节的文档中。包括OSPF检查和错、认证失败和无能力匹配一个活动的OSPF邻居的源地址。日志信息将包括源和目的IP地址、OSPF头中的路由器ID和拒绝的原因。 C2 收到的呼叫包因呼叫参数和接收接口配置不一致而拒绝(见10.5 节)。这标识一个相接网络的配置问题。日志信息应当包括呼叫的源、接收端口和不匹配参数。 C3 一个收到的数据库描述包,连接状态请求包,连接状态确认包或连接状态更新包因为包中的源邻居在不正确的状态而拒绝(分别见10.6、10.7、13.7和13节)。当网络中的指定路由器标识变化时,瞬时引起邻接的有效性变动是很正常的。日志信息应包括源邻居及状态和包类型。 C4 数据库描述包被重传。这意味着相应接口上RxmtInterval的值配置太小。日志信息应包括从哪个邻居收到的包。 以下信息可能引起包重传错误或在OSPF实施过程中引起软件错误: E1 接收到的连接状态公告检查和不正确。公告被丢弃(见13节)。日志信息应包括公告的类型、连接状态ID和公告路由器。还应包括从哪个邻居由到的公告。 E2 在处理生存期时,发现数据库中一个连接状态公告检查和不正确。这标识内存出错或路由器自己的软件出错。路由器应当御载数据并重启。 以下信息标识路由器重新启动,丢失了以前的LS顺序号记录。如果这些信息继续,则可能标识重复的路由器ID: R1 看到两个相同的连接状态公告,它们的LS类型、连接状态ID、公告路由器和LS顺序号都是相同的,只有检查和不同。这些可视为同一公告的不同示例。检查和大的示例可接受为较新的(见12.1.6和13.1节)。日志信息应当记录LS类型、连接状态ID、公告路由器、LS顺序号及两个不同的检查和。 R2 看到两个相同的连接状态公告,它们的LS类型、连接状态ID、公告路由器、LS顺序号和检查和都是相同的,只有LS生存期不同。这意味着其中的一个公告生存期为MaxAge,或两个连接状态生存期差超出MaxAgeDiff。日志信息应当记录LS类型、连接状态ID、公告路由器、LS顺序号及两个不同的生存期。 R3 路由器收到由它自己组织的公告的一个示例,并视为最新的。这强迫路由器组织一个新的公告(见13.4节)。日志信息应当记录公告的连接状态类型、连接状态ID和公告路由器及从哪个邻居由到的公告。 R4 收到对一个公告示例的确认不是路由器数据库中最近的公告(见13.7节)。日志信息应当包括被确认的示例及在数据库的拷贝(如果存在),还包括从哪个邻居由到的确认。 R5 通过扩散过程收到的公告比当前数据库中的拷贝更新(见13节)。日志信息应当包括由到的公告的连接状态类型、连接状态ID、公告路由器、LS顺序号、LS生存期和LS检查和。还包括从哪个邻居收到的公告。 以下信息标识正常,很少发生的协议事件。这些信息将对以上的信息起到帮助解释作用。 N1 对路由器自己组织的公告连接状态刷新定时器已经触发(见12.3节)。一个新的公告示例将组织。信息应包括公告的LS类型、连接状态ID和公告路由器。 N2 路由器连接状态数据库的一个公告的生存期已至MaxAge(见14节)。此时,公告将不再包含在路由表计算中,应当被重新扩散。信息包括公告的LS类型、连接状态ID和公告路由器的列表。 N3 生存期为MaxAge的公告从路由器数据库中得到刷新。这发生在公告被所有邻接已确认时。信息应包括公告的LS类型、连接状态ID和公告路由器的列表。

D.2 累计统计 这些统计显示路由器数据结构的集合。它们应当能够通过网络管理工具交互式得到。 所有下列统计信息,除区域列表、路由表和自治系统外部连接外都是针对同一个区域的。和第四节中注意点一样,大多数OSPF协议对每个区域单独计算。 以下为一些有用的统计显示: 1、与路由器相连的所有区域的列表,包括区域认证类型,与区域相连的路由器接口,网络的个数和属于这个区域的路由数。 如,图16中的路由器RT3。它有接口到两个独立的区域:区域1和主干(区域0)。以下显示主干使用简单口令的认证,区域1没有使用认证。包括IP网络的网络个数、子网和主机(显示2个主干网络——它们是主机路由器通过串行线路在主干上的路由器RT6和RT10)。 区域ID

ifcs

AuType

nets

routers

0 1 1 2 7 1 2 0 4 4

2、一个区域中所有路由器接口的列不,包括它们的地址、输出代价、当前状态、相接网络上(后备的)指定路由器、与接口相接的当前邻居数。它们中的一些邻居已成为邻接,这将在显示中给予提示。 还使用图16中的路由器RT3。以显示指出RT4为网络N3的指定路由器,RT1为后备。邻接在所有路由器间建立。除RT3外没有路由器连接到网络N4,因此它为DR,在它的路由器连接公告中作为一个根网络公告。 IP地址 状态 代价 DR 后备 邻居 邻接 192.1.1.3 DR other 1 192.1.1.4 192.1.1.1 3 2 192.1.4.3 DR 2 192.1.4.3 None 0 0 3、与特定接口相连的邻居列表。显示每个邻居的IP地址、路由器ID、状态和到邻居的三个连接状态队列的长度(见10节) 假设路由器RT4为网络N3的指定路由器,路由器RT1为后备的指定路由器。路由器RT3和RT1间的邻接还没有形成完成状态。显示路由器RT3的邻居(与网络N3连接的接口)将如下所示。显示说明RT1和RT3正处在数据库交换过程,路由器RT3有更多的数据库描述表的数据包要传给RT1,RT1至少有一个连接状态公告在RT3中没有。另外,中有单个连接状态公告已经扩散,但在扩散过程中参与到的每个邻居还没被确认(状态>=交换)。(在下例中假定路由器的ID值为最小的IP接口地址)。 邻居IP地址 路由器ID 状态 包长度 汇总长度 请求长度 192.1.1.1 192.1.1.1 交换 1 10 1 192.1.1.2 192.1.1.2 两路 0 0 0 192.1.1.4 192.1.1.4 完成 1 0 0 4、区域的连接状态数据库列表。在区域所连接的所有路由器都是一样的。它们组成了区域的路由连接、网络连接和汇总连接公告。另外,自治系统外部连接公告也是所有区域数据库的一部分。 图16中区域1的连接状态数据库如下(和图7中的比较)。与上例一样,假定网络3的指定路由器是RT4,路由器RT3为以前网络3的指定路由器。它的网络连接公告仍为数据库的一部分(还没有到刷新期)。 路由器RT3和RT4都组织汇总连接公告到区域1中,因为他们都是区域边界路由器。路由器RT5和RT7为自治系统外部路由器。他们的位置必须中汇总连接公告中进行描述。另外,自治系统外部连接公告会扩散到整个自治系统。 路由器RT3通过查看公告中的公告路由器字段是否为自己的路由器ID(192.1.1.3)定位它自己组织的公告。 连接状态顺序号、连接状态生存期和连接状态检查和字段标识公告的示例。他们的值存储在公告的连接状态头中,我们在示例中没有写这些值。 LS类型 LS ID 公告路由器 LS顺序号 LS生存期 LS检查和 1 192.1.1.1 192.1.1.1

E 认证 所有OSPF协议交换都是要认证的。OSPF包头(见A.2节)包含一个认证字段,64位数据表示认证计划(由类型字段确定)。 认证类型是基于每个区域配置的。附加的认证数据是基于每接口配置的。如,如果一个区域使用简单计划认证,区域中每个网络要配置一个独立的口令。 认证类型为0~255在以下进行说明,其它认证类型可能用在本地单个自治系统中。

E.1 认证类型0 无认证 使用认证类型0意味着在区域中的路由交换不进行认证。OSPF头中的64位字段可为任意值,在包的接收过程中不进行检查。

E.2 认证类型1 简单认证 使用认证类型1则64位字段基于每个网络配置。在特定网络上传送的的所有包都必须在他们的OSPF包头中的64位字段中进行配置。本字段作为透明口令服务。 这种保护在区域中针对加入的路由器,在他们加入到路由域前必须首先要配置相连网络的口令。

安全考虑

所有OSPF协议交换都是要认证的。这通过包含在OSPF包头中的认证字段实现。更多信息见8.1和8.2节及附录E。

作者地址

John Moy Proteon,Inc. 2 Technology Drive WestBorough, MA 01581-5008 Phone: 508-898-2800 Email: jmoy@proteon.com

RFC1131——The OSPF Specification OSPF 规范

RFC文档中文翻译计划

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8