【IT168 专稿】OSPF路由协议是链路状态型路由协议,这里的链路即设备上的接口。链路状态型路由协议基于连接源和目标设备的链路状态作出路由的决定。链路状态是接口及其与邻接网络设备的的关系的描述,接口的信息即链路的信息,也就是链路的状态(信息)。这些信息包括接口的IPv6前缀(prefix)、网络掩码、接口连接的网络(链路)类型、与该接口在同一网络(链路)上的路由器等信息。这些链路状态信息由不同类型的LSA携带,在网络上传播。
路由器把收集到的LSA存储在链路状态数据库中,然后运行SPF算法计算出路由表。链路状态数据库和路由表的本质不同在于:数据库中包含的是完整的链路状态原始数据,而路由表中列出的是到达所有已知目标网络的最短路径的列表。
OSPF协议是为IP协议提供路由功能的路由协议。OSPFv2(OSPF版本2)是支持IPv4的路由协议,为了让OSPF协议支持IPv6,技术人员开发了OSPFv3(OSPF版本3),OSPFv3由RFC2740定义。
OSPFv3与OSPFv2
数据包结构
IPv6 使用的LSA类型
配置OSPFv3
NBMA配置示例
配置OSPFv3认证
OSPFv3与OSPFv2
无论是OSPFv2还是OSPFv3,OSPF协议的基本运行原理是没有区别的,然而,由于IPv4和IPv6协议意义的不同,地址空间大小的不同,它们之间的不同之处也是必然存在的。
相似之处
(1)路由器类型相同。包括内部路由器(internal router)、骨干路由器(backbone router)、区域边界路由器(area border router)和自治系统边界路由器(autonomous system boundary router)。
(2)支持的区域类型相同。包括骨干区域、标准区域、末节区域、NSSA和完全末节区域。
(3)都使用SPF算法。
(4)DR和BDR的选举过程相同。
(5)接口类型相同。包括点到点链路、点到多点链路、BMA链路、NBMA链路和虚拟链路。
(6)LSA的传播和老化机制相同。
(7)虽然OSPFv3的数据包携带地址空间更大的IPv6地址,但大多数数据包都兼容OSPFv2。
(8)基本数据包类型相同,都使用Hello、DBD、LSR、LSU和LSA。
(9)邻居的发现和邻居关系的建立机制相同。
(10)度量值的计算方法相同,都使用链路开销。
不同之处
(1)术语。大多数用在OSPFv2中的术语都可以用来描述OSPFv3中相同的概念。但其中有一个术语在OSPFv2中和在OSPFv3中具有不同的含义。在OSPFv3中,用"链路(link)"取代了OSPFv2中的"网络(network)"或"子网(subnet)"的概念。"接口"与"链路"相连。一条"链路"可以有多个IP地址,如果两个接点与同一个链路相连,即使它们不在同一个IP子网(IPv6前缀)上,也能够通过该"链路"直接通话。
(2)OSPFv3进程运行在链路上,而不象OSPFv2进程那样运行在子网上。
(3)一条链路上可以运行多个OSPF实例(instance)。例如,可以使用两个实例让一条链路运行在两个区域内。
(4)IPv6地址信息仅在LSU的载荷(payload)中携带。
(5) 路由器ID、区域ID和LSA链路状态ID值仍然使用32比特表达,因此不能使用IPv6地址表示。
(6) OSPFv3总是使用路由器ID来确认邻接路由器的身份。而OSPFv2在NBMA和BMA网络中,使用路由器IP地址确认邻接路由器的身份;在点到点网络和虚链路上使用路由器ID确认邻接路由器身份。
(7)LSA的传播范围(flooding scope)定义为如下3种:
本链路范围(link-local scope)-- LSA仅在本链路范围内传播。
区域范围(area scope)-- LSA仅在一个区域内传播。
AS范围(AS scope)-- LSA在整个AS内传播。
(8)使用本链路地址(link-local address)发现邻居和完成自动配置等工作。IPv6路由器并不转发源地址是本链路地址的数据包。OSPFv3认为每台路由器已经为它相接的每个物理网段(物理链路)分配了本链路地址。
(9)认证方式不同。运行OSPFv3的路由器使用IPsec认证。因此在OSPFv3的报文头中不包含认证信息(参见4.2小节)。
(10)数据包结构不同(参见4.2小节)。
(11)LSA类型不同(参见4.4小节)。
(12)LSA结构不同(参见RFC2740)。
(13)一个接口可以配置多个IPv6地址前缀,缺省地,这些前缀都被注入到OSPFv3中,不能人为地选择哪些前缀被注入,哪些前缀不被注入。
(14)如果路由器的接口上设置了IPv4地址,或者设置了环回接口,OSPFv3则自动选择IPv4地址作为路由器ID,否则需要为路由器设置ID号。
数据包结构
OSPFv3协议直接运行在IPv6上,因此,OSPFv3的数据由IPv6报文携带。在IPv6报文头的'下一个报文头'字段中,用协议号89代表该数据包中携带的是OSPFv3的数据。
IPv6的报头结构如图4-1所示,各字段的含义如下:
Version(版本号):参数值为6,代表IPv6报头,4比特长。
Priority(优先级):4比特长。发送方可以使用该值为其发出的数据赋予优先级。
Flow label(流标签):发送放可以用它标志属于同一个流的数据。
Payload length(载荷长度):表示报头后面携带的有效数据长度。
Next header(下一个报头):表示IPv6报头后面的报头类型。89代表OSPF协议。
Hops(跳数限制):表示报文所能经由的最大路由器数。
Source address(源地址):发送数据方地址。
Destination address(目的地地址):接收数据方地址。
图 4-1 IPv6报头格式
紧跟着IPv6报文头的后面是OSPFv3的报文头,其格式如图4-2所示。
图 4-2 OSPFv3报文头
其中:
Version# -- 代表OSPF的版本号,其值为3。
Type -- 代表OSPF数据报类型。OSPF数据报的类型包括:
Hello包,类型代码为1。
DDP,类型代码为2。
LSR,类型代码为3。
LSU,类型代码为4。
LSAck,类型代码为5。
Packet length -- 以字节为单位的OSPF数据报的长度,包含报头部分。
Router ID -- 发送该数据包的路由器ID号。
Area ID -- 该数据报所属的区域。
Checksum -- 整个OSPF数据报的校验和。
Instance ID -- 实例标志号。
OSPFv3报头的最后8比特保留,值总为0。
Hello 数据包
OSPFv3使用两个组播地址发送各种数据包。一个是FF02::5,代表所有运行OSPF协议的路由器都应该处理的数据包;另一个是FF02::6,代表DR和BDR路由器应该处理的数据包。
Hello数据包使用的地址是FF02::5。Hello数据包定期在所有运行了OSPF的接口上发送,用来建立和维护邻居关系。连接在同一条链路上的路由器必须对某些参数协商一致才能形成邻居关系。这些参数包含在Hello数据包中。Hello数据包中也包含用来选举DR/BDR的参数。Hello数据包的结构如图4-3所示。
图 4-3 Hello 数据包结构
Hello数据包中个字段的含义如下:
Interface ID -- 接口标志符。路由器的每一个接口都有一个唯一的标志符。
Router priority -- 路由器优先级。路由器根据该值选举DR/BDR。
Options -- 该24比特字段出现在Hello包、DDP和某些LSA中,OSPF路由器使用该字段实现某些与其他路由器通信的能力(详见RFC2740)。
Hello interval -- 发送Hello包的周期时间。
Router dead interval -- 邻居路由器认为该路由器的失效时间。
Designated router ID -- DR路由器的ID。
Backup designated router ID -- BDR路由器的ID。
Neighbors ID -- 邻居列表。每个邻居ID占4字节。