文/许亮
本文基于RFC2740介绍了OSPFv3与OSPFv2的区别和实现,对继承OSPFV2的内容可以参考RFC2328,这里不再赘述。
OSPFV3是在原有OSPF V2基础上开发的支持IPV6的协议,它使用的仍然是链路状态算法,OSPFV2的基本机制,如洪泛(flooding)、DR选举、区域划分、SPF算法保持不变。相对于OSPFV2,OSPFV3最大的变化就是对IPV6地址的支持,以及对IPv6体系架构的兼容。另外,OSPFv3在OSPFv2的基础上,对功能做了增强。
IPv6中使用地址/前缀长度描述地址,而没有子网掩码的概念。IPv6中的链路(Link)就类似于IPv4中子网或网络。因此,本文中也使用链路(Link)表达类似的意思。
OSPFv3保留了OPSFv2的大部分机制。为了支持IPv6地址、IPv6报文结构和体系,OSPFv3主要做了以下修改:
IPv6使用链路(link)表示节点赖以在链路层通信的媒介或工具。Interface连接到链路上。多个IPv6地址前缀可以分配到一个单独的链路上;对连接到链路上的两个节点,即使他们的IPv6地址前缀不同,也可以直接通信。
相应的,OSPFv3也是运行在链路上,而不象IPv4中是基于网段的。链路的概念取代了OSPFv2中的网络和子网。因此,我们说OSPF接口是连接到链路上而不是子网上。
这一变化影响了Hello报文的接收以及Hello报文和Network-LSA的内容。
在OSPFv3中,OSPF协议报文头和大部分LSA中去掉了地址部分,从而与网络层协议无关。具体说来有以下方面:
l 除了LSU报文中的LSA载荷包含IPv6地址信息外,其他的协议报文中都不含有地址字段;
l Router-LSA和Network-LSA中去掉了网段地址,用拓扑信息取而代之;
l OSPFv3中的Router ID、Area ID和Link State ID保留IPv4中的格式——32bit;
l 在所有类型的网络中,包括广播和NBMA,都使用Router ID来识别邻居;
LSA的洪泛范围归纳为3类,放在LSA的LS类型域(field)。这三类是:
l 本地链路范围:LSA只在本地链路上传播,这类LSA是Link-LSA;
l 区域范围:LSA只在一个OSPF区域内部传播,这类LSA包括Router-LSA、Network-LSA、Inter-Area-Prefix-LSA、Inter-Area-Router-LSA和Intra-Area-Prefix-LSA;
l 自治系统范围:LSA在整个自治系统内传播,这类LSA只有AS-external-LSA。
OSPFv3支持在单链路上运行多实例。这使得多个供应商在共享一台甚至多台网络设备的情况下,仍然可以保持各自网络的独立运行。在OSPFv2中,是通过设置不同的OSPF验证来实现的。
在单链路上运行多实例是通过在OSPF报文头和OSPF接口数据结构中包含实例号(Instance ID)做到的。实例号只影响OSPF报文接收。
IPv6中的本地链路地址用于单链路上的邻居发现,无状态自动配置等等。对于以本地链路地址作为源地址的报文,IPv6路由器不作转发。本地链路单播地址范围是FF80/10。
OSPFv3假定每个路由器的物理接口都分配了本地链路单播地址。除了虚连接以外,所有的OSPFv3接口都使用本地链路单播地址作为报文的源地址。路由器从链路上学到其他路由器的本地链路单播地址,再使用这些地址作为转发报文的下一跳。
虚连接使用全球范围地址或本地站点地址作为OSPF报文源地址。
本地链路地址只出现在Link-LSA中,其他OSPF LSA不使用本地链路地址。Inter-area-prefix-LSA、AS-external-LSA和intra-area-prefix-LSA中决不能携带本地链路地址。
OSPFv3本身没有认证(Authentication)功能。因此,OSPFv3报文头中去掉了AuType和Authentication字段。相应的,所有的OSPF区域和接口数据结构都去掉了认证相关域(field)。
OSPFv3的认证依赖于IPv6报文的认证头和IP封装安全有效载荷报头。OSPFv3通过这些IP报文头来确保路由交换的完整性和认证/保密。
OSPFv3报文利用IPv6标准的16位完整校验和防止报文数据的随机错误。该校验和覆盖了整个OSPF报文和伪IPv6头。
OSPFv3报文直接封装在IPv6报文中。OSPFv3报文头中去除了素有的地址相关字段,做到与网络协议无关。所有的地址信息都放在各种LSA中。OSPFv3报文的具体变化有(分别见图一——图三):
l OSPF版本变为3;
l Hello报文和DD报文的Option字段扩展到24位;
l OSPF报文头除去了Authentication和AuType字段;
l Hello报文不含有任何地址信息,包含Interface ID。发送路由器为链路上的接口分配Interface ID,并用Interface ID唯一的标识这些接口。在Network-LSA中,使用DR的Interface ID作为Link State ID。
l 在报文Option字段增加了’R-bit’和’V6-bit’。在SPF运算处理Router-LSA时会用到这两个参数。若’R-bit’为空则路由器可以在OSPF拓扑分发时不转发transit流量;this can be used in multi-homed hosts that want to participate in the routing protocol。’V6-bit’对’R-bit’作出了更详细的规定:若’V6-bit’为空,则路由器可以在OSPF拓扑分发时不转发IPv6报文。若设置了’R-bit’但’V6-bit’为空,路由器不转发IPv6报文,但可能转发其他协议体系的报文。
l OSPFv3支持在单个链路上运行多个OSPF协议实例(OSPF protocol instance)。在OSPFv3报文头中增加了’Instance ID’字段。
OSPFv3的报文头如下图所示:
图1 OSPF for IPv6报文头
Version:3
Type::报文类型, 1---Hello, 2---DD, 3---LSR, 4---LSU, 5---LSAck
Packet length:包括标准OSPF报文头的OSPF报文长度,长度单位Byte。
Router ID:每个OSPFv3进程的唯一标识
Area ID:区域标识符
Checksum:包括IPv6 pseudo-header的OSPF报文校验和
Instance ID:VPN实例号。
OSPFv3中,LSR和LSAck报文的发送保持不变。Hello,DD和LSU报文的发送有所不同。
图2 Hello报文格式
OSPFv3 Header: 参见OSPFv3报文头格式
Interface ID: 接口标识, 在路由器上唯一标识接口
Rtr Priority: 路由器优先级
HelloInterval: 发送Hello 报文的间隔
RouterDeadInterval: 此计时器超时后, 邻居Down掉
Neighbor ID: 邻居的Router ID
Options: V6:为0时, 不参加路由计算
E ---- 在Hello报文中, 此位为0时, 表示此区域不传播AS-External-LSA
MC -- 是否多播
N --- Type-7 LSA 处理相关
R --- 为0时, 表明产生此条LSA的路由器状态down掉了
DC-- 环回相关
图3 Option选项
图4 DD报文格式
Options: 与Hello报文中的Options相同
Interface MTU: 本地接口的MTU值
I: Initial,初始化位, 为1时表明是第一个DD报文
M: More,表明接下来还有DD报文
MS: 主/从位 (Master/Slave), 为1时, 表明为主(Master)
DD sequence number: DD报文的序列号
List of LSA Header: LSA头部的集合, 用于接受方检查LS数据库
LSR (LS Request) 请求所需的LSA
图5 LSR报文格式
Link State ID: LSA的标识
LS Type: 参考LSA格式部分
LSU (LS Update) 回复所请求的LSA
图6 LSU报文格式
# LSAs: 报文里包含的LSA数目
确认收到的LSA
图7 LSAck报文格式
LSA头和Router-LSA、Network-LSA中去掉了所有的地址内容。Router-LSA和Network-LSA描述了路由域的拓扑结构,而该结构与具体的网络层协议无关。增加了新的LSA用来分发IPv6地址信息和下一跳信息。一些IPv4中的LSA名称改变了,以保持所有LSA意思的一致性。LSA的具体变化有:
l Option字段从LSA头中拿走放到了Router-LSA、Network-LSA、Inter-Area-Router-LSA和Link-LSA中。同时,Option字段扩展到24bit;
l LSA类型字段扩展到16bit(占据了原来Option与LSA Type的位置),最高的3位表示洪泛范围和对未知类型LSA的处理;
l LSA中的地址格式为:[前缀,前缀长度]取代过去的[地址,掩码]。缺省路由的前缀长度为0;
l Router-LSA和Network-LSA不包含地址信息,即完全独立于具体的网络层协议;
l 完整的路由器接口信息可能分布在多个Router LSA中,接收路由器在进行SPF运算时需要综合同一路由器发出的多个Router-LSA;
l 出现一类新的LSA:Link-LSA。这类LSA只在本地链路上传播,不能被扩散到链路以外的范围。增加Link-LSA有三个目的:
u 为连接到同一链路上的其他路由器提供本设备的本地链路地址;
u 向连接到同一链路上的其他路由器通告本链路的IPv6前缀列表;
u 声明本链路上生成的Network-LSA的Options字段集;
在IPv4中,router-LSA携带了路由器的IPv4接口地址,该地址与IPv6中的本地链路地址相当。只在OSPF计算路由的下一条时会用到这些地址信息,因此,Router-LSA中的这些地址信息不需要传播到本地链路以外的区域。IPv6中使用Link-LSA分发这些地址更为有效。而仅仅通过接收Hello报文,路由器是无法学到本地链路地址的:在NBMA网络上,路由器和下一条路由器不一定会交互Hello报文,他们是通过DR来感知对方的存在。
l the Option field in the Network LSA is set to the logical OR of the Options that each router on the link advertises in its Link-LSA.路由器将它的Link-LSA中的本链路路由器的Option字段值相与,得到自己的Options字段值。
l 3类Summary-LSA更名为’Inter-Area-Prefix-LSA’;
4类Summary-LSA更名为’Inter-Area-Router-LSA’;
l Inter-Area-Prefix-LSA、Inter-Area-Router-LSA和AS-external-LSA中的Link State ID失去了原来的地址意义,只用来标识链路状态数据库中的一项。过去用Link State ID来标识的地址信息和Router ID被放在LSA体中。
l 唯有Network-LSA和Link-LSA的Link State ID带有附加意义:Link State ID也是本链路上发送路由器的Interface ID。因此,这两类LSA也是目前唯一对长度不作限定的LSA:Network-LSA必须包含本链路上的所有路由器;Link-LSA必须包含本链路上的所有路由器的本地链路地址。
l 添加了一类新的LSA:Intra-Area-Prefix-LSA。这类LSA携带了所有的IPv6地址前缀信息。
l AS-external-LSA中有两个字段是可选的:forwarding address和external route tag。此外,为了包含额外的OSPF自治系统外路由属性AS-external-LSA可以引用其他的LSA;
OSPFv3能够处理未知类型的LSA。对于未知类型的LSA,可以只在本地链路范围发送,也可以把它当作一种已知的类型洪泛。具体的处理方式取决于link state header中的LS Type字段的定义。
在IPv6中,需要路由器在单个链路上提供对报文的多种处理。IPv4中对未知类型报文直接丢弃的做法已经不适用了。当DR比链路上其他路由器支持的Option类型少时,直接丢弃报文会产生问题。
在IPv4中设置Stub区域减小了区域内部路由器的链路数据库和路由表规模。这使得在大规模OSPF路由域内的路由器只占用了很少的资源。
OSPFv3保留了Stub区域的概念,类似的,Stub区域内只有router-LSA、network-LSA、Inter-Area-Prefix-LSA、Link-LSA和Intra-Area-Prefix-LSA。
与上一版本不同的是,OSPFv3允许不能识别类型的LSA被当作已知类型洪泛。无节制的加入未知类型LSA可能导致Stub区域的链路状态数据库超过路由器的处理能力。
为防止这种现象的发生,必须同时满足下列两个条件的LSA才可以在Stub区域内洪泛:
l LSA的洪泛范围为区域(area)或本地链路范围;
l LSA的’U-bit’置为0。
在OSPFv2中,对p2p,Virtual link上的邻居用他们的Router ID来识别;对broadcast,NBMA,p2mp上的邻居用他们的IPv4接口地址来识别。在OSPFv3中,所有链路上的邻居路由器是由他们的Router ID来识别的。这样的变化使得OSPF报文的接收、邻居发现有了相应的变化。
0.0.0.0的Router ID是保留未用的。Router ID决不能设为0.0.0.0。
从IPv4到IPv6,基本的OSPF机制保持不变。详细内容请参加RFC2328 Section4。归纳起来,两者的共性主要体现在以下几个方面:
l 都维护链路状态数据库;
l 构成数据库的基本单位LSA需要在邻居间同步;
l 首次同步是通过交换DD报文,LSR报文和LSAck报文来完成的;此后链路状态数据库的维护是通过洪泛,发送LSU报文和LSAck报文来实现的;
l 使用Hello报文来发现和维护邻居关系;
l 只在broadcast和NBMA链路上选举DR和BDR;
l 邻接关系的建立;
l 区域内路由和用ASE标识引入的区域外部路由的思想;
l 各种路由的计算。
特别的,OSPFv3完全继承了RFC2328中描述的OSPFv2的下列机制:
l 2328 Section4.3描述的OSPF报文,包括Hello报文,DD报文,LSR报文,LSU报文,LSAck报文。尽管有些报文的格式有一些变动,但这些报文的用法是完全不变的;
l 对运行OSPF的系统要求不变,只是OSPFv3要求系统必须运行在IPv6的协议栈下;
l 邻居关系的发现和维持机制,邻接关系的建立,包括RFC2328的Section 7,7.1-7.5;
l OSPF支持的链路类型(或者叫接口类型)不变,有:p2p,broadcast,NBMA,p2mp和虚连接;
l 接口状态机,包括接口状态和事件列表,DR、BDR选举机制保持不变,可参见RFC2328 Section 9.1-9.4;
l 邻居状态机,包括OSPF邻居状态和事件,可参见RFC2328 Section 10.1-10.4;
l 链路状态数据库老化机制、LSA的域内传播和提前老化处理,可参见RFC2328 Section 14和14.1;
在保留大部分OSPFv2机制的同时,部分机制有了变化。下面描述OPSFv3的具体实现方法。
主要的数据结构是不变的,分为:区域数据库,接口数据库,邻居数据库,链路状态数据库和路由表。Top-level数据结构与RFC2328 Section 5中列出的一致。对数据库主要做了下列修改:
l 所有未知的LS类型和AS洪泛范围出现在顶层数据库中,这些内容过去只限于特定的区域或链路。AS-external-LSA是唯一具有AS洪泛范围的LSA。未知LS类型’U-bit’设为1。
OSPFv3区域数据结构包括了RFC2328 Section 6中定义的所有元素。此外,区域数据结构中包含了所有已知类型的LSA洪泛范围,包括:router-LSA、network-LSA、inter-area-prefix-LSA、inter-area-router-LSA和intra-area-prefix-LSA。区域数据结构中也包含未知LS类型的洪泛范围:area。实现MOSPF的路由器会在区域数据结构中包含group-menbership-LSA。7类LSA放在NSSA区域的数据结构中。
在OSPFv3中,路由器通过接口连接到链路。OSPFv3的接口数据结构相对于OSPFv2做了以下修改:
3.1.2.1 Interface ID
路由器的每个接口都分配了接口ID,用来唯一的标识这些接口。例如有些应有会用MIB-II IfIndex作为接口ID。接口ID出现在:该接口发送的Hello报文中;路由器向连接该接口的链路发送的link-local-LSA中;所属区域的Router-LSA中。链路上的DR发送的network-LSA中把本设备该链路上的接口ID作为link State ID。
3.1.2.2 Instance ID
每个接口都分配了Instance ID,缺省为0。只有当存在多个彼此独立的OSPF团体(community of OSPF Router)时,才有必要分配各自不同Instance ID。
例如,有两个完全独立的OSPF团体。给团体1分配Instance ID 0,即给所有的OSPF团体1接口分配Instance ID 0;对团体2分配Instance ID 1,即给其余的接口分配Instance ID 1。这样OSPF的发送和接收过程就能保证两个团体的独立。
3.1.2.3 本地链路范围的LSA列表
该列表包括了所有洪泛范围为本地链路范围的LSA,也包括这样一些LSA,他们是由连接到该链路的接口的接口数据结构中包含的链路产生或传播的。该列表包含了本链路的Link-LSA。
3.1.2.4 未知LS类型的LSA列表
该数据结构包括所有未知LS类型和’U-bit’设为0(对未知LS类型,认为该LSA传播范围为本地链路范围)。
3.1.2.5 接口IP地址
OSPFv3中几乎所有报文的源地址都是发送接口的本地链路地址,只有虚连接除外:在虚连接上发送的报文必须使用路由器的本地站点地址或IPv6全球地址作为接口IP地址。
3.1.2.6 链路前缀列表
路由器在Link-LSA中会通告本链路上的IPv6前缀列表。这样链路上的DR就可以在intra-area-prefix-LSA中通告这些地址。
OSPFv3中,每个路由器接口有唯一的metric,该metric代表了该接口发送报文的花费。OSPFv3的认证依赖于IPv6报文的认证头和IP封装安全有效载荷报头。OSPFv3通过这些IP报文头来确保路由交换的完整性和认证/保密。因此,关键字AuType和Authentication与OSPF接口无关。
接口状态,事件和接口状态机保持不变,,可参见RFC2328 Section 9.1-9.3。DR和BDR选举机制也保持不变,可参见RFC2328 Section 9.4。
OSPFv3中邻居数据结构的作用不变:收集所有建立邻接关系需要的信息。每个数据结构绑定到单个的OSPF接口上。IPv6中定义的邻居数据结构与RFC2328中的定义有以下差异:
邻居接口ID
邻居数据结构必须记录邻居发出的Hello报文中的接口ID。在两种情况下,路由器发布的Router-LSA会包含邻居的接口ID:
l 发送到p2p邻居;
l 向DR通过与之相连的链路;
邻居IP地址
在OSPFv3中,邻居IP地址是对方的本地链路地址。虚链路除外。
DR
邻居选举出的DR用Router ID来标识,而不象过去用IP地址标识。
BDR
邻居选举出的BDR用Router ID来标识,而不象过去用IP地址标识。
邻居状态、事件和邻居状态机保持不变,可参加RFC2328 10.1、10.2、10.3。判断是否建立邻接关系不变,可参加RFC2328 10.4。
OSPFv3直接运行在IPv6网络层之上,因此,OSPFv3报文被封装在一个或多个IPv6报文头之后,而其紧邻的前一个报文头Next Header域值为89。
与OSPFv2一样,除了保持邻居关系的Hello报文外,其他的OSPF协议报文只发给建立邻接关系的邻居。OSPFv3报文类型和功能与OSPFv2报文一致,在标准OSPF报文头Type域中标明。
IPv6路由器发送OSPF协议报文时,如下填充标准IPv6 OSPF报文头的各个域:
版本
设为3。
类型
OSPF报文类型,如Hello,LSU等。
包长度
包括标准OSPF报文头在内的整个OSPF报文的字节数。
Router ID
标识发送报文的路由器本身。
Area ID
接收OSPF报文的区域号。
Instance ID
绑定发送OSPF报文的接口的OSPF实例号。
校验和
标准IPv6 16位报文完整校验和,覆盖了整个OSPF报文和IPv6伪头。
对OPSFv3协议报文的IPv6源地址和目的地址选择与OSPFv2一致,可参见RFC2328 Section 8.1。目的地址从建立邻接路由器的AllSPFRouters,AllDRouters和邻居IP地址中选取。在IPv6中,除了虚连接外,都是选择对方的本地链路地址。
发送LSR报文和LSAck报文不变,可参见RFC2328 Section 10.9,13.5。发送Hello报文详见本文3.2.1.1,DD报文发送详见本文3.2.1.2,发送LSU报文详见3.5.2。
3.2.1.1 发送Hello报文
OSPFv3中,发送Hello报文有如下改变:
l Hello报文必须包含发送接口的接口ID;
l 由于OSPFv3运行基于链路而不是网段,因此Hello报文中不再携带子网掩码;
l 被选举出的DR,BDR在Hello报文中用他们的Router ID标识,而不是接口地址。报文中将DR/BDR置为0.0.0.0表示DR/BDR尚未选出。
l 扩展了Hello报文中的Option域,如下的一些位必须设置正确:
u 当且仅当发送接口连接到non-stub区,才设置’E-bit’;
u 当且仅当发送接口连接到NSSA区,才设置’N-bit’;
u 当且仅当接口抑制Hello报文发送,才设置’DC-bit’;
Hello报文中Option域不能识别的位应清空。
NBMA链路上的Hello报文发送与OSPFv2一致,可参见RFC2328 Section9.5.1。
3.2.1.2 发送DD报文
OSPFv3中,DD报文的发送与OSPFv2有如下差异:
l 扩展了Hello报文中的Option域,如下的一些位必须设置正确:
u 当且仅当路由器转发按照MOSPF转发多播报文时,才设置’MC-bit’;
u 当且仅当接口抑制Hello报文发送,才设置’DC-bit’;
DD报文中Option域不能识别的位应清空。
当路由器收到OSPF协议报文时,他用接收接口对报文进行标记。对于配置虚连接的接口,可能无法立即找到标识接口。在下面的描述中,我们都假设报文不是来自虚连接链路。
处理OSPFv3报文前,必须对封装OSPFv3报文的IPv6报文头做如下检验:
l 报文的目的IP地址必须是接收接口的单播地址,包括本地链路地址,或者是AllSPFRouters、AllDRouters的多播IP地址;
l 紧邻的IPv6头必须在Next Header域指明OSPF协议(89);
l 必须验证所有的IP验证头和IP封装安全载荷以保证OSPF路由交换的安全认证以及机密性;
l 本地产生的OSPF报文不送往OSPF:必须检查IPv6源地址,以确保没有路由器自己产生的多播报文。
在处理完IPv6报文头后,紧接着处理OSPF报文头。OSPFv3报文头的字段必须服从如下规则,否则报文将被丢弃:
l 类型域必须为3;
l 标准的IPv6 16位完整校验和必须通过校验,该校验和覆盖了整个OSPF报文和IPv6伪头;
l 区域ID必须通过校验:区域ID可以是如下的任一种情况,如果以下情况都不满足,应丢弃该OSPF报文:
u 是接收接口的区域ID。与IPv4不同,IPv6中源地址不必与接收接口地址处于统一网段;
u 为骨干区。这时,报文在虚连接上传送,接收路由器是ABR,报文中的源路由器Router ID是虚连接另一端的路由器Router ID。接收接口也配置在该虚连接中。通过以上检查后,路由器接收该报文并把该报文绑定到虚连接上。
l 实例ID必须与接收接口实例ID相同;
l 仅有DR或BDR接收目的IP地址为AllDRouters。
报文头处理完后,报文按照不同的OSPF报文类型来处理。
对Hello报文,送给Hello协议处理。其他报文则只在建立邻接的双方收发。这也意味着发送报文的路由器是active的邻居。
除了Hello报文外,其他报文的接收机制不变。
3.2.2.1 接收Hello报文
Hello报文的接收有如下变化:
l 在所有类型的链路上,邻居由他们的OSPF Router ID来唯一的标识。除了虚连接外,路由器用接收报文的源地址作为邻居的IP地址;
l 不含地址掩码;
l 选出的DR,BDR用他们的Router ID来标识。
OSPFv3的路由表项与OSPFv2相似:包含IPv6地址前缀表项,ASBR表项。后者只是建立路由表过程中的一个中间结果。
为了保持SPF运算中每个区域的中间结果,每个区域有各自的路由表,路由表包含的表项如下:
l 区域中的每个路由器:路由器由他们的Router ID来标识;这些路由表项包含到路由器的最短路径集,路由器用Intra-area-prefix-LSA发布自己产生的IP地址前缀时,会用到这些信息;对于ABR,这些信息也用于计算到区域内部地址前缀的路径。
l 区域中每个transit连接:Network-LSA用到了Transit连接。Transit连接和Network-LSA都是用链路上DR的接口ID和DR的Router ID的组合来标识的。这些路由表项使得intra-area-prefix-LSA可以得到Transit Link的IP地址前缀。
一些OSPF路由表的域保持不变:capabilities(Router only),path type,cost,type 2 cost,link state origin,到同一目的地的等价路由,下一跳,发布路由器。
在OSPFv3中,路由表每项中的link-state origin域是直接或间接产生该路由项的router-LSA或network-LSA。
路由表查找(即决定指导IP转发的最佳路由项)保持不变。
OSPFv3中,LSA头有少许的改变:LS类型域扩展了;Option字段放到了LSA中;一些LSA的格式变化了(router-LSA,network-LSA,ASE);一些LSA更名了(3类和4类路由分别更名为inter-area-prefix-LSA和inter-area-router-LSA);增加了两类LSA(Link-LSA和Intra-Area-prefix-LSA),如下图所示;LSA中去掉了Type of Service(TOS)字段。
1 | Router-LSA |
2 | Network-LSA |
3 | Summary-Network-LSA |
4 | Summary-ASBR |
5 | AS-External-LSA |
7 | NSSA-LSA |
1 | Router-LSA |
2 | Network-LSA |
3 | Inter-Area-Prefix-LSA |
4 | Inter-Area-Router-LSA |
5 | AS-external-LSA |
7 | NSSA-LSA |
8 | Link-LSA |
9 | Intra-Area-Prefix-LSA |
图8 OSPFv2与OSPFv3 LSA类型对照
下面将详细介绍这些变化。
在IPv4和IPv6中,OSPF LSA头都是20字节,但是20字节中的内容是不同的。其中,Advertising Router,LS Sequence Number,LS Checksum和length域不变,可参见RFC2328 Section12.1.1,12.1.5,12.1.6,12.1.7和A4.1。变化的域有:
Options:
LSA头中去掉了Option字段,在router-LSA,network-LSA,Inter-area-router-LSA和Link-LSA中加入了Option。Option字段从原来的8位扩展到24位,一些位的定义有了变化。另外,LSA中的每个前缀跟有一个单独的8位的PrefixOption域。
LS type:
该域从8位扩展到16位。前两位表示洪泛的范围,接下来的位表示对未知的LSA类型的处理。
Link State ID:
该字段长度保持32位不变,但是除了network-LSA和link-LSA外,其他LSA中的该值已经没有了地址意义。比如,一个支持IPv6的路由器在生成多个ASE时,可以给他们依次分配Link State ID:第一个分配0.0.0.1;第二个分配0.0.0.2等等。这时,Link State ID已不具备地址意义,只是为了区分单个路由器产生的多个LSA的一个标识。
对于network-LSA,Link State ID是DR在链路上的接口地址。当路由器产生link-LSA时,该LSA的Link State ID是该路由器在这个链路上的接口地址。
图9 OSPFv3 LSA Header
LS Type: 有9种类型, 其中6和7两种不属于基本类型
0x2001 Router-LSA
0x2002 Network-LSA
0x2003 Inter-Area-Prefix-LSA
0x2004 Inter-Area-Router-LSA
0x4005 AS-External-LSA
0x2006 Group-membership-LSA
0x2007 Type-7-LSA
0x0008 Link-LSA
0x2009 Intra-Area-Prefix-LSA
与OSPFv2一样,OSPFv3中,一条LSA是由它的LS类型,Link State ID和发布路由器三个字段的组合唯一确定的。对同一条LSA的两个实例而言,通过LSA的LS Sequence Number来判定哪一条是最近发布的。当出现一样的情况,使用LS checksum和LS age来做判定。可参见RFC2328 Section 13.8。
OSPFv3中,Link-State database被分割为3个独立的数据结构:
l AS洪泛范围的LSA放在顶层数据(top-level date structure)结构中,包括已知的ASE和’U-bit’置1的LSA;
l 区域洪泛范围的LSA放在appropriate area structure中,包括router-LSA,network-LSA,inter-area-prefix-LSA,inter-area-router-LSA和intra-area-prefix-LSA以及’U-bit’置1的LSA;
l 本地链路洪泛范围的LSA,包括link-LSA和’U-bit’置0的未知类型LSA。
重新生成LSA的过程不变:LSA的LS sequence number增加,LS age置0,重新计算checksum后加到链路状态数据库中,从特定的接口发布。
除了RFC2328 Section12.4中描述的触发重新生成LSA的事件外,OSPFv3增加了如下的触发事件/动作:
l 路由器的某个接口状态改变:这是路由器可能需要(重新)生成或发布它的Link-LSA和一条或多条router-LSA和/或intra-area-prefix-LSA;
l 链路的DR identity改变:路由器可能需要(重新)生成或发布该链路的network-LSA和一个或多个router-LSA和/或intra-area-prefix-LSA;
l 邻居状态迁移到’full’或从’full’迁移。路由器可能需要(重新)生成或发布该链路的network-LSA和一个或多个router-LSA和/或intra-area-prefix-LSA;
l 邻居的接口ID改变:路由器可能在相关区域内重新发布router-LSA,一条或条intra-area-prefix-LSA;
l 链路上增加了一个新的前缀或删除了一个前缀:这使得路由器重新发布该链路上的link-LSA,如果这台路由器是链路上唯一的一台设备,它会重新生成intra-area-prefix-LSA;
l 由于收到新的link-LSA而使得链路上的前缀集合改变:对于链路上的DR会生成一条新的intra-area-prefix-LSA。
下面的章节详细叙述了7类LSA的结构。
3.4.3.1 Router-LSA
----- 每个路由器生成,描述本路由器的链路状态和花费,只在路由器所处区域内传播
图10 Router-LSA格式
Type: 1--- PPP连接
2---Transit网络
3---保留
4---VLink
Options: 与Hello报文中的Options相同
3.4.3.2 Network-LSA
----- 广播网络和NBMA网络的DR生成,描述本网段链路状态,只在DR所处区域传播, 列出了DR所连接的所有Router ID。 Link-LSA和Network-LSA的 LS ID 与 Interface ID 相同。
图11 Network-LSA格式
Attached Router: DR所连接的Router ID
Options: 与Hello报文中的Options相同
3.4.3.3 Inter-Area-Prefix-LSA
----- 和OSPFv2中的Type-3 LSA(net sum_LSA)对应,该LSA由区域边界路由器ABR生成,在与该LSA相关的区域内传播。每一条Inter-Area-Prefix-LSA描述了一条到达本自治系统的、其他区域的IPv6地址前缀(IPv6 Address Prefix)路由。
图12 Inter-Area-Prefix-LSA格式
Metric: 这条路径的花费
PrefixLength: 前缀长度
PrefixOptions:
NU: No Unicast, 如果为1, 则不参与单播路由计算
LA: 为1, 表示这个前缀为产生LSA的路由器的接口地址
MC: 是否多播
P: NSSA区域前缀被ABR重新公布时设为1
3.4.3.4 Inter-Area-Router-LSA
----- 和OSPFv2中的Type-4 LSA(asbr sum_LSA)对应,该LSA由区域边界路由器ABR生成,在与该LSA相关的区域内传播。每一条Inter-Area-Router-LSA描述了一条到达本自治系统的、其他区域的去往边界路由器ASBR的路由。
图13 Inter-Area-Router-LSA格式
Options: 与Hello报文中的Options相同
Metric: 到其他区域的路由器的花费
Destination Router ID: 目标路由器的Router ID
3.4.3.5 AS-external-LSA
----- 由自治系统边界路由器ASBR生成,描述到达其它AS的路由,传播到整个AS(Stub区域除外)。AS的缺省路由也可以用AS-external-LSAs来描述。
图14 AS-External-LSA格式
E: 为1时, 表明为Metric为第2类外部路由的花费
F: 为1时, LSA里带转发地址(Forwarding Address)
Forwarding Address: 转发地址, 数据流将经过这个地址
T: 为1时, LSA里带外部路由标记(External Route Tag)
External Route Tag: 外部路由标记, 用于ASBR间交流
Referenced LS type: 非0时, LSA带Referenced Link State ID
Referenced Link State ID: 所引用的LS ID, 用于ASBR间交流
3.4.3.6 Link-LSA
----- 路由器为每一条链路生成一个Link-LSA,在本地链路范围内传播。每一个Link-LSA描述了该链路上所联系的IPv6地址前缀,包含Link-local地址。
1) 向链路上其他路由器发布自己的Link-local地址
2) 发布这条链路上的IPv6前缀
(注: Link-LSA的LS ID与发布此LSA的路由器的Interface ID相同, Network-LSA也是如此)
图15 Link-LSA格式
各个域的意义同上
3.4.3.7 Intra-Area-Prefix-LSA
----- 每个Intra-Area-Prefix-LSA包含路由器上的IPv6前缀信息,stub网段信息或传输网段(Transit network)的网段信息,该LSA在区域内传播, 发布区域内的前缀。由于Router-LSA和Network-LSA不再包含地址信息,导致了Intra-Area-Prefix-LSAs的引入。
图16 Intra-Area-LSA格式
# prefixes: 本条LSA包含的前缀数目
Referenced LS type, Referenced Link State ID, Referenced Advertising Router:
这3个参数表明引用的是哪条router-LSA 或 network-LSA,以及产生这条LSA的路由器。报文中的地址前缀信息即为相应路由器或网段/链路的地址前缀。
其余各个域的意义同上。
大多数的OSPFv2中的洪泛机制保持不变,可参见RFC2328 Section13。完全继承的部分有:
l 判定更新的LSA实例,参见RFC2328 Section13.1;
l 对自己产生的LSA的处理,RFC2328 Section13.4;
l 发送LSAck报文,RFC2328 Section13.5;
l LSA的重传,RFC2328 Section13.6;
l LSAck的接收,RFC2328 Section13.7。
洪泛范围的修改和对未知LS类型的报文处理使得洪泛机制有了变化:LSU的收发必须考虑LSA的洪泛范围和’U-bit’设置;另外,由于IPv6中对LSA的类型和内容进行重组,在数据库中加入一条LSA也会触发不同的事件,下面对这些内容进行详细描述。
LSU的接收与以前不同,这些变化是因为在LS type中包含了洪泛范围,以及处理未知LS类型报文的需要。在IPv4中,要检验LSU中的每一条LSA,检验的8个步骤详见RFC2328 Section 13。在OSPFv3中,步骤2和3有如下修改:
(2)检验LS type。丢弃下列LSA,转而处理LSU中的下一条:
Ø 未知LS类型;
Ø 在Stub区中收到洪泛范围为AS flooding scope或’U-bit’置1的LSA;
(3)LSA的洪泛范围置为’reserved’。丢弃该LSA,转而处理LSU中的下一条。
步骤5b和5d也做了修改,见3.5.2和3.5.3。
发送LSU的步骤不变,可参见RFC2328 Section 13.3。在OSPFv3中,洪泛LSA的合法接口不同了,接口的选择基于以下因素:
l LSA的洪泛范围;
l 对于洪泛范围为区域或本地链路的LSA,LSA与之关联的区域或接口;
l 是否能够识别该LSA的LS类型;
l ‘U-bit’设置:
Ø 为0:未识别LS类型的LSA洪泛范围为本地链路范围;
Ø 为1:未识别LS类型的LSA被当作已知LS类型的LSA接收和洪泛;
因此,合法接口的选择有以下三种情况:
情况1:LSA的LS类型已知
此时,合法接口集取决于LS type中的洪泛范围。
对洪泛范围为’AS-flooding-scope’的LSA,合法接口集合包括除虚连接外的所有路由器接口,此外,ASE不从连接到Stub区域的接口发送。
对洪泛范围为’area flooding scope’的LSA,合法接口集合包括连接到该区域的所有接口。
对洪泛范围为’link-local flooding scope’的LSA,合法接口只包含一个接口,就是路由器连接到这条链路上的接口,该接口也是收到这条LSA的接口。
情况2:未知LS类型且’U-bit’置0
认为该LSA洪泛范围为本地链路范围。合法接口只包含一个接口,就是路由器连接到这条链路上的接口。
情况3:未知LS类型且’U-bit’置1
这时,合法接口的选择与情况1类似,要排除连接到Stub区域的接口。
有时候,在将一条LSA加入指定邻居的链路状态重传列表时,还需要其他条件。如果路由器能识别LS Type而他的邻居不能(可以从邻居发出的DD报文的Option字段判定),并且此时LSA的’U-bit’置为0,当且仅当邻居是DR或BDR时,将该LSA加入邻居链路数据库重传队列。除了group-membership-LSA外,我们假定前面提到的9类LSA都能被所有的路由器识别。对于group-membership-LSA,只有MOSPF路由器才能识别,它的’U-bit’是置0的。仅当一个non-MOSPF邻居路由器是DR或BDR时,该邻居才转发这类LSA。
由于数据库被分为独立的三个部分,添加LSA也相应的分为三种情况:
l 已知LS type或’U-bit’置1的自治系统洪泛范围的LSA被加入global OSPF数据结构中;
l 已知LS type或’U-bit’置1的区域洪泛范围的LSA被加入appropriate area数据结构中;
l 未知LS type且’U-bit’置0的LSA和本地链路洪泛范围的LSA被加入appropriate interface数据结构中。
在向链路状态数据库中加入LSA时,必须检查LSA的内容是否改变。当LSA的内容改变时,根据LSA类型的不同,路由表的如下部分必须重新进行计算:
l Router-LSA,Network-LSA,Intra-Area-Prefix-LSA和Link-LSA:整个路由表需要重新计算;
l Inter-Area-Prefix-LSA和Inter-Area-Router-LSA:通过这些LSA得到的到达目的的最优路由必须重新计算。当目的地是ASBR时,所有的ASE可能也需要重新计算;
l AS-external-LSA:通过这些LSA得到的到达目的地的最优路由必须重新计算。
当得到一条LSA的新的实例时,该LSA的旧的实例必须从数据库中清除,同时所有邻居的重传请求队列中也应该去掉该LSA。
OSPFv3中,对自己产生的LSA的描述简化了:自己产生的LSA就是那些Advertising Router与自己的Router ID一致的LSA。
除了以下情况外,OSPFv3对虚连接的定义不变:
l 具有自治系统传播范围的LSA决不向虚连接邻居传播,也不在数据库交换的过程中将这样的LSA聚合起来传给虚连接邻居。
l 接口范围必须是站点本地或全球范围地址,而不是被其他接口类型使用的本地链路地址。站点本地或全球范围地址才能用于虚连接的协议报文源地址;
l 为了在路由计算时得到虚连接邻居的IPv6地址,邻居在Intra-Area-Prefix-LSA中向虚连接传播区域发布他的虚连接IPv6接口地址;
l 虚连接被分配唯一的接口ID。这个ID用于虚连接上Hello报文的发布和router-LSA的发布。
路由表计算过程中,OSPFv3和OSPFv2的区别有:
l Router-LSA不发布前缀信息,改由intra-area-prefix-LSA发布。因此,在Stub区将对intra-area-prefix-LSA发布的前缀做检查;
l 3类和4类LSA更名为inter-area-prefix-LSA和inter-area-router-LSA;
l 地址信息不在link state ID中,在LSA体中;
l 路由器在当区域中可以生成多条router-LSA,多条router-LSA之间用link state ID区分。在SPF运算中,这些router-LSA必须被当作一个整体;
路由表变化触发的事件以及等价路由保持不变。
OSPFv3中对inter-area路由的计算有如下变化:
l 3类和4类LSA分别更名为:inter-area-prefix-LSA和inter-area-router-LSA;
l 地址前缀信息放在inter-area-prefix-LSA体中,不再放在link sate ID中;路由器的OSPFRouter ID 放在inter-area-router-LSA体中;
l Prefix Options中设置了’NU-bit’的前缀应被inter-area路由计算忽略;
当单个inter-area-prefix-LSA或inter-area-router-LSA改变时,运用RFC2328 Section16.5的机制,而不是重新计算整个路由表。
OSPFv3对这部分的修改参加Section3.8.3中对inter-area路由的部分。
ASE的计算有如下修改:
l ASE的link state ID不再是网段信息。地址前缀信息被放在ASE体中;
l 默认路由由ASE发布,其中的前缀长度为0;
l 不通过forwarding address是否置0.0.0.0判断是否使用了forwarding address,判断external-LSA的F位。当且仅当设置了F位时,使用了forwarding address;
l 区域内的路由计算应该忽略设置了Prefix Options域’NU-bit’的前缀;
当单个ASE改变时,可以不对整个路由表进行重新计算。
在OSPFv3中,路由器可能有多个接口连接到单个链路上,所有的接口都收发数据报文,但只有一个接口收发OSPF控制信息,具体实现如下:
l 每个接口都有各自不同的接口ID。这样一来,路由器可以自动检测到何时多个接口连接到同一个链路上:当收到的Hello报文来自它本身的Router ID,但是接口ID不是接收接口的ID时;
l 对单个链路OSPF关掉其他接口的OSPF控制报文收发功能,只留下该链路上的一个接口。对这个接口的选择取决于实现。例如,选择接口ID最大的接口。如果路由器是DR,那么这个接口的ID也是network-LSA的link state ID;
l 单个链路上的多个接口都将出现在router-LSA中,每个接口也都将产生link-LSA。因此,单个链路上的多个接口都将参与到SPF运算中;
l 如果选出的收发控制报文的接口失败,另一个接口将接替他的工作,从新建立邻接关系。通过其他接口停止收到该接口发出的hello报文,路由器可以侦测到接口失败。