本人八年前翻译的RFC为中英文混排,现重新整理出中文版本,发布在此处
1.引言
本文档主要关于OSPF为了适应IPv6而进行哪些修改的 。OSPF中的基本机制(泛洪、DR选举、区域的支持、SPF算法的运行)未发生更改。但是,从IPv4到IPv6字面上的变化以及单单随之产生的海量IP地址就迫使让我们必须对OSPF做一些改进。改进后的OSPF的版本号就从2升到3了。适用于IPv6的OSPF也被称为OSPFv3。
第2章详细讲解OSPF在IPv4环境与IPv6环境下的不同点。
第3章讲解本文档(RFC 5340)对RFC 2740的改进的地方
第4章讲解如何具体实现这些改进
附录A 介绍了OSPF所有数据包及LSA的格式
附录B 介绍的OSPF架构常数?(architectural constants)
附录C介绍配置命令中的一些参数
1.1. 文中表示“要求”含义的几个词语,Requirements Notation
(译者注:对下列词语使用的规定请参见:
http://blog.csdn.net/BryanGG/article/details/2443488 感谢Bryan.Wong ! )
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”,
“SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this
document are to be interpreted as described in [RFC-KEYWORDS].
1.2. 专业术语 ,Terminology
本文档中,尽量使用来自IPv4 、IPv6的OSPF的各自标准的术语。这产生了一个混合的结果。 大部分的术语在OSPF的2个版本中拥有一个粗略的意义(比如接口). 然而,这产生了一些不便。在IPv6中,OSPF 使用 "link"来对应于IPv4 OSPF中的 “subnet"或 “network”。那么,我们在IPv6中使用术语 “link”。在本文档的大部分情醒下"Link"代替了OSPFv2中的"subnet” and “network”,尽管OSPF的 network-LSA仍然没有变化 (但一种新的 link-LSA被创造出来了)。
一些 OSPF的 LSA的名称发生了改变。可以去2.8章获取详细信息 。
在本文档中, 一个OSPF实例是一个拥有完整的数据结构(比如:区域、 接口、邻
居)、链路状态数据库、协议状态机和协议进程(如 SPF的运算)的独立的协议实例。
2. 与OSPFv2 的不同点 ,Differences from OSPF for IPv4.
OSPFV2中的大部分算法被保留在OSPFV3中继续使用,但是,从IPv4过渡到IPv6以及单单随之产生的海量IP地址就迫使让我们对OSPF进行一些必需的改进。
接下来的几个小节将会说明OSPFv3 和OSPFv2的不同点。
2.1. 每链路的协议处理而不是每子网的协议处理 ,Protocol Processing Per-Link, Not Per-Subnet
IPv6中使用 “链路” 象征 “可以在数据链路层通信的节点间的通信设施或介质”。 “接口”连接着“链路”。 多个IPv6子网能够被分配给单个链路,而且两个节点能够跨单个链路直接通信,即使它们不在同一个IPv6子网 (参见[IPv6 前缀])。
为此, OSPF 在IPv6中的运行是基于每链路而不是IPv4中基于每IP子网的机制。IPv4中的术语“网段”、“子网”可以被直接看作为IPv6中的“链路”。同样地,IPv6中,接口如今连接的是链路而不是子网了。
这个变化影响OSPF协议数据包的接收、Hello包中的内容和Network-LSA中的内容。
2.2. 地址语义的移除 ,Removal of Addressing Semantics
在OSPFv3中,地址语义从OSPF的数据包以及主要的LSA中移除,这就产生了一个与网络协议无关的的协议内核。特别注意一下几点:
-
除了LSU承载的LSA“有效载荷”字段)外,IPv6地址不会出现在其他OSPF的数据包中。
2.7 小节中有更为详尽的说明。 -
路由器LSA和网络LSA只是简单表示出拓扑信息,不再含有网络地址字段了。2.8 小节有详细的说明。
-
OSPF的路由器ID, 区域 ID和 LSA的 Link State ID 仍然是以32位的IPv4地址来标识的。它们不再用(IPv6)地址指定了。
-
邻居路由器总是用路由器ID来互相识别的。而在上一代IPv4的广播网络、NBMA(非广播多路访问)和点到多点网络类型上是通过IPv4地址来互相识别的。
2.3. 增加的泛洪扩散范围 ,Addition of Flooding Scope
LSA的泛洪扩散范围以显式编码到LSA类型字段中。LSA有3种泛洪范围。
-
链路本地范围(Link-local scope)。LSA 只在本地直连链路上扩散。关于
全新的链路LSA的说明,详见4.4.3.8小节。 -
区域范围(Area scope)。 LSA 只在单个区域内泛洪扩散。
使用如下几种LSA:router-LSA , network-LSA 、 inter-area-prefix-LSA 、
inter-area-router-LSAs和 intra-area-prefix-LSA。 -
自治系统范围(AS scope)。 LSA将会在整个路由域内扩散。 即AS-external-LSA。一台能够始发在自治系统内泛洪LSA的路由器叫ASBR,而且它将发往其它正常区域的Router-LSA的E-bit进行设置。
2.4. 每条链路上对多实例的显式支持 ,Explicit Support for Multiple Instances per Link
OSPF现在具有在单个链路上运行多个实例的能力。例如,在NAP上(因特网骨干网络节点之一、ISP互相连接的节点,译者注),就需要它。ISP 希望拥有单独的路由选择域,即使已经有部分(和其他ISP)共享的链路。在OSPFv2中,这种需求基本是通过随心所欲的设置认证来实现。
另外一个OSPFv3采用多实例的场景是:由于这样或那样的原因就可以使单个链路属于两个或更多的区域,并且你想要多少就有多少区域。
通过在OSPFv3的报文头部、接口数据结构中的“Instance ID”字段来实现在一条链路上支持多实例。实例号适用于正常的OSPF区域和虚链路,但仅仅影响OSPF数据包的接收。
2.5. 链路本地地址的使用 ,Use of Link-Local Addresses
IPv6 的链路本地地址只用于单个链路,可以用于邻居的发现、自动配置等。 IPv6路由器不会转发源地址为链路本地地址[IP6ADDR]的数据包。链路本地单播地址分配的是前缀为FE80/10的区块。
OSPFv3假定每个路由器连接物理链路已经被分配了链路本地地址[IP6ADDR]。在所有的接口上(除了虚链路), 都使用接口所分配的链路本地单播地址作为发送OSPF数据包使用的源地址。一台路由器会学习所连接的链路的另一端路由器的链路本地地址,并且它会把这个学到的地址作为转发数据时的下一跳地址。
在虚链路上,必须(MUST) 使用一个全局IPv6地址作为OSPFv3数据包的源地址。
链路本地地址只会出现在OSPFv3的link-LSA里面(详见4.4.3.8小节)。注意,链路本地地址不允许在其它类型的LSA中出现。特别注意链路本地地址一定不能(MUST NOT )被以下类型的LSA所通告出去:
- inter-area-prefix-LSAs (见 4.4.3.4小节)
- AS-external-LSAs (见4.4.3.6小节)
- NSSA-LSAs (见4.4.3.7小结)
- intra-area-prefix- LSAs (见4.4.3.9小节)。
2.6. 认证的变化 ,Authentication Changes
在IPv6环境下,认证功能从OSPF协议中移除,即“认证类型(AuType)”、“认证(Authentication)”字段从OSPF数据报头移除,同时所有与OSPF相关的认证字段也从区域和接口的数据结构中移除。
在IPv6中, OSPF依靠IP认证报头(见 [IPAUTH])和IP 封装安全有效负荷 (见[IPESP]) 来保证路由过程中的认证/机密性。 [OSPFV3-AUTH]对此有详尽的说明。
通过IPv6中上层协议的校验和(详见8.1小节的[IPV6]), 可以保证OSPF 数据包在传递过程中避免偶尔出现的数据错误与损坏。注意这个校验和是针对整个OSPF数据包和OSPF伪头部的(详见附录 A.3.1) 。
2.7. 数据包格式的变化 ,Packet Format Changes
OSPFv3直接运行在IPv6只上。除此之外的变化是所有的“寻址语义”从OSPFv3数据报头中移
除,使之达到实质上的“独立于网络层的协议”。所有的地址信息如今只包含在各种LSA中。
详细的来看,(IPv6中的)OSPF数据包格式的变化有如下几点:
-
OSPF的版本号从2升级为3。
-
OSPF的Hello包、DBD中的可选字段扩大到了24 bit。
-
认证字段和认证类型字段从OSPF报头移除了(见 2.6小节) 。
-
如今的Hello包中不包含任何地址信息了。但是, 它里面有“接口 ID(Interface ID)”字段,是起源路由器用来唯一标识所连的链路对应的(自身的)正确的接口。如果路由器成为DR的话,接口ID会成为Network-LSA的链路状态ID。
-
2个可以进行设置的比特位(可以设置为0或1,译者注):“R-bit” 和 “V6-bit”,它们被添加到用于SPF算法的计算(见附录 A.2)的Router-LSA的可选字段中。若 “R-bit”被清零, OSPF发言人就能够直接加入OSPF的拓扑分布中而不转发途经的流量;这一点可以用于同一个(局域网内)多台主机加入路由选择协议。V6-bit细化了R-bit的使用:
若V6-bit清零,则此OSPF发言人能够加入OSPF拓扑而不会用于转发IPv6的数据报文;
若R-bit已经置1,并且V6-bit清零,IPv6数据报文就不能够被转发,但另一个地址族——IPv4的数据就能被转发。 -
OSPv3数据报头中的"实例 ID(Instance ID)"字段是用来支持在单个链路上运行多个实例的 (详见 2.4小节)。
2.8. LSA 格式的变化 ,LSA Format Changes
所有的寻址语义字段从LSA报头、Router-LSA和 Network-LSA中移除。这两种LSA以独立于网络层协议的方式来描述路由域的拓扑。新的 LSA 被引入来传递IPv6地址信息及解析路由器的下一跳的信息。一些IPv4中LSA的名称变得更加一致了。
下面将详细讲解LSA 格式的几个变化:
-
可选项字段从LSA的首部移除,转而移至Router-LSA、Network-LSA、Inter-area-router-LSA和Link-LSA中,并且扩展到了24 bit。(详见附录A.2)。
-
LSA类型字段(即选项字段)被扩大了16比特(一共24比特,译者注),同时前3个比特位的编码用于泛洪范围和未知LSA类型的处理(见2.9小节)。
-
LSA中的地址格式为[前缀,前缀长度]而不再是[地址,掩码]了(详见附录
A…4.1)。缺省路由被表示为长度为0的前缀。 -
Router-LSA和Network-LSA不再含有地址信息了,并且独立于网络协议。
-
路由器接口信息可以[MAY]被多个Route-LSA所传播。当运行SPF算法时,
接受者一定[MUST]要综合计算起源已知路由器的所有Router-LSA。 -
Link-LSA 的引入。Link-LSA的泛洪扩散范围仅仅在本地链路上,而不会超出这个所关联的范围。Link-LSA 有3个作用 :
1) 向链路附属的所有其它路由器提供本地的“链路本地地址”。
2) Link-LSA以一个IPv6前缀的列表来承载相关联的链路信息,进而告知其它路由器 。
3) Link-LSA会允许路由器通告多个比特选项,进而与链路上始发的Network-LSA相关联。
详见4.4.3.8小节。
-
在IPv4中 the Router-LSA 承载着路由器的 IPv4 接口的IP地址(IPv4中的“链路本地地址”)。它们仅仅被用于在路由计算过程中计算下一跳(详见[OSPFv2]的16.1.1小节),所以他们不需要从本地链路上泛洪出去。因此,使用Link-LSA传播这些地址将会更加有效。注意,链路本地地址绝对不会够从收到的Hello包中学习到。在 NBMA 线路上,与下一跳路由器不必要再交换Hello包了。而是这些路由器通过DR感知到相互的存在。
-
Network-LSA中的选项字段值设置为链路上互相通告的路由器的Link-LSA的选项字段进行逻辑或运算后的结果。
-
3号类型的summary-LSA被重新命名为 “Inter-area-prefix-LSA”(域间前缀LSA)。
4号类型的汇总LSA被重新命名为 “Inter-area-router-LSA”(域间路由器LSA)。 -
inter-area-prefix-LSA ,inter-area-router-LSA, NSSA-LSA, 和 AS-external-LSA中的链路状态ID已经失去本来使用地址的意义,如今链路状态ID仅仅用来识别链路状态数据库中的每一个片段。所有的地址或者路由器ID都从链路状态ID变成了用LSA表示。
-
Network-LSA和Link-LSA的链路状态ID 是LSA中唯一具有额外意义的LSA。这些LSA中,链路状态 ID 总是用来描述链路上始发数据的路由器的接口ID。 由于这个原因,Network-LSA和Link-LSA是仅有的无长度限制的LSA:一个Network-LSA必须[MUST]列出连接到链路上的所有路由器,同样一个Link-LSA必须[MUST] 列出路由器中所有在该链路的地址。
-
一种叫做区域内前缀LSA(Intra-area-prefix-LSA)的新的 LSA被引入。这种 LSA专门承载 IPv6地址前缀,而在IPv4中,地址前缀则由Router-LSA和 Network-LSA承载,详见 4.4.3.9 小节。
-
AS-external-LSA包含一个可选的转发地址或外部路由标识。除此之外, AS-external-LSA现在能够引用另一个LSA,进而就可以将OSPF协议的之外的路由属性列入其中。例如,可以将BGP路径属性附加到外部路由条目中。
2.9. 处理未知的 LSA 类型 ,Handling Unknown LSA Types
对未知LSA类型的处理已经更加灵活。所以,在LSA类型的基础上,未知LSA类型被 看作是似乎可以被理解的那样在链路本地范围扩散,或被存储和泛洪出去。这种行为在LSA的链路状态首部的LS类型字段的处理位有明确的编码(详见附录 A.4.2.1)。
IPv4下的 OSPF 简单地丢弃未知类型LSA(在IPv6中)做法在IPv6下是不被支持的,这是为了在单个链路上混合(提升)路由器的能力。 当DR支持的选项少于链路上其它路由器时,丢弃未知的类型会引起一些问题。
2.10. 对Stub/NSSA 区域的支持 ,Stub/NSSA Area Support
在OSPFv2中, Stub 和 NSSA 区域被设计用于减小该区域内路由器的链路状态数据库和路由表的大小。这将会让路由器加入巨型OSPF网络时消耗最少的资源。
在OSPFv3中,Stub 和 NSSA 区域的概念被保留。在IPv6中强制规定,Stub 区域只承载Router-LSA、Network-LSA、Inter-area-prefix-LSA、Link-LSA 和Intra-area-prefix-LSA。而NSSA 区域里,除了上述之外还有新的NSSA-LSA。它们是IPv4下Stub区域内的Router-LSA、Network-LSA,类型为3的Summary-LSA以及IPv4下NSSA区域中的Router-LSA、Network-LSA,类型为 3的Summary-LSA和NSSA-LSA的等价概念。
2.11. 通过Router ID 识别邻居 ,Identifying Neighbors by Router ID
OSPFv3中,总是通过识别Router ID来与链路上的路由器建立邻居关系的。这与IPv4环境下是不同的:在点对点网络、虚链路上识别它们的Router ID ;在广播网络、NBMA网络、点对多点网络识别它们的IPv4接口地址。
这个改变影响OSPF数据包的接收(见[OSPFV2的8.2 小节])、邻居的查找(见[OSPFv2]的第10章)和Hello包的接收(见[OSPFv2]的10.5小节)。
0.0.0.0的 Router ID被保留的并且不能[ SHOULD NOT]被使用。
3 此RFC和RFC 2740不同之处 ,Differences with RFC 2740
基于RFC 2740 的OSPFv3与基于本规范的实现具有互操作性。但是协议仍有一些增加部分和改变,并且只会向后兼容(即不会向前兼容OSPFv2。译者注)。
3.1. 对同一链路上多个接口的支持 ,Support for Multiple Interfaces on the Same Link
这个协议特性在RFC 2740 中只是部分地进行说明。那种层次的规范是不足以实现这个特性的。4.9小节指出基于该功能的实现而添加的部分和必要的说明。它们和RFC 2740 是完全兼容的。
3.2. 在IPv6中废除对MOSPF的支持 ,Deprecation of MOSPF for IPv6
这个协议特性在RFC 2740 中只是部分地进行说明。那种层次的规范是不足以实现这个特性的。MOSPF目前还没有实际部署过。组播的扩展支持(MOSPF)及其相关的协议字段从OSPFv3中废除。请阅读 4.4.3.2小节、 4.4.3.4小节、4.4.3.6小节、4.4.3.7小节、附录A.2、附录A.4.2.1、附录A.4.3、附录A.4.1.1 和7.1小节。
3.3. 对NSSA 的详细说明 ,NSSA Specification
这个协议特性在RFC 2740 中只是部分地进行说明。那种层次的规范是不足以实现这个功能的。本文档包括一个专门对OSPFv3的NSSA说明。这种说明加上[NSSA]提供了足够的信息来实现此特性。可以查阅 4.8.5小节、附录 A.4.3、附录 A.4.8和[NSSA]。
3.4. 废除了Stub区域对未知LSA泛洪的限制 ,Stub Area Unknown LSA Flooding Restriction Deprecated
In RFC 2740 [OSPFV3], flooding of unknown LSA was restricted within
stub and NSSA areas. The text describing this restriction is
included below.
在 RFC 2740 [OSPFV3]中,在Stub 和 NSSA 区域内部泛洪未知类型的LSA是被限制。此限制的原文如下:
However, unlike in IPv4, IPv6 allows LSAs with unrecognized LS types to be labeled "Store and flood the LSA, as if type understood" (see the U-bit in Appendix A.4.2.1). Uncontrolled introduction of such LSAs could cause a stub area's link-state database to grow larger than its component routers' capacities.
但是,不像IPv4中的那样,在IPv6中允许未知的LSA一起被称为“像可以理解这种类型那样存储并泛洪该LSA”(详见附录A.4.2.1 的U-bit)。不受控制的引入LSA会导致一个Stub 区域内的链路状态数据库超过自身容量限制。
To guard against this, the following rule regarding stub areas has been established: an LSA whose LS type is unrecognized can only be flooded into/throughout a stub area if both a) the LSA has area or link-local flooding scope and b) the LSA has U-bit set to 0. See Section 3.5(见RFC 2740 ,译者注) for details.
为了防范这个问题的出现,在Stub 区域上建立了如下规则:某个LSA的类型为未知,若同时满足如下条件,则能在Stub区域内泛洪、穿越:
(a)LSA有区域或链路本地的泛洪范围
(b)LSA的U-bit已经置零。
(详见3.5小节)。
这个限制已经被取消了。OSPFv3路由器将会在Stub或NSSA的链路和区域内泛洪未知类型且U-bit 置1 的LSA。运行OSPFv3的路由器不存在向后兼容的问题,除非路由器仍然支持这个限制才不会传送新定义的LSA类型。
3.5. 抑制 Link LSA
增加了Link LSA 抑制的接口下配置命令。若在接口下配置了Link LSA 抑制,并且接口类型不是广播、NBMA,那么Link LSA 的生成就会受到抑制。Link LSA 抑制的接口下配置命令可查阅附录Appendix C.3.和4.8.2小节,以及讲解最新的配置案例的4.4.3.8小节。
3.6. LSA选项和前缀选项的更新
LSA选项和前缀选项字段更新了协议中最新的添加了的部分。需特别说明的是,和MOSPF相关比特已经废除了;与OSPFv2共同的选项字段被保留;DN-bit 被添加进前缀选项中。详见附录A.2 和 附录 A.4.1.1。
3.7. IPv6 站点本地地址
所有提到IP站点本地(site-local)地址的部分都移除了。
4. 详解OSPFv3 ,Implementation Details
从IPv4到IPv6,基础的OSPF机制基本没有发生变化。这些机制在[OSPFv2]的第4章被简要列出。在IPv4和IPv6下,邻接的路由器都拥有链路状态数据库和同步机制。同步信息从数据库的交换进程通信开始,包括交换DBD、LSR和LSU。从这之后,数据库才会通过泛洪LSU 和LS ACK来同步信息。在IPv6 和 IPv4 下,都使用OSPF Hello 包来发现和保持邻居关系,也都在广播链路、NBMA链路上选举DR和BDR。至于从邻居关系变为邻接关系、 域间路由背后的基本理念、从AS-external-LSA中导入外部信息以及各种的理由计算的基本思路都保持了一致。
尤其是在[OSPFv2的]中描述的以下OSPFv2的功能,对OSPFv3的是仍然完全不变的:
- IPv4和IPv6使用的OSPF报文类型(见[OSPFv2] 4.3节),依次叫做Hello包、数据库描述(DBD)、链路状态请求、链路状态更新、链路状态确认报文。个别报文(例如,Hello报文)的格式已少许改进,但是各种数据包类型的功能仍然保持不变。
部署OSPF的系统要求仍然保持不变。当然运行于网络层的OSPFv3要求有IPv6的协议栈(自网络层以下到物理层)。
-
邻居关系的发现和保持,邻接关系的选择和建立机制仍然相同。这包括DR、BDR在广播、NBMA网络上的选举。这些机制在在[OSPFV2]的第7、 7.1、7.2、 7.3、 7.4和 7.5 小节有具体说明。
-
OSPFv3支持的链路的类型(等价于OSPFv2的接口类型)没有改变,这些类型是点对点、广播、NBMA、点到多点和虚链路。
-
接口状态机,包括一个OSPF接口的状态和事件的列表,此外,DR和BDR的选举算法保持不变。这些都在[OSPFV2]的9.1、9.2、9.3和 9.4 小节有相应的说明。
-
邻居状态机,包括一个OSPF邻居状态和事件的列表,仍然没有改变。邻居状态机在[OSPFV2]的10.1、10.2、10.3和10.4小节有相应的说明。
-
链路状态数据库的老化,和在路由域内提前刷新LSA(生存时间)的机制没有改变,详见 14 和[OSPFV2]的14.1小节。
-
然而,一些OSPF协议的机制正如先前在第2章中所述的那样已经改变。在以下小节中详细解释了这些变化,请读者参考文献[OSPFv2的]的相应章节。
-
以下小节提供了一个实现IPv4的OSPF变成IPv6的OSPF实施"菜谱"(Recipe)。
4.1. 协议数据结构 ,Protocol Data Structures
OSPF主要的数据结构对于IPv4和IPv6都是一样的:区域、接口、邻居、链路状态数据库和路由表。最上层的用于IPv6的数据结构和[OSPFV2]中的第5章列出的那些相同,但进行了下面这些修改:
- 所有具有已知LS类型和自治系统泛洪范围的LSA将会出现在最上层的数据结构中,而不是属于一个特定的区域或者链路。AS-external-LSA是本文档中唯一定义的拥有整个自治系统泛洪范围的LSA。未知类型的、U-bit 置1的(即使类型不被识别,也会被泛洪)LSA 和泛洪范围是自治系统的LSA都将会出现在最上层的数据结构中。
4.1.1. 区域的数据结构 ,The Area Data Structure
IPv6区域的数据结构含有IPv4区域的所有定义的要素(见[OSPFv2 的第6章])。除此之外,对于所有的已知类型并具有泛洪范围的LSA,被包含在IPv6区域数据结构中。如:Router-LSA(路由器-LSA), Network-LSA(网络-LSA), Inter-area-prefix-LSA(域间前缀-LSA), Inter-area-router-LSA(域间路由器-LSA),以及Intra-area-prefix-LSA(域内前缀LSA)。未知类型的、U-bit设置为1的(即使不被识别也会被泛洪)和区域泛洪范围的LSA也会在区域数据结构中出现。同样,NSSA-LSA包含在NSSA区域的数据结构中。
4.1.2. 接口数据结构 ,The Interface Data Structure
在OSPFv3中,接口通过一条链路连接着一台路由器。IPv6下的接口数据结构与IPv4的(在[OSPFV2]的第九章所定义)下的口数据结构相比,做出了如下改进:
接口ID:
每一个接口都分配了接口ID,它唯一标识着路由器上的接口。例如:可以[MAY]使用MIB-II IfIndex (见[INTFMIB])的值作为接口ID。接口ID将会出现在Hello包中标明的接口、所在链路上起源的Link-local-LSA(链路本地LSA)和相关区域上起源的Router-LSA(路由器LSA )。路由器被选举为网段上的DR时,接口ID将会成为Network-LSA中的链路状态ID字段的内容。虚链路的接口ID和途径的区域的出站接口ID无关。
实例 ID
每一个接口都被分配了一个实例ID,且默认为0。若要使链路包含多个分开的OSPF路由器团体,唯一要做的就是不要给实例ID分配0。有些场合需要分配0,比如,假使在一个给定的以太网网段上有2个OSPF路由器团体,而需求是让它俩在分开的路由域里。
第一个OSPF路由器团体(community )被分配了一为0的实例ID,那么第一个路由器团体中的所有路由器在连接到以太网时,对应的接口都会被分配0作为实例ID。为1实例ID,分配给连接到以太网的路由器其它对应接口。OSPF的传输、接收分别进行(见 4.2小节),这2个团体是完全分离的。
泛洪范围是链路本地的所有LSA
所有具有链路本地泛洪范围、在链路上起源或泛洪的LSA属于连接到链路上的接口数据结构。其中包括链路的链路LSA(Link-LSA)集合。
IP接口地址
OSPFv3中,IPv6地址(几乎全是链路本地地址)出现在从接口发送的OSPF数据包的源地址字段中。唯一的例外是:虚链路上必须[MUST]使用路由器自身一个物理接口上的全局IPv6地址作为IP(Internet Protocol)接口地址。
链路前缀列表
IPv6前缀列表能够被配置在附属的链路上。它们将会被路由器通过Link-LSA来通告出去,进而使之被链路上的DR通过Intra-area-prefix-LSA(域内前缀LSA)通告出去。
OSPFv3中,每一个路由器接口用单一的度量值代表接口上发送数据包的开销。除此之外,OSPFv3依赖着IP认证报头(详见[IPAUTH])、IP 封装安全有效载荷 (详见 [IPESP]) 来保证传输过程中的完整性、机密性。由于这个原因,认证类型和认证密钥不再和OSPFv3的接口相关联了。
接口状态、事件和接口状态机和OSPFv2的(详见 [OSPFV2]中的9.1、9.2和9.3 小节)相比没有改变。DR和BDR选举算法同样也没有改变(见[OSPFv2的9.4小节])。
4.1.3. 邻居数据结构 ,The Neighbor Data Structure
邻居数据结构在IPv6和IPv4中起到相同的功能。也就是说,它会收集2台毗邻的路由器形成邻接关系的所有必要信息。每一个邻居结构体一定要是单个OSPF接口。IPv6邻居结构和IPv4邻居结构([OSPFv2的第十章])的区别如下:
邻居的接口ID
邻居在通告的Hello包中含有接口ID,邻居数据结构必须对接口ID进行记录。路由器在下面2种情况时会在Router-LSA中包含邻居的接口ID:
(I)向邻居通告一个点对点或者点到多点链路时。
(II)邻居是网段中的DR,向它通告一条链路时。
邻居IP地址
邻居的IPv6地址作为OSPFv3数据包的源地址。除虚链路之外,邻居的地址
都将是链路本地地址。
邻居的DR
DR的选举只使用Router-ID,不使用IP地址。
邻居的BDR
邻居的BDR选举只使用Router-ID,不再使用IP地址了。
邻居的状态、事件和邻居状态机和IPv4的([OSPFV2]的第10.1,10.2,和10.3小节分别对其说明)相比,没有发生改变。邻接关系的形成机制和IPv4下的机制(见[OSPFv2]10.4小节)相同。
4.2. 协议报文处理 ,Protocol Packet Processing
OSPFv3直接运行在IPv6的网络层。就这一点而言,它直接被封装于IPv6报头之后的下一报头字段,且协议号设置为89.
对比于用于IPv4的OSPF,用于IPv6的OSPF仅沿着邻接关系发送OSPF路由协议数据包(用于发现邻接关系的Hello数据包除外)。 OSPF数据包的类型和功能在IPv4和IPv6中相同,由标准OSPF数据包头的“类型”字段编码。
4.2.1. 发送协议报文 ,Sending Protocol Packets
当一台IPv6路由器发送一个OSPF路由协议报文时, OSPFv3报文头部包含如下字段:
版本号
设置为3,此版本号在本规范中有详细说明。
类型
OSPF的报文类型,比如 LSU 或者Hello包。
数据包长度
整个OSPF报文的字节大小,包括标准OSPF报文首部。
路由器 ID
(始发数据包的)路由器自身的标识。
区域 ID
OSPF数据包发送出去的接口所对应的区域。
实例 ID
OSPF 实例ID和报文被发送出去的接口相关联。
校验和
标准的IPv6上层的校验和(详见[IPv6]的8.1小节)是对整个OSPF包以及伪首部进行经验后的结果。
OSPF报文的源和目的地址在IPv6和IPv4上有逻辑相同的功能(见[OSPFv2]的8.1小节)。IPv6目的地址从AllSPFRouters(224.0.0.5)、AllDRouters(224.0.0.6)和对端邻接体相关的IP地址(除虚链路之外,都是链路本地地址)。
LSR和LSA的发送和IPv4中的规定仍然相同,分别见[OSPFv2]中的10.9小节、13.5小节。Hello包的发送见4.2.1.1小节,DBD的发送见4.2.1.2小节。LSU的发送见4.5.2小节。
4.2.1.1. Hello包的发送 ,Sending Hello Packets
IPv6改变了OSPFv2 Hello包发送的方式(和[OSPFv2的9.5小节进行比较]),改进如下:
-
在接口发送Hello包之前,接口的ID(Interface ID )必须[MUST]被拷贝进Hello包。
-
Hello包里面不再有IP网络掩码了,因为OSPFv3的运行是基于每链路而不是每子网。
-
DR和BDR的选举的依据的改变:Hello包中用路由器ID(Router ID)取代了接口的IP地址。以0.0.0.0通告DR(或者BDR)表明它们还没有被选举出来。
-
Hello包中的可选字段变大了。如今有了更多的可选比特可用。那些可选比特位一定要[MUST]按照如下要求正确设置:
(1)当且仅当接口连接着常规区域,即不是Stub也不是NSSA区域,E-bit就被设置为1。
(2)同样地,当且仅当接口连着NSSA区域(见[NSSA])时,N-bit才会被设置为1。
(3) 同样地,当且仅当路由器希望抑制接口发送Hello包时(见[DEMAND]按需电路),DC-bit才会被设置 。Hello包中未被识别的比特应当被清零。在IPv6环境下于NBMA网络上发送Hello包和IPv4网络完全一致 (见[OSPFv2]的9.5.1小节)。
4.2.1.2. 发送DBD报文 ,Sending Database Description Packets
和[OSPFv2]第10.8小节的DBD的发送的不同之处:
- DBD中的可选字段在处理过程中变大了。更多的可选比特位可用。这些必须[MUST]按如下规定正确设置: 当且仅当路由器希望抑制接口发送Hello包时(见[DEMAND]),DC-bit才会被设置 。DBD中未被识别的比特位应当被清零。 (译者注:DBD中的可选项字段的用法和Hello的基本相同)
4.2.2. 接收协议报文 ,Receiving Protocol Packets
路由器收到的OSPF数据包,都会用接收接口标识。对于配置虚链路的路由器,它可能不会立即明显与数据包相关联。下面以[OSPFv2]中图6中描述的路由器RT11为例说明:如果RT11从连接着N8网络的接口接收到的OSPF协议报文,它可能要将连接着区域2的接口和数据包相关联,或与路由器RT10(部分属于主干区域)的虚链路相关联。虚链路到路由器RT10(这是部分骨干)。下文中,我们假设这个数据包最初关联着的不是虚链路。
为了使数据包传送至OSPF处理,封装IPv6报头时必须进行下列检查:
-
数据包的IP目的地址必须[MUST]为下列之一:
1)接收接口(包括链路本地地址)相关联的单播地址;
2)IPv6组播地址AllSPFRouters(224.0.0.5)、AllDRouters(224.0.0.6)之一;
3)IPv6全局地址(用于虚链路)。o The Next Header field of the immediately encapsulating IPv6 header
MUST specify the OSPF protocol (89). -
直接封装的IPv6首部必须[MUST]在下一首部字段使用89来标明OSPF协议。
-
所有封装着IP认证报头(见[IPAUTH])和IP封装安全有效载荷(见[IPESP])必须[MUST]要进行 逻辑与/逻辑或 校验来保证OSPF路由交换的完整性、认证及机密性。这些在[OSPFV3-AUTH]有相应的说明。
在完成IPv6首部的封装后,首部中的规定字段必须满足接收接口的配置,否则将[SHOULD]丢弃数据。这些配置如下:
-
版本号字段必须[MUST]指定协议版本号为3。
-
IPv6的上层校验和(见[IPv6]的8.1小节),是针对整个OSPF报文和伪头部的,它必须要校验通过(才会转发数据包,否则丢弃。译者注)。
-
OSPF首部的区域ID和实例ID字段必须被校验。如果下面2种要求都不满足,那么数据包必须被丢弃。首部的区域ID和实例ID须满足下列2种要求之一:
-
(I) 匹配接收链路的区域ID、接口ID之一 。不同于IPv4,IPv6中不会限制源地址和接收链路的地址必须处于同一子网中。OSPFv3的运行基于每链路而不是每个IP子网。
-
(II) 匹配主干区域或虚链路上的条件。虚链路上,接收路由器一定要是一台区域边界路由器(ABR),并且路由器ID必须在源路由器的数据包里指定,(源路由器)必须是虚链路的另一端。除此之外,接收链路必须有一个连着虚链路途径区域的OSPFv3接口,并且实例ID要和虚链路的实例ID相匹配。如果这些检查都通过了,数据包将会被接收并和虚链路(以及骨干区域)相关联。
-
-
本地起源的数据包不应该[SHOULD NOT]被OSPF处理,除非是为了支持连接到同一链路的多接口(见 4.9小节)。本地起源的数据包拥有路由器的一个本地地址作为源地址。
-
IPv6目的地址为AllDRouters(224.0.0.6)的数据包在仅当接收的OSPFv3接口状态为DR或BDR时才被接收(见[OSPFv2]的9.1小节)。
在报头处理完成后,将按照它的OSPF报文类型进一步处理。OSPF报文类型和功能在IPv4和IPv6下相同。
如果类型是Hello包,将会按照4.2.2.1小节中所描述的那样进一步处理。所有其他类型报文只在邻接体之间进行收/发处理。这意味着数据包必须被一个激活的邻居发送。邻居由接收到的数据包首部中的路由器ID字段进行识别。与任何激活的邻居不匹配的数据包将会被丢弃。
对DBD、LSR和LSA的接收处理是与IPv4的处理方式(见[OSPFv2的10.6 10.7 和13.7小节])几乎相同。下面分别列出了例外情况:
-
DBD中具有未知链路状态类型的LSA具有可接收的泛洪范围,和已知类型的LSA处理过程相同。但在OSPFv2中(见[OSPFv2]),将会导致邻接关系中断的“序列号不匹配”事件。
Hello包的接收在4.2.2.1小节里进行了说明,LSU的接收在4.5.1小节中进行了说明。
4.2.2.1. 接收Hello包 ,Receiving Hello Packets
对收到的Hello包的处理和[OSPFv2]的10.5小节具有如下的不同之处:
-
在所有链路类型(例如:广播、NBMA、点对点等)上,单单凭借它们的OSPF路由器ID进行邻居的识别。对于除了虚链路之外的其它链路类型,邻居的IP地址都设置为收到的Hello包的IPv6首部源地址。
-
Hello包中取消了网络掩码字段。
-
邻居间进行DR和BDR的竞选时使用路由器ID而不是IP接口地址。
4.3. 路由表结构,The Routing table Structure
OSPFv2使用的路由表在[OSPFv2]的第十章所定义。OSPFv3有相似的路由表条目:有IPv6地址前缀的路由表条目,也有AS边界路由器的条目。后者的路由表项只用来保存路由表生成过程中的中间结果(见4.8小节)。
此外,为了保存每个区域的最短路径计算的中间结果,存在为每个区域分别保存下列条目的路由表。这些条目如下:
-
区域内的每一台路由器拥有一个条目。路由器通过路由器ID来互相识别。这些路由表项持续将 到某一特定区域的最短路径设置为一个到给定的路由器,依次对那台路由器通告的域内前缀LSA(Intra-area-prefix-LSA)中的IPv6前缀进行路径计算。如果路由器同时是一台边界路由器,这些条目也会用被于计算域间地址前缀的路径。如果路由器同时还是某一虚链路的端点,路由表条目还描述虚链路的开销和可行性。
-
域内每一个传输链路都有一个条目。传输链路和网络LSA(Network-LSA)相关联。传输链路、网络LSA都是由DR对应的接口ID和DR的OSPF路由器ID共同确定的。这些路由表项允许对在域内前缀LSA(Intra-area-prefix-LSA)通告的链路进行后续的路径计算。
OSPFv2路由表中的字段(见[OSPFv2的11章])对于OSPFv3仍然有效:可选的能力(仅对路由器而言)、路径类型、开销、类型二的开销、链路状态起源和到目的地/下一跳/通告者的等价开销路径。
对于IPv6,路由表条目的链路状态起源字段表明是外部LSA还是网络LSA直接或间接产生了此条目。例如,如果某路由表条目描述了一IPv6前缀,链路状态的起源将在区域内前缀LSA(见附录A.4.10)的主体列出是路由器LSA或网络LSA产生了此条目。
4.3.1 路由表选路 , Routing Table Lookup
路由表选路机制(即决定最优转发条目),IPv6是和IPv4是相同的。
4.4. 链路状态通告, Link State Advertisements
对于IPv6,OSPF LSA首部有些许的改变:链路状态类型字段扩大 和可选字段移入了合适的LSA中。某些LSA的格式也稍微改变了(Router-LSA、Network-LSA、AS-external-LSA和NSSA-LSA),同时某些LSA的名称发生变化(Network-Summary 叫作Inter-area-prefix-LSA;ASBR-Summary叫作Inter-area-router-LSA)。另外还增添新的LSA(Link-LSA 和Intra-area-prefix-LSA)。服务类型(ToS)字段被移除了,OSPFv3的LSA不会对其进行编码。
这些改变将在之后的几个小节详细说明。
4.4.1. LSA首部 ,The LSA Header
在IPv4和IPv6中,所有的OSPF LSA都以一个标准的20字节LSA首部开始。但是,IPv6首部的20字节中的内容改变了。链路状态老化时间、通告者路由器、链路状态序列号、链路状态校验以及LSA首部里的长度字段没有改变,在[OSPFV2]的12.1.1, 12.1.5, 12.1.6, 12.1.7和附录A.4.1中分别对它们进行了说明。下面讲的是改变的字段(意味着*读者还要参考RFC 2740 ,以了解那些没有改变的字段 *。译者注):
-
可选项
可选项字段标准的20字节LSA首部移至Router-LSA、Network-LSA 、Inter-area-router-LSA和 Link-LSA 中。选项字段的长度从8比特增加至24比特,并且有一些比特的定义发生了改变(见附录A.2)。除此之外,一个单独的前缀选项字段,有8比特长,被附加进通告的每个LSA前缀里。 -
链路状态类型
链路状态类型字段从8比特增至16比特,通过高位比特处理未知类型,接下来2
个比特位表示泛洪范围。附录A.4.2.1中有最新的LS类型字段对应代码。 -
链路状态ID
链路状态ID的长度仍然为32比特。然而,除了在网络LSA和链路LSA中,链路状态ID也已不再具有任何寻址语义。比如,一台始发多个AS-external-LSA的IPv6路由器开始分配的第一个链路状态ID是0.0.0.1,第二个链路状态ID是0.0.0.2,并依此类推。如今,IPv6环境下的链路状态ID只是提供了一种区别同一台路由器上产生的多个LSA的凭据,这取代了IPv4环境下将网络编号的编码成AS-external-LSA里的链路状态ID 的方法。
对于网络LSA,链路状态ID被设置成DR路由器链路的接口ID。当一台路由器为给定链路始发一个链路LSA时,它的链路状态ID被设置为和链路上路由器接口ID相同的值。
4.4.2. 链路状态数据库 ,The Link-State Database
IPv6环境和IPv4下一样,某一种LSA是由链路状态类型、链路状态ID和通告者路由器字段共同判别的。若一个LSA中含有2个实例,最近的实例则通过查看LSA的链路状态序列号确定。若序列号相同,则再看链路状态校验和、链路状态老化时间(详见[OSPFv2的13.1小节])。
在IPv6中,链路状态数据库被分割成三个独立的数据结构。只要链路状态类型是已知或者U-bit为1(即使无法识别也泛洪),那么含有泛洪范围的LSA都包含在最高层的OSPF数据结构中(见4.1节),比如自治系统外部LSA。含有区域泛洪范围的LSA被包含在适当的区域结构(见4.1.1节),只要他们被具有已知链路状态类型或者U-bit为1(即使无法识别也泛洪);这包括路由器LSA、网络LSA、域间前缀LSA、域间路由器LSA、NSSA区域LSA和域内前缀LSA。为未知链路状态类型、U-bit为0、和/或泛洪范围是链路本地的LSA处于合适的结口结构里面(见4.1.2小节),这包括链路LSA(Link-LSA)。
查找或安装一个数据库中的LSA,得首先检查LS类型和LSA的上下文(即该LSA属于的区域或链路)。基于LSA类型、链路状态ID和通告路由器的搜索,才会让你找到正确的LSA数据库。
4.4.3. 始发LSA始发 ,Originating LSAs
在IPv6里始发新的LSA和IPv4中的过程相同:LS序列号递增1,LS老化时间清零,LS校验和被重新计算,LSA被加入链路状态数据库并且从恰当的接口泛洪出去。
[OSPFv2]的12.4小节讲解了IPv4下LSA重新始发的事件列表。下面的是其他增加的事件、行为:
-
状态或接口ID随着路由器的接口变化而变化。路由器也许需要(重新)产生或刷新它的链路LSA或更多的路由器LSA及域内前缀LSA。如果路由器是DR的话,路由器也许需要(重新)产生和/或刷新网络LSA来与接口相一致。
-
一个链路的指定路由器的身份变化。路由器可能需要(重新)产生或刷新链路的网络LSA和一个或多个路由器的LSA和/或区域内前缀LSA。
-
邻居和“Full”状态有关的变化。路由器可能会(重新)产生或刷新链路的网络
LSA及一个或更多的路由器LSA与/或域内前缀LSA。 -
邻居的接口ID改变。将产生一个路由器LSA新实例用来和区域相关联。
-
一个新的前缀附加到所属链路上,或被删除了(都通过配置)。这引起路由器(重新)始发链路LSA。如果链路上只有一台路由器,将使路由器重新始发一个域内前缀LSA。
-
接收到一个新的链路LSA,导致链路的前缀集合发生改变。如果路由器是DR的话, 将始发一个新的域内前缀LSA。
-
收到一个新的链路LSA,将使所有邻接路由器通告的LSA可选项字段进行逻辑或运算。如果路由器还是链路上的DR的话,他将始发一个新的网络LSA。
以下小节提供了7种必需的IPv6 LSA类型的详细解释。为了展示LSA,[OSPFv2]的图15为了适应IPv6地址而修改为下面的图1。图1里还显示了每个接口的开销。表1显示了已分配给网络链路的IPv6前缀。区域1上配置了单个网段,即其它区域出现的2001:0db8:c001::/48表示区域1。表2给出了图1中路由器的OSPF接口ID和链路本地地址。
..........................................
. Area 1.
. + .
. | .
. | 3+---+1 .
. N1 |--|RT1|-----+ .
. | +---+ \ .
. | \ ______ .
. + \/ \ 1+---+
. * N3 *------|RT4|------
. + /\_______/ +---+
. | / | .
. | 3+---+1 / | .
. N2 |--|RT2|-----+ 1| .
. | +---+ +---+ .
. | |RT3|----------------
. + +---+ .
. |2 .
. | .
. +------------+ .
. N4 .
..........................................
Figure 1: Area 1 with IP Addresses Shown
Network IPv6 prefix
-----------------------------------
N1 2001:0db8:c001:0200::/56
N2 2001:0db8:c001:0300::/56
N3 2001:0db8:c001:0100::/56
N4 2001:0db8:c001:0400::/56
Table 1: IPv6 Link Prefixes for Sample Network
Router Interface Interface ID link-local address
-------------------------------------------------------
RT1 to N1 1 fe80:0001::RT1
to N3 2 fe80:0002::RT1
RT2 to N2 1 fe80:0001::RT2
to N3 2 fe80:0002::RT2
RT3 to N3 1 fe80:0001::RT3
to N4 2 fe80:0002::RT3
RT4 to N3 1 fe80:0001::RT4
Table 2: OSPF Interface IDs and Link-Local Addresses
Figure 1
4.4.3.1. LSA选项 ,LSA Options
LSA中的选项字段应按如下方式编码。除非路由器不进行IPv6路由,通常应当设置V6-bit为1。 当且仅当连接的区域是一个OSPF Stub或NSSA区域,E-bit才应该设置为0。 在AS范围泛洪的LSA里,E-bit应始终设为1。当且仅当连接的区域是一个OSPF NSSA区域,N位才应该设置为1。除非路由器将不参与路由过程,R位应被设置为1。 当且仅当路由器能正确处理出现在LSA的LS老化字段的DoNotAge位时,DC位应设置为1(见[DEMAND])。所有选项字段中无法识别的位应该被清0。
SPF计算过程中,V6位和R位只在路由LSA中被检查。在其它LSA类型包含的选项中,它们只起指示作用。
4.4.3.2. 路由器 LSA, Router-LSAs
路由器LSA的LS类型字段的值是0x2001。路由器LSA的泛洪范围是本区域。一台路由器可以[MAY]为一个给定区域始发一个或多个路由器LSA。每个路由器LSA包含着整数个数的接口描述。必须把来自该路由器的所有Router-LSA都综合起来,当作一个LSA来处理。通过它们的链路状态ID字段来区分多个路由器LSA。
选项字段从左边开始的路由器特性位V、E和B须按照[OSPFv2]的12.4.1小节来设置。
每个路由器连接到区域的接口通过路由器LSA中附加的“链路描述”来描述。每个链路描述有16字节长,由5个字段组成:(链路) 类型、度量值、接口ID、邻居接口ID和邻居路由器ID(见附录A.4.3)。处于在 “Down”或“环回口”状态的接口不会被描述(即使环回接口可以将的前缀添加进域内前缀LSA);没有任何邻接关系的接口也不会被描述(在4.9节中所述的作为多个备用接口的情况除外)。所有其它连接到区域的接口增加零个、一个或更多链路描述。数目或内容基于接口类型。在每个链路描述之内,度量值字段总是设置为接口出站开销,接口ID字段设置为接口的OSPF接口ID。
点对点接口
如果相邻的路由器是完全邻接的,添加类型为的1链路描述(点对点 PTP)。邻居接口ID字段设置为邻居在Hello包中通告的接口ID,邻居路由器ID字段设置为邻居的路由器ID。
广播和NBMA接口
如果路由器是完全和DR邻接的,或者路由器本身就是DR并且(DR,译者注)跟至少一个其他路由器完全邻接,添加一个类型2的链路描述(传输网络)。邻居接口ID字段设置为DR在Hello包中通告的接口ID,邻居路由器ID字段设置为DR的路由器ID。
虚链路接口
如果相邻路由器是完全邻接的,添加类型为4的描述(虚链路)。邻居接口ID字段设置为邻居在Hello包中通告的(虚链路,译者注)接口ID,邻居路由器ID字段设置为邻居的路由器ID。需要注意的是虚链路的出站开销是在路由表计算过程中所计算的。
点到多点接口
为每一个完全邻接的路由器关联的接口,增加一个单独的类型1的链路描述(点对点)。邻居接口ID字段设置为邻居在Hello包中通告的接口ID,邻居路由器ID字段设置为邻居的路由器ID。
下面用图1进行举例说明。路由器RT3将为区域1始发路由器LSA。只有连到传输网络N3的那个接口必须被描述。假设RT4已经是N3网络里的DR了。
RT3’s router-LSA for Area 1 :
LS age = 0 ;newly (re)originated
LS type = 0x2001 ;router-LSA
Link State ID = 0 ;first fragment
Advertising Router = 192.0.2.3 ;RT3's Router ID
bit E = 0 ;not an AS boundary router
bit B = 1 ;area border router
Options = (V6-bit|E-bit|R-bit)
Type = 2 ;connects to N3
Metric = 1 ;cost to N3
Interface ID = 1 ;RT3's Interface ID on N3
Neighbor Interface ID = 1 ;RT4's Interface ID on N3
Neighbor Router ID = 192.0.2.4 ; RT4's Router ID
RT3's router-LSA for Area 1
例如,如果另一台路由器加入网络N4,RT3会通告其连接到(现在的传输)网络N4的第二个链路的描述。这个时候可以通过重新始发含有两个链路描述的上述路由器LSA。或者,重新发送具有单独的链路状态ID(比如 1)来描述到网络4的连接的路由器LSA。
Stub(末节)网络的主机路由在路由器LSA中不再出现。相反,它们是包含在域内前缀LSA中的。
4.4.3.3. 网络LSA, Network-LSAs
网络LSA的LS类型值设置成0x2002。网络LSA泛洪范围是整个区域。网络LSA始发于广播或NBMA链路上选举产生的、至少完全邻接于链路上的一个其它其他路由器的DR。
在IPv6中始发网络LSA和IPv4中的规定([OSPFv2]的12.4.2节)是一样的,除了下面的三点:
-
IPv6下的网络LSA的链路ID设为链路上DR的接口ID。
-
IPv6下的网络LSA不再包含网络掩码。所有先前IPv4网络LSA里的地址信息如今由链路上的DR始发的域内网络前缀LSA(Intra-Area-Prefix-LSA)承载了。
-
网络LSA的Options字段设置成与这个链路所有相关联的link-LSA的Option字段的逻辑或后的结果。这样,在这个网络链路上,只要有一个路由器希望宣告某种能力,这种能力就会被宣告出来。(也就是说,路由器能力的宣告不会受到DR能力的限制,这大大增强了OSPF的扩展性和适应性。译者注)
下面用图1举个例子。假设路由器RT4被选举为网络N3上的DR,如下的网络LSA会产生:
; Network-LSA for Network N3
LS age = 0 ;newly (re)originated
LS type = 0x2002 ;network-LSA
Link State ID = 1 ;RT4's Interface ID on N3
Advertising Router = 192.0.2.4 ;RT4's Router ID
Options = (V6-bit|E-bit|R-bit)
Attached Router = 192.0.2.4 ;Router ID
Attached Router = 192.0.2.1 ;Router ID
Attached Router = 192.0.2.2 ;Router ID
Attached Router = 192.0.2.3 ;Router ID
Network-LSA for Network N3
4.4.3.4. 域间前缀LSA, Inter-Area-Prefix-LSAs
-
域间前缀LSA的LS类型值为0x2003,它具有区域泛洪范围。在IPv4中,域间前缀LSA称为类型 3 的汇总LSA(Type 3 Summary-LSA)。每个域间前缀LSA描述来自区域外的,但是属于自治系统内部的一个前缀。
-
IPv6下始发域间前缀LSA的步骤和IPv4下的步骤相同,请读者查阅[OSPFv2]的12.4.3和12.4.3.1小节。但除了以下几点:
-
域间前缀LSA的LS ID不再有编址性语义,而是仅仅用来区分同一个路由器始发的多个域间前缀LSA。
-
前缀由前缀长度、前缀选项和LSA主体中的地址前缀字段描述。网络掩码不再出现了。
-
前缀选项字段里的NU位应该被清零。
-
链路本地地址绝对[MUST]不能在域间前缀LSA里通告。
下面举例说明。路由器RT4向OSPF骨干区域始发域间前缀LSA,将区域1所有前缀压缩为单一前缀2001:0db8:c001::/48。开销设置为4,是所有单条链路中的最大值。前缀填充到偶数个32-bit 大小,所以它占用64位的空间,而不是48位。
; Inter-area-prefix-LSA for Area 1 addresses
; originated by Router RT4 into the backbone
LS age = 0 ;newly (re)originated
LS type = 0x2003 ;inter-area-prefix-LSA
Advertising Router = 192.0.2.4 ;RT4's ID
Metric = 4 ;maximum to components
PrefixLength = 48
PrefixOptions = 0
Address Prefix = 2001:0db8:c001 ;padded to 64-bits
Inter-area-prefix-LSA for Area 1 addresses originated
by Router RT4 into the backbone
4.4.3.5. 域间路由器LSA, Inter-Area-Router-LSAs
域间路由器LSA的LS类型值为0x2004 。泛洪范围是整个区域。在IPv4中,域间路由器LSA称为类型为4的汇总LSA(Type 4 Summary-LSA)。每个域间前缀LSA描述一个到目标OSPF路由器(即ASBR)的路径。该ASBR在区域外,但是属于自治系统内部。
IPv6下始发域间路由器LSA的步骤和IPv4下的步骤相同,可以查阅[OSPFv2]的12.4.3。但是除下面几点除外:
-
域间路由器LSA的LS ID不再是目的路由器的OSPF Router ID,而仅仅用来区分同
一个路由器产生的多个域间路由器LSA。目的路由器的Router ID如今由LSA承载。 -
域间区域路由器LSA的选项字段值应该设为目的路由器的router-LSA的Options字段值。(这里Options字段描述的不是源路由器的能力,)而是目的路由器所支持的能力。
下面用[OSPFv2]中描述的图6来举例。路由器RT4为目的路由器RT7(ASBR)在区域1内始发域间路由器LSA。
; inter-area-router-LSA for AS boundary router RT7 ; originated by Router RT4 into Area 1 LS age = 0 ;newly (re)originated LS type = 0x2004 ;inter-area-router-LSA Advertising Router = 192.0.2.4 ;RT4's ID Options = (V6-bit|E-bit|R-bit) ;RT7's capabilities Metric = 14 ;cost to RT7 Destination Router ID = Router RT7's ID
Inter-area-router-LSA for AS boundary router RT7 originated by Router
RT4 into Area 1
4.4.3.6. 自治系统外部LSA, AS-External-LSAs
自治系统外部LSA的LS类型值为0x4005。泛洪范围是整个自治系统。每个自治系统外部LSA描述一个到自治系统外部前缀的路径。
IPv6下始发自治系统外部LSA的步骤和IPv4下的步骤相同,可以查阅[OSPFv2]的12.4.4小节。但是下面几点除外:
-
自治系统外部LSA的Link State ID不再具有寻址语义,而仅仅用来区分同一个路由器产生的多个自治系统外部LSA。
-
前缀由前缀长度、前缀选项和LSA中的地址前缀字段描述。网络掩码不再出现了。
-
前缀可选项字段中的NU-bit必须为0 。
-
自治系统外部LSA绝无可能通告链路本地地址。
-
当且仅当自治系统外部LSA的F位置1时,才会有转发地址出现。
-
外部路由标记当且仅当自治系统外部LSA的T比特置1时,才会有外部路由标记出现。
-
自治系统外部LSA的引用另一个LSA的能力已经得到支持:通过列入引用的LS类型字段、可选的引用链路状态ID字段(后者当且仅当参考LS类型值为非零时才有)。这种能力是为将来使用的。引用的LS类型应设置为0,若收到了这一字段的值是非零,则应该被忽略,直到它的使用方法被定义。
-
下面用[OSPFv2]中的图6描述的OSPF自治系统举例说明。假设路由器RT7通过BGP学得去网络N12的路由条目,并希望在自治系统内部通告类型为2路由条目 。同时还假设网络N12的的IPv6前缀是2001:0db8:0a00::/40 。RT7为外部网络N12始发自治系统外部LSA。注意,在自治系统外部LSA中,N12的前缀为了保持32位长度的对齐而占据64位的空间。
; AS-external-LSA for Network N12, ; originated by Router RT7 LS age = 0 ;newly (re)originated LS type = 0x4005 ;AS-external-LSA Link State ID = 123 ;LSA type/scope unique identifier Advertising Router = Router RT7's ID bit E = 1 ;Type 2 metric bit F = 0 ;no forwarding address bit T = 1 ;external route tag included Metric = 2 PrefixLength = 40 PrefixOptions = 0 Referenced LS Type = 0 ;no Referenced Link State ID Address Prefix = 2001:0db8:0a00 ;padded to 64-bits External Route Tag = as per BGP/OSPF interaction AS-external-LSA for Network N12, originated by Router RT7
4.4.3.7. 非完全末节区域LSA, NSSA-LSAs
非完全末节区域LSA的LS类型值为0x2004 。泛洪范围是整个NSSA区域。每个NSSA-LSA描述一个到自治系统外部前缀的路径,但泛洪范围被限制在单个NSSA区域内部。
IPv6下始发NSSA-LSA的步骤和IPv4下的步骤相同,可以查阅[OSPFv2]的12.4.4小节。但是下面几点除外:
-
NSSA-LSA的LS ID不再具有寻址语义,而仅仅用来区分同一个路由器在同一区域产生的多个NSSA-LSA。
-
前缀由前缀长度、前缀选项和LSA中的地址前缀字段描述。网络掩码不再出现。
-
前缀选项字段里的NU比特应当被清零。
-
链路本地地址绝对不能在NSSA-LSA中出现。
-
当且仅当NSSA-LSA的F位置1时,才会有转发地址出现。
-
外部路由标记当且仅当NSSA-LSA的T比特置1时,才会有外部路由标记出现。
-
NSSA-LSA的引用另一个LSA的能力已经得到支持:通过列入引用的LS类型字段、可选引用的链路状态ID字段(后者当且仅当参考LS类型为非零时才有)。这种能力是为将来使用的。引用的LS类型应设置为0。若收到了这一字段的值是非零,则应该被忽略,直到它的使用方法被定义。
-
NSSA-LSA和 AS-external-LSA仅有的不同之处是LS类型值是0x2007而不是0x4005 。
4.4.3.8. 链路LSA ,Link-LSAs
链路LSA的LS类型设置的值为0x2002。链路LSA泛洪范围是所属链路。链路LSA为支持2个或更多(包括始发路由器自己)路由器的每一个所属链路始发一个单独的链路LSA。链路LSA绝对不能[SHOULD NOT]在虚链路上出现。
链路LSA具有3个用途:
- 为所有连接在链路上的其他路由器提供本路由器的链路本地地址。
- 收集本路由器在该链路上配置的所有的IPv6前缀,并通知该链路上其他路由器;
- 使路由器能够通告广播、NBMA链路中DR始发的网络LSA选项比特信息。
在给定链路L上按照如下方式构建链路LSA:
-
链路状态ID设置为链路L上路由器的接口ID
-
链路L路由器接口的路由器优先级被加入到链路LSA对应字段。
-
链路LSA的选项字段的设置是用来表明路由器能力的。在多路访问链路上,DR将对所有邻接路由器的链路-LSA的选项字段进行逻辑或运算,并把结果传递至网络LSA。
-
路由器将链路L的链路本地地址加入链路LSA。这些信息将用于链路上其它路由器的下一跳计算(见4.8.2小节)。
-
每一个链路L上的IPv6前缀加入到了链路LSA里,通过前缀长度、前缀选项和地址前缀字段值进行识别。
在给定链路上完成链路LSA的构造后,路由器在相关接口数据结构中安装链路LSA,并在链路上泛洪链路LSA。所有在链路中的其它路由器将接收链路LSA,但是不会向其它链路泛洪链路LSA。
如果链路LSA抑制被配置在接口下,同时接口类型是不是广播或NBMA的话,链路LSA的产生是受到抑制的。这意味着链路中的其它路由器将使用一种机制来确定路由器的下一跳地址,而不是链路LSA(见4.8.2小节) 。附录C.3中对链路LSA抑制的接口配置参数有详细说明。
下面用图1里的RT3为网络N3产生链路LSA举例说明。假设N3里的RT3配置了前缀2001:0db8:c001:0100::/56。将会导致对于接下来的链路LSA,RT3将只在N3里泛洪。注意不是所有的N3上的路由器需要配置此前缀。不配置的路由器将学习收到的RT3链路LSA承载的前缀。
; RT3's link-LSA for N3 LS age = 0 ;newly (re)originated LS type = 0x0008 ;link-LSA Link State ID = 1 ;RT3's Interface ID on N3 Advertising Router = 192.0.2.3 ;RT3's Router ID Rtr Priority = 1 ;RT3's N3 Router Priority Options = (V6-bit|E-bit|R-bit) Link-local Interface Address = fe80:0001::RT3 # prefixes = 1 PrefixLength = 56 PrefixOptions = 0 Address Prefix = 2001:0db8:c001:0100 ;pad to 64-bits RT3's link-LSA for N3
4.4.3.9. 域内前缀LSA ,Intra-Area-Prefix-LSAs
域内前缀LSA的LS类型值为0x2009。域内前缀LSA泛洪范围是一个区域。一个域内前缀LSA具有下面二者之一的作用:
(1)通过引用一个网络LSA的方式,将一系列地址前缀与一个传输网络链路关联起来。
(2)通过引用一个路由器LSA的方式,将一系列地址前缀与一个路由器关联起来。Stub链路的前缀是与其相连的路由器相关联的。
一个路由器可以[ MAY]在一个指定区域始发多个intra-area-prefix-LSA。这些LSA通过唯一的Link State ID来进行区分。每个intra-area-prefix-LSA包含整数个前缀描述。
一个链路的DR负责为这个链路始发一个或多个域内前缀LSA,以便向区域内公告这个链路的所有前缀。设路由器是链路L的DR,路由器按照如下方式生成域内前缀LSA:
- 为了表明前缀和链路L已经相关联了,如下字段:引用的LS类型(Referenced LS Type)、引用的LS ID (Referenced Link State ID)和引用的通告路由器( Referenced Advertising Router)设为网络LSA的相应字段(分别对应着LS类型、LS ID和通告路由器)。这意味着引用的LS类型字段值为0x2002 ,引用的LS ID设为DR在链路L上的接口ID,引用的通告路由器设为DR的路由器ID。
与链路L相关的每个链路LSA都被检查(DR接口数据结构中和链路L有关的链路LSA)。如果链路LSA的通告路由器与DR完全邻接并且LS ID和邻居的接口ID相匹配的话,链路LSA中前缀列表都被复制进产生的域内前缀LSA中。可选项字段中的NU位 和/或者(and/or)LA位被置1的前缀不应该拷贝,Link-local地址也不拷贝。每个前缀都通过如下字段来描述:前缀长度、前缀选项和地址前缀字段。具有相同的“前缀长度”和“地址前缀”的多个前缀被认为是重复的。此时它们的 “前缀选项”字段应该以逻辑或的方式来得到一个唯一的前缀,以单个实例号的前缀被拷贝到域内前缀LSA中。所有前缀的度量值字段都设置为0。
-
“# 前缀”设为在LSA中包含的IPv6前缀数。必要的话,可以通过多个域内前缀LSA来携带前缀,这样可以控制LSA的长度。
路由器也要为自己建立域内前缀LSA,来公告相连的stub链路、环回口和主机。路由器RTX将按照如下方式生成域内前缀LSA:
-
为了表明前缀和路由器RTX已经相关联了,路由器RTX会将引用的LS类型设为0x2001、引用的LS ID设为0、引用的通告路由器设为RTX自身的路由器ID。
-
路由器RTX首先检查自己各个接口的状态。如果接口状态为 Down,则该接口的前缀不被发送。如果这个接口在RTX的路由器LSA中以类型2的链路来描述(也就是一个传输网络链路),该接口的前缀不发送 ,因为这些前缀应该在这个链路的域间LSA之中。但是,LA比特被设置的前缀应当[SHOULD]被通告,而和接口是否作为传输链路通告没有关系。如果接口类型是点到多点,或者接口状态是环回口,那么和接口相关联的全局IPv6地址(如果有的话)会被复制到域内前缀LSA中。同时,“前缀选项”中的LA-bit置1,“前缀长度”设为128,开销设为0。否则,RTX上配置的所有全局前缀会被复制进域内前缀LSA(前缀长度、前缀选项和地址前缀字段)。此时的开销字段设为接口的出站开销。
-
RTX将任何属于该区域(见附录C.7)直接相连的主机的IPv6前缀添加进域内前缀 LSA。
-
如果RTX在区域中有1条或更多的虚链路,(如果还没有地址的话),它就会在LSA中使用自身的一个全局IPv6接口地址,同时设置“前缀选项”字段里的LA-bit为1,“前缀长度”为128,开销为0。这些信息将用于之后的路由计算,使得虚链路两端的路由器可以发现对方的IPv6地址。
-
“#前缀”字段设置成复制到LSA里的前缀数量。如果必要的话,这些前缀可以通过多个域内前缀LSA传播来减小LSA的大小。
例如,由RT4为网络N3(假设RT4是N3的DR)始发的域内前缀LSA和RT3在区域1内为其自身始发的域内前缀LSA如下:
; RT4's Intra-area-prefix-LSA for network link N3 LS age = 0 ;newly (re)originated LS type = 0x2009 ;Intra-area-prefix-LSA Link State ID = 5 ;LSA type/scope unique identifier Advertising Router = 192.0.2.4 ;RT4's Router ID # prefixes = 1 Referenced LS Type = 0x2002 ;network-LSA reference Referenced Link State ID = 1 Referenced Advertising Router = 192.0.2.4 PrefixLength = 56 ;N3's prefix PrefixOptions = 0 Metric = 0 Address Prefix = 2001:0db8:c001:0100 ;pad ; RT3's Intra-area-prefix-LSA for its own prefixes LS age = 0 ;newly (re)originated LS type = 0x2009 ;Intra-area-prefix-LSA Link State ID = 177 ;LSA type/scope unique identifier Advertising Router = 192.0.2.3 ;RT3's Router ID # prefixes = 1 Referenced LS Type = 0x2001 ;router-LSA reference Referenced Link State ID = 0 Referenced Advertising Router = 192.0.2.3 PrefixLength = 56 ;N4's prefix PrefixOptions = 0 Metric = 2 ;N4 interface cost Address Prefix = 2001:0db8:c001:0400 ;pad Intra-area-prefix-LSA for Network Link N3
当网络状态发生改变时,路由器把前缀从一个域内前缀LSA移到另一个将是必要的。该例子说明:如果某路由器是链路上的DR,而该链路上没有其它路由器,则该链路的前缀在区域内前缀LSA中通告(引用该指定路由器的路由器LSA)。当有其它的路由器出现在链路时,一个网络LSA会始发于这个链路上,并且这个网络LSA将被域内前缀LSA所引用,域内前缀LSA将复制该链路上网络LSA中的前缀并进行通告。
请注意,在域内前缀LSA中,引用的通告路由器总是等价于始发域内前缀LSA的路由器(即LSA的通告路由器)。“引用的通告路由器”字段出现的原因是,即使它是目前多余的,但在将来也许就有用了。也许在将来的某个时候,我们想使用同样的格式来通告其他协议簇的地址前缀信息。如果是这样的话,DR也许不可以运行其它协议簇,链路的其它路由器需要始发域内前缀LSA。那样的话,“引用的通告路由器”和“通告路由器”会不同。
4.4.4. 未来的LSA验证 ,Future LSA Validation
预计新定义的LSA将不会在第4.8节所述的最短路径优先(SPF)计算中被处理。比如, OSPFv3 的LSA会和OSPFv2中使用的不透明LSA[OPAQUE]通告的信息相一致。一般情况下,在未来的LSA中发布新的信息不应该被使用,除非OSPFv3的路由器始发的该LSA可达。然而,根据通告的应用程序和数据,这种可达验证的频率也许[MAY]低于常规的SPF计算。
为了促进区域间的可达性验证,任何OSPFv3路由器始发的AS范围的LSA的路由器都会被认为是一个AS边界路由器(ASBR)。
4.5. 泛洪 ,Flooding
大部分的泛洪算法和[OSPFv2]13章所述的IPv4下的泛洪机制相同。特别是下列协议处理:确定哪个LSA的实例最新([OSPFv2]的13.1节),自我始发的LSA更新的回应([OSPFv2]的13.4节),发送链路状态确认包([OSPFv2]的13.5节]),LSA的重传([OSPFv2]的13.6节),接收链路状态确认包([OSPFv2]的13.7节),IPv6下和IPv4下是完全一样的。
然而,增加的泛洪的范围和未知类型LSA的处理(见附录A.4.2.1)引起OSPF泛洪算法发生了一些变化:接收链路状态更新([OSPFv2]的第13章)和发送链路状态更新([OSPFv2]的13.3节)必须考虑到LSA的范围和U比特位的设置。此外在IPv6下,由于LSA类型的重组和IPv6的LSA内容,安装LSA进OSPF数据库([OSPFv2]的13.2节)时会导致不同的事件(因为OSPFv3的LSA类型及内容都与OSPFv2的有所不同)。下面将详细描述了这些变化。
4.5.1. 接收链路状态更新包 ,Receiving Link State Update Packets
LS类型字段的泛洪范围的编码和处理未知LS类型使LSU包的接收处理发生了一定的修改。在IPv4中,每一个接收到的LSU中的LSA都会被检查。在IPv4环境中,如[OSPFv2]13章所描述的那样,每个LSA都会经过8步的处理。IPv6中,除了下面经修改过的步骤2和步骤3,其它都一样:
(2) 检查LSA的LS类型。如果接口下配置的区域是Stub或是NSSA,而LS类型是“AS泛洪范围”,就会丢弃该LSA并转而检查LSU里的下一个LSA。
这概括了IPv4中,自治系统外部LSA、自治系统内泛洪的opaque LSA [OPAQUE] 不能通过stub或NSSA区域的行为机制。
(3) 否则,如果LSA的LS类型中的泛洪范围设置为“保留”,将丢弃LSA并转而检查LSU里的下一个LSA。
[OSPFv2]的13章的步骤5b(发送LSU包)和5d(在链路状态数据库安装LSA)和下面用于OSPFv3的4.5.2小节和4.5.3小节有些许的不同。
4.5.2. LSU包的发送 ,Sending Link State Update Packets
LSU包的发送在[OSPFv2]13.3节里有详细的说明。对于IPv4和IPv6,发送LSU的步骤是相同的([OSPFv2]13.3节的步骤一至步骤五)。但是,有资格泛洪LSA的接口却是不同的。对于IPv6,有资格的接口基于如下因素选取出来:
-
LSA的泛洪范围
-
对于具有区域泛洪范围的LSA,需要看其所关联的区域。对于具有链路本地泛洪范围的LSA,需要看其所关联的接口。
-
LSA是否有可识别的LS类型。
-
LS类型中U-bit的设置。如果U-bit为0,那么未知的LS类型就被当作具有链路本地泛洪范围来处理。如果U-bit为1,那么未知的LS类型就被存储并泛洪,如同它们已经被识别一样。
选择具有资质的接口具体来说分为如下几种情况:
-
第一种
LSA的LS类型为已知。这种情况下,合法的接口的选择是依据LS类型里的LSA的泛洪范围决定。如果泛洪范围是“自治系统”,合法接口就是除virtual-link 之外的所有接口。除此之外,自治系统外部LSA不能泛洪进入Stub区域。如果泛洪范围是“区域”,合法接口就是连接到此区域的所有接口。如果泛洪范围是 “链路本地”,那么就只有一个合法接口,即连接到此LSA相关链路的那个接口(也就是接收到承载这个LSA的LSU的接口)。 -
第二种
LSA的LS类型为未知,并且LS类型中的U-bit为0(按链路本地泛洪范围进行处理 )。 这种情况下,只有单个的合法接口,也就是接收到这个LSA的接口。 -
第三种
LSA的LS类型为未知,并且LS类型中的U-bit为1(被存储并泛洪,如同它们已经被识别一样)。这种情况下,和第一种情况一样,依据LSA中编码的泛洪范围选择合法接口。
有时候,将一个LSA添加到邻居的链路状态重传列表([OSPFv2]的13.3小节中的步骤1d)必须更进一步的判断。如果LS类型可被路由器识别,但没有被邻居识别(通过检查邻居在其DBD里通告的选项字段决定),并且LSA的U-bit为0,当且仅当邻居是DR或BDR所连接的链路时,才把它添加到邻居的链路状态重传列表。下面是本文档详细定义的LS类型,即路由器LSA(LS类型0x2001)、网络LSA(0x2002)、域间前缀LSA(0x2003)、域间路由器的LSA(0x2004)、NSSA区域LSA(0x2007)、AS外部LSA(0x4005)、链路LSA(0x0008处)、域内前缀LSA(0x2009),假定它们可被所有的路由器理解。然而,所有的LS类型可能[MAY]不被所有路由器全部理解。例如,一个U-bit为0的新类型LSA可能[MAY]只被理解成路由器的一个子集。这种新的LS类型应该只在邻居理解LS类型、邻居是链路的DR或BDR时才会泛洪至该邻居。
上述段落解决了OSPFv2的扩展问题,也就是说要在Broadcast和NBMA网络上泛洪新的LSA类型,不一定要求DR支持扩展。
4.5.3. 在数据库中安装LSA ,Installing LSAs in the Database
数据库中有3个地方单独的存放LSA,这取决于它们的泛洪范围。全局链路状态数据库(见4.1小节)存储具有AS泛洪范围的LSA,只要LS类型是已知或者U-bit是1。区域链路状态数据库(见4.1.1小节)存储具有区域泛洪范围的LSA。链路链路状态数据库存储具有链路本地泛洪范围、U-bit为0(按具有链路本地泛洪范围进行处理)的LSA。
当向链路状态数据库存储LSA时,必须进行校验来看LSA内容是否发生改变。内容的变化和[OSPFv2]的13.2节讲的一模一样。当一个LSA中的内容改变时,路由表的以下部分必须进行基于LS类型的重新计算:
-
路由器LSA、网络LSA、域内前缀LSA和链路LSA:
从每个区域的最短路径计算(见4.8节)开始,进行整个路由表的重新计算。 -
域间前缀LSA、域间路由器LSA:
必须重新计算由LSA中描述的到目的地的最优路径([OSPFv2]的16.5小节)。
如果目的地是一AS边界路由器,就有必要重新审视 所有的AS外部LSA。 -
AS外部LSA、NSSA-LSA:
由AS-外部LSA或NSSA-LSA所描述到目的地的最优路径必须重新计算(见[OSPFv2]
的16.6节和 [NSSA区域]的2.0节)。OSPFv2中,当新的LSA被安装进数据库,对应的旧LSA必须被移除。这个旧的实例同
时也必须从所有邻居的链路状态重传列表移除。
4.6. 自始发的LSA的定义 ,Definition of Self-Originated LSAs
在IPv6中,一个自始发LSA的定义已经比IPv4的定义([OSPFv2]的13.4节和14.1节)简化了不少。对于IPv6,自始发的LSA是指那些通告路由器字段值等于自己的路由器的ID的LSA。
4.7. 虚链路 ,Virtual Links
OSPFv2 中的虚链路在[OSPFv2]的15章进行了说明。虚链路在OSPFv3里,除了下面的几点不同都是和 OSPFv2 相同:
-
任何具有AS泛洪范围的LSA以及它们汇总后的LSA,永远不会通过虚链路进行泛洪。这是对OSPFv2中处理行为的推广。
-
此外,对虚链路的IPv6接口地址,必须[MUST]使用IPv6的全局地址,而不像其它接口类型使用链路本地地址。这个地址用于虚链路上发送的OSPF协议包的源地址。因此, 虚链路上不可能[SHOULD NOT]始发链路LSA,因为虚链路甚至都没有链路本地地址或相关的前缀。
-
同样地, 虚链路邻居的IPv6地址也必须是全局地址。为了能够在路由计算时查找到虚链路邻居的IPv6地址,邻居路由器必须在虚链路的transit区域中的一个域内前缀LSA中通告其虚链路的IPv6接口地址(见本规范的4.4.3.9和4.8.1小节)。
-
如同所有其它的OSPFv3接口一样,路由器为虚链路分配一个(本地)唯一的接口ID。这个ID通过Hello包、router-LSA经由虚链路通告出去。
4.8. 路由表计算 ,Routing Table Calculation
OSPFv3的路由计算和OSPFv2的计算流程相同,都按照[OSPFv2]的16章所规定的那五个步骤进行。它们在更高级别的层次上有如下不同之处:
-
从路由器LSA和网络LSA中删除的前缀信息,改在域内前缀LSA中通告。[OSPFv2]中规定,用路由器LSA对stub网络进行检查,而OSPFv3中将在域内前缀LSA中检查stub网络。
-
类型3和类型4的汇总LSA分别被命名为域间前缀LSA和域间路由器LSA。
-
地址信息除了在LSU包的LSA载荷中出现,不再出现在LS ID中了。
-
OSPFv3中,路由器可以在单个区域始发多个通过LS ID来区别的路由器LSA。
在区域的最短路径计算中必须[MUST]按单个聚合后的路由器LSA进行处理(见本规范的4.8.1小节)。
对于每一个区域而言,最短路径树的计算将为区域的路由器和传输链路(见4.8.1)产生路由表表项。这些条目将用于4.8.3章的域内前缀LSA、域间前缀LSA和域间路由器LSA 的处理。
路由表的变化相应的产生不同的事件(见[OSPFv2]的16.7章)以及逻辑上等开销的多个路径(见[OSPFv2]的16.8章)对于OSPFv2和OSPFv3都是完全一样的。
4.8.1. 计算一个区域的最短路径树 ,Calculating the Shortest-Path Tree for an Area
在[OSPFv2]的第16.1节有IPv4的最短路径计算。IPv4和IPv6所用的最短路径树计算图相同。图的顶点是路由器和传输链路,分别用路由器LSA和网络LSA来代表。确定路由器是靠自身OSPF路由器ID;对应地,使用DR的接口ID和OSPF路由器ID确定传输链路。在本区域内,路由器和传输链路都有关联路由表条目(见本规范4.3节)。
[OSPFV2] 的16.1小节将最短路径计算划分成两个阶段。第一阶段,运行Dijkstra 算法进行计算,stub链路作为的叶子添加到树上。OSPFv3保留了这种划分。
OSPFv3中的Dijkstra计算和OSPFv2中的规定相同,除了以下几点不同(Dijkstra计算步骤可以参照[OSPFv2]的16.1节):
一台路由器的顶点ID为OSPF 路由器ID。某个传输网络的顶点ID是接口ID和网络中DR的OSPF路由器ID的组合。
-
第2步中,当一个路由器顶点V刚刚被添加到最短路径树,可能有多个LSA关联到路由器。所有“通告者路由器”设置成 V自身OSPF路由器ID的 路由器LSA必须作为整体处理——当作单个的大型路由器LSA片段。选项字段和路由器类型比特(Nt 、V、E和B)总来自最小链路状态ID号的路由器LSA。
-
OSPFv3中不再需要步骤2a,因为路由器LSA里不再有stub网络了。
-
在步骤2b中,如果W是一台路由器,并且路由器LSA的V6-bit或R-bit没有在 LSA选项字段中进行设置,那么传输链路W会被跳过,直接检查V的下一个链路。
-
在步骤2b中,如果W是一台路由器,则可能会再有多个LSA关联到这个路由器。通告者路由器字段设置成W的OSPF路由器ID的所有路由器LSA必须作为整体处理——当作单个的路由器LSA巨大片段。
-
在第4步中,现在区域的每一个路由器都有各区域路由表条目了 ,而不仅仅是区域边界路由器有。这些条目囊括了IPv4的区域边界路由器的路由表项的所有功能,其中就有虚链路的维护。当本步骤中被添加到的区域路由表的路由器是虚链路的另一端,虚邻居的IP地址设置成下面这样:虚邻居始发的域内前缀LSA的集合将被检查,虚邻居的IP地址被设置为遇到的LA-bit设置为1的第一个前缀。
-
传输网络的路由表条目,不会再与IP网络相关联了,而是在步骤4中被计算并且加入每个区域的路由表。
-
最短路径计算和[OSPFv2]的16.1小节讲的第二阶段的2个步骤相似。但是不再路由器LSA检查stub链路了,而是在域内前缀LSA中对其进行检查。NU-bit置1的前缀不应当包括到路由计算里。任何被通告的前缀开销是前缀通告的开销加上 到域内前缀LSA承载的参考的LS 类型、参考的链路状态ID和参考的通告者路由器字段所确定的传输顶点(路由器或传输网络)的开销之和。后一种开销存储于区域的传输顶点的路由表条目中。
这个规定不要求上述算法用于计算域内最短路径树。但是,如果使用另一个或优化的算法,必定产生完全相同的最短路径树。同样重要的是,任何替代算法或优化都要满足规定——传输顶点必须双向列入树。替代算法和优化算法超出本规范讨论的范围。
4.8.2. 下一跳的计算 ,The Next-Hop Calculation
在IPv6下,IPv6地址(链路本地地址)的下一跳计算和IPv4地址的下一跳计算有着相同的流程(见[OSPFv2]的16.1.1小节)。但是,也存在几点不同。当计算路由器(名称是 X)的下一跳IPv6地址时,X和进行计算的路由器在一条链路上,那么进行计算的路由器就会把路由器X始发的链路LSA(见附录A.4.9)中的链路本地地址作为下一跳IPv6地址。这个步骤对某些链路类型是必要的,比如NBMA上,2个路由器不会成为邻居,也不会交换OSPF Hello包。对于其它链路类型,下一跳地址的将通过Hello包里的IPv6源地址确定。
除此之外,当计算区域的域内前缀LSA的路由时,父顶点可以是一个路由器LSA或是网络LSA。这和OSPFv2域内SPF(OSPFv2)的第二阶段中父顶点总是一个路由器LSA形成鲜明对比。在下面的情景中,域内前缀LSA所引用的LSA是直接相连着的网络LSA,那么前缀也被认为是直接相连的。在这种情况下,下一跳是唯一的出站链路,并且没有下一跳地址被选取。
4.8.3. 计算域间路由 ,Calculating the Inter-Area Routes
在IPv6下,域间路由的计算和IPv4的有着相同的流程(见[OSPFv2]的16.2小节)但是进行了如下的改进:
-
类型3的汇总LSA和类型4的汇总LSA分别变成了域间前缀LSA和域间路由器LSA。
-
以上的LSA类型的链路状态ID不再编码的LSA所描述的网络或路由器。相反,一个地址前缀将包含在域间前缀LSA载荷中;一个自治系统边界路由器的路由器ID是由一个域间路由器LSA承载。
-
前缀选项字段中的NU-bit设置为1的前缀应当被域间路由器计算忽视掉。
单个域间前缀LSA或域间路由器LSA改变了,使得[OSPFv2]的第16.5节概述的增量计算能够被执行,而不是重新计算整个路由表。
4.8.4. 检查传输区域的汇总LSA ,Examining Transit Areas’ Summary-LSAs
在IPv6下,传输区域的检查和IPv4的有着相同的流程(见[OSPFv2]的16.3小节),只是进行了和4.8.3小节中的域间路由计算相同方式的改进。
4.8.5. 计算AS外部路由和NSSA路由 ,Calculating AS External and NSSA Routes
在IPv6下,AS外部、NSSA路由的计算和IPv4的有着相同的流程(见[OSPFv2]的16.4小节)但是进行了如下的改进:
-
自治系统外部路由、NSSA路由的链路状态ID不再编码这些LSA所描述的网络。相反,一个地址前缀包含在LSA载荷中了。
-
自治系统外部LSA或NSSA LSA中的缺省路由一个长度为零的前缀通告。
-
不再比较自治系统外部LSA或NSSA LSA的转发地址字段为0.0.0.0,来看是否已使用了转发地址,而是检查各个的LSA中的F位。当且仅当F被置1时,转发地址才被使用。
-
前缀选项字段NU位被设置的前缀应该被域间路由计算忽略。
-
自治系统边界路由器(ASBR)和转发地址选择将会同样方式的进行,只是关闭了RFC 1583 兼容性的功能。而且,RFC 1583 兼容性不是OSPFv3的配置参数。请读者参考附录C.1。
当一个自治系统外部LSA或NSSA LSA改变了,[OSPFv2]的第16.6节概述的增量计算能够被执行,而不是重新计算整个路由表。
4.9. 单个链路的多接口 ,Multiple Interfaces to a Single Link
OSPFv3中,一台路由器可以在单个的链路相关联的同一个OSPF实例和区域中有多个接口。 所有的接口都会用于发送和接收数据流量,但只有一个接口进行OSPF控制流量的接收和发送。下面有详尽的说明:
o Each of the multiple interfaces is assigned a different Interface
ID. A router will automatically detect that multiple interfaces
are attached to the same link when a Hello packet is received with
one of the router’s link-local addresses as the source address and
an Interface ID other than the Interface ID of the receiving
interface.
-
多个接口都被分配了不同的接口ID。当收到Hello报文的是以该路由器自身的一个链路本地地址作为源地址,且以该路由器自身的一个接口ID(而不是接收接口)作为接口ID 时,路由器将会自动检测连接到同一链路的多个接口。
-
多个接口都必须[MUST]配置成在同一链路上具有相同接口实例ID。如果接口下存在多个实例ID,它将与其它相同实例ID的接口进行合并、分组。实例ID对链路上每个多接口的组是唯一的。例如,如果接口A的配置的实例ID为1和35,接口B配置了实例ID 35,接口B可能是对实例35有效,但接口A才对实例1有效。
-
路由器将在所有接口忽略所有的除了Hello包以外的OSPF报文,但连接到链路的接口除外。它只会在单个接口发送OSPF控制报文(包括Hello包)。这个接口被指定为激活接口和其他连接到同一链路的接口将成为指定为备用接口。激活接口是通过竞选实现的。例如,具有最高的接口ID的接口,可以被选为激活接口。如果该路由器被选为DR,它会成为激活接口的接口ID并被用作网络LSA的LS ID。
-
所有连着链路的接口(激活的和备份的)将出现在路由器LSA里。除此之外,将为每个接口生成链路LSA。这样,所有的接口将包括在OSPF的路由计算中。
-
任何为备份接口始发的链路本地范围内的LSA将被泛洪至激活接口。如果备份接口出现故障,为备份接口始发的链路本地范围内的LSA必须[MUST]在激活接口上被清空。
-
备份接口的上的前缀将按激活接口对前缀的相同方式进行处理。例如,如果路由器是链路的DR,激活接口的前缀会被包含在和激活接口网络LSA相关联的域内前缀LSA中;链路上来自备份接口的前缀,也将被包括在这一域内前缀LSA中。同样地,如果链路是一个stub链路,那么激活和备份接口的前缀将全部被包含在同一个和路由器LSA相关联的域内前缀LSA中。
-
如果激活接口出现故障,将有一个新的激活接口顶替上去。新的激活接口应该[SHOULD]和所有链路上的路由器生成新邻居邻接关系。这种故障可以通过对路由器连着激活路由器的其它接口不再帧听到路由器的Hello包来检测到,或通过内部机制,例如,监测激活接口的状态。
o If the network becomes partitioned with different local interfaces
attaching to different network partitions, multiple interfaces
will become Active Interfaces and function independently. -
如果网络分成了多个连接着不同网络分区的本地接口,那么这些接口将成为激活接口并且相互间功能独立。
-
在SPF计算过程中,当直接连接到根顶点的网络LSA被检查时,所有连接着链路的多接口的邻接的路由器LSA必须用于下一跳计算。
这可以在back链路检查(见[OSPFv2]的第16.1节,第2步(B))完成,通过检查路由器LSA的各个链路,列出所有指向网络LSA的链路列表。在此列表中的链路接口ID用于找到相应的链路LSA,进而使得链路本地地址被用于向路由表中安装等开销路径时作为下一跳。
- 接口状态机增加了备份状态。关于备份状态,见下面的4.9.1节的说明。
4.9.1. 备份接口状态 ,Standby Interface State
在这种状态下,接口是链路的多接口之一,这个接口是指定的备份,并且不发送或接收控制信息。接口将持续接收激活接口发送Hello报文的。该接口将维护一个定时器——激活接口定时器,与RouterDeadInterval有相同的时间间隔。当从激活接口接收到OSPF Hello包,此计时器将复位为0。
增加了两个新的导致接口状态变化的事件:MultipleInterfacesToLink和ActiveInterfaceDead。 对这两个事件的说明如下:
-
MultipleInterfacesToLink
路由器上的一个接口从同一台路由器另一接口收到一个Hello包。其中一个接口被指定为激活接口,另一个接口被指定为备份接口。备份接口转换到备份状态。 -
ActiveInterfaceDead
作为一个标志表明备份接口不再和激活接口相连。停止使用激活接口定时器是这个事件一个标志,因为它表明,备份接口在RouterDeadInterval内没有从激活接口收到OSPF Hello包。其它标志可能来自内部的通知,如通过配置禁用激活接口。任何路由器内部标志,如该路由器知道激活接口不再于链路上有效,可以触发备份接口的ActiveInterfaceDead事件。
接口状态机的新增功能包括:
State(s): Waiting, DR Other, Backup, or DR
Event: MultipleInterfacesToLink
New state: Standby
Action: All interface variables are reset and interface
timers disabled. Also, all neighbor connections
associated with the interface are destroyed. This
is done by generating the event KillNbr on all
associated neighbors. The Active Interface Timer is
started and the interface will listen for OSPF Hello
packets from the link's Active Interface.
所有的接口变量被重置、接口定时器被禁用。同时,所有的邻居
连接的关联接口被清除。这通过对所有邻居生成事件KillNbr
来实现的。激活接口定时器被启动并且OSPF的接口将侦听从链路
的激活接口发送的OSPF Hello包。
State(s): Standby
Event: ActiveInterfaceDead
New state: Down
Action: The Active Interface Timer is first disabled. Then the InterfaceUp event is invoked.
首先禁用活动接口计时器。 然后调用Interface Up事件。
5. 安全注意事项 ,Security Considerations
在IPv6上运行时,OSPFv3依赖IP认证报头(见[IPAUTH])和IP封装安全有效载荷 (见[IPESP])来保证协议包的完整性、认证和保密。上述内容在[OSPFv3-AUTH]中都有介绍。
多数OSPFv3的实现将运行在有独立于自身的安全假设和域从而支持多个协议的系统。当使用IPsec用来保护OSPFv3的数据包时,检查IPsec安全关联(SA)和本地的SA数据库来确保OSPF数据包从一个OSPFv3信任源始发 是相当重要的。这需要排除数据包使用的认证可能属于在同一系统上运行着另一个协议定义的一个SA认证。
[OSPFV3-AUTH]中的机制无法为路由器受损,故障或配置错误提供保护。 所以路由器可能会偶然或自身原因引起影响整个路由域的故障。 鼓励读者参考[GENERIC-THREATS],以更全面地描述路由协议的威胁。
6. 可管理性的注意事项 ,Manageability Considerations
OSPFv3的管理信息库在[OSPFV3-MIB]中定义。
7. 互联网地址编码分配机构注意事项 ,IANA Considerations
大部分 OSPFv3的IANA注意事项都在[OSPF-IANA]中体现。IANA已经用该本文件更新了先前参考的RFC2740。
除此之外,本文档还介绍[OSPFv3]里没有的IANA 的要求:
-
[OSPF-IANA]定义的迁移OSPFv2的选项值0x000040 和 0x000080保留在OSPFv3选项登记中。如果读者想了解更多关于OSPFv3选项字段的信息,请查阅附录A.2 。
-
[OSPF-IANA]中定义了关于增加值为0x08的P-bit到OSPFv3的前缀选项中。
如果读者想了解更多关于OSPFv3选项字段的信息,请查阅附录A.4.1.1 。 -
[OSPF-IANA]中定义了关于增加值为0x10的DN-bit到OSPFv3的前缀选项登记中。
如果读者想了解更多关于OSPFv3选项字段的信息,请查阅附录A.4.1.1 。
7.1. IANA注意事项中,废止用于OSPFv3的MOSPF, MOSPF for OSPFv3 Deprecation IANA Considerations
废止了用于OSPFv3的MOSPF之后,下面列出的代码点可以用于重新分配。请查阅[OSPF-IANA]来了解各自的登记情况。本文档中:
-
在OSPFv3选项登记 废除值为0x000004的MC-bit。
-
在OSPFv3 LSA功能代码登记中,废除值为6的组成员LSA。
-
在OSPFv3前缀选项登记中废除值是0x04 的MC-bit 。
OSPFv3 路由器属性中的W-bit也同样被废止。这就需要一个新的注册之处用于OSPFv3的路由器性能,因为它会和OSPFv2的路由器属性有所不同。
Registry Name: OSPFv3 Router Properties Registry
Reference: RFC 5340
Registration Procedures: Standards Action
Registry:
Value Description Reference
------ ------------- ---------
0x01 B-bit RFC 5340
0x02 E-bit RFC 5340
0x04 V-bit RFC 5340
0x08 Deprecated RFC 5340
0x10 Nt-bit RFC 5340
OSPFv3 Router Properties Registry