注:本文为 “LSA” 相关文章合辑。
未整理去重,图片清晰度限于引文原状。
第三篇 9.3-9.7 小节作者长时间停更。
OSPFv3 简介
OSPFv3 是基于 IPv6 的 OSPF 协议,它工作在 IPv6 上,类似于 MP-BGP,可支持多协议,如 IPv4 及 IPv6。华为目前的 OSPFv3 实现仅支持 IPv6。IETF RFC 5340 及 5838 定义了 OSPFv3 对多协议的支持。
OSPFv3 在 OSPFv2 基础上进行了改进,是一个独立的路由协议。在华为设备上,如果要支持 IPv4 和 IPv6,需要同时配置 OSPFv2 及 OSPFv3 两个路由进程。
OSPFv3 设计时基于 OSPFv2,但又区别于 OSPFv2,其改进了 OSPFv2 协议的缺点,增强了协议的扩展性及灵活性。以下从 OSPFv3 和 OSPFv2 对比的角度对 OSPFv3 加以阐述。
OSPFv3 与 OSPFv2 的相同点
OSPFv3 基于 OSPFv2,所以有很多相同点:
-
网络类型和接口类型;
-
接口状态机和邻居状态机;
-
链路状态数据库(LSDB);
-
洪泛机制;
-
相同类型的报文:Hello 报文、DD 报文、LSR 报文、LSU 报文和 LSAck 报文;
-
算法及路由计算过程。
OSPFv3 与 OSPFv2 的不同点
OSPFv3 工作在 IPv6 上,而 OSPFv2 工作在 IPv4 上,其他细节如下。
1. OSPFv3 基于链路,而不是网段
OSPFv3 运行在 IPv6 协议上,IPv6 是基于链路而不是网段的,即不论接口是否配置 ULA(Unique Local Address)/GUA(Global Unicast Address)的地址,也不论路由器间接口地址是否在同一个网段,只要彼此接在同一个链路上,即可建立 OSPF 邻居关系。
2. OSPFv3 利用 IPv6 链路本地地址
OSPFv3 使用链路本地地址(link-local)来维持邻居,同步 LSDB。链路上的报文,除 Vlink 外的所有 OSPFv3 接口都使用链路本地地址作为报文源地址。
这样的好处是:
- 不需要配置 IPv6 全局地址,就可以得到 OSPFv3 拓扑,实现拓扑与地址分离;
- 在链路本地地址上泛洪的报文不会传到其他链路上,可减少报文不必要的泛洪。
说明:
- IPv6 的链路本地(link-local)地址用于在同一链路上发现邻居及自动配置等;
- 运行 IPv6 的路由器不转发目的地址为链路本地地址的 IPv6 报文,此类报文只在本地链路有效;
- 链路本地单播地址的前缀是 FE80::/10。
3. OSPFv3 协议报文上移除了“协议地址,即 IPv4 地址”的语义
OSPFv2 的 LSA1/LSA2 中含有太多和 IPv4 协议地址相关的信息,如 LSA1 中的任何一种类型的 Link(除 StubNet 外),其 Link Data 是设备本地接口的 IPv4 地址,Link ID 是 DR 的接口 IP 或邻居的 RID 等。
通过观察 LSA1/LSA2 的内容就可知 OSPF 传递的 IPv4 协议。如果 IPv6 OSPFv3 依然使用这种方式,IPv6 协议地址会占用 LSA 中过多字节空间,若将来扩展 OSPFv3 使其支持新的协议地址,也需要重新改写协议报文,所以 OSPFv3 在设计现有的协议报文时,从 LSA 中“移除”对协议地址的依赖性。
可知 OSPFv3 LSA1/2 中用于表述拓扑时,用二元组[RID,接口 ID]来取代 OSPFv2 中针对对方节点的表示,用接口 ID 来取代本地接口的 IP 地址;LSA1/2 中没有使用任何协议地址,这样做的结果是 LSA1/2 中“拓扑与协议地址分离了”,不再依赖于协议地址,LSA1/LSA2 描述的拓扑可以为任何协议簇服务,RFC 5838 已经设计 OSPFv3 成为可支持 IPv4 及 IPv6 等协议的路由协议,不需要为每个协议单独创建协议进程,但目前华为尚不支持。
在 IPv4 和 IPv6 双栈的环境中仍需同时运行 OSPFv2 和 OSPFv3 的双进程。例外是 OSPFv3 的 Vlink 场景,非直连的邻居需要靠 Global Unicast 地址来标识。IPv6 全局地址仅出现在 Vlink 接口及报文的转发的场合。
4. 链路间的泛洪范围(LSA8)
OSPFv3 添加了链路间的泛洪范围,新的 LSA8(Link LSA)类型仅可以在邻居之间通告,其 LSA 不会被泛洪到其他链路。LSA8 所承载的内容仅在直连的邻居之间有用,用于通告该 link 上的前缀及 link-local 地址。
5. OSPFv3 支持一个链路上多个进程
OSPFv3 在 OSPF 报文头添加了一个新的字域:Instance ID,它是定义在接口的标识 OSPF 实例的 0~255 的数。OSPFv2 下,一个接口上只能有一个 OSPF 实例运行,现在可以让一个接口同时运行多个 OSPF 实例,彼此使用不同的 Instance ID 区分。这些运行在同一条物理链路上的多个 OSPFv3 实例分别与同链路上多个相同实例 ID 的邻居建立邻居关系,这可使一个网段上同时出现多个 OSPF 路由域,彼此互不干扰,可以充分共享同一链路资源。
如果 OSPFv3 报文收到实例号不同的 Hello 报文,则忽略,邻居关系建立不起来。实例号出现在 OSPFv3 头中,通过定义不同的值实现 OSPF 实例隔离。
6. OSPFv3 移除所有认证字段
OSPFv3 移除 OSPFv2 的接口或区域下的验证,原因是 OSPFv3 可直接使用 IPv6 扩展报文头的认证及安全机制,不需要再重复提供认证,使用协议时只需关注协议本身即可,降低协议的复杂性。
7. OSPFv3 只通过 Router ID 来标识邻居
OSPFv3 只通过 Router ID 来标识邻居,这样即使没有配置 IPv6 全局地址,或是 IPv6 全局地址配置都不在同一网段,OSPFv3 的邻居仍可以建立起来。OSPFv3 中 Router ID 和 OSPFv2 中一样,是 32 位的数,在 OSPFv3 中,可手动为 OSPFv3 路由器设置 Router ID。
8. 新增两种 LSA
Link LSA:用于宣告链路上的 Link-local 地址及 IPv6 Prefix 地址,其仅在本地链路上泛洪。
Intra Area Prefix LSA:用于向其他路由器宣告本路由器或本网络(广播网及 NBMA)的 IPv6 全局地址信息,在区域内泛洪。
OSPFv3 中 LSA 的定义
类型分类
表 列出新的 LSA 及其对应类型,OSPFv3 添加新的类型 Link LSA 和 Intra Area Prefix LSA。
OSPFv3 与 OSPFv2 LSA 对比
OSPFv3 LSAs Type | Name | OSPFv2 LSAs Type | Name |
---|---|---|---|
0x2001 | Router LSA | 1 | Router LSA |
0x2002 | Network LSA | 2 | Network LSA |
0x2003 | Inter-Area Prefix LSA | 3 | Network Summary LSA |
0x2004 | Inter-Area Prefix LSA | 4 | ASBR Summary LSA |
0x4005 | AS-External LSA | 5 | AS-External LSA |
0x2006 | Group Membership LSA | 6 | Group Membership LSA |
0x2007 | Type-7 LSA | 7 | NSSA External LSA |
0x2008 | Link LSA | 8 | No Corresponding LSA |
0x2009 | Intra-Area Prefix LSA | 9 | No Corresponding LSA |
泛洪范围
OSPFv3 LSA 头中没有 Options 字域,Link State Type 是 16 位字域,不同于 OSPFv2 的 8 位字域,OSPFv3 对 LinkStateType 的高 3 位做了定义,代表泛洪范围。
- U 位:U 代表如果路由器并不识别该 LSA 的时候该怎么做。如果 U 位没有置位,对未知的 LSA 仅在直连链路间泛洪。如果 U 位置位,对未知的 LSA 像已知的 LSA 一样,存储并泛洪,默认为 0。
-
S2 和 S1 位:S2 和 S1 组合定义了 LSA 的泛洪范围,上表中,高 4 位所确定的数值 0x0 代表 Link-local 范围,0x2 代表区域内泛洪,0x4 代表整个路由域泛洪,其 Link-local 泛洪范围是 OSPFv3 新添加的一类范围。
S2、SI 定义的泛洪范围
S2 | S1 | Flooding Scope |
---|---|---|
0 | 0 | Link-Local |
0 | 1 | Area |
1 | 0 | AS(Routing Domain) |
1 | 1 | Reserved |
- 其他位的 LSA function code,不同数值代表不同类型的 LSA。