Skip to main content

2. Differences from OSPF for IPv4 (与 IPv4 的 OSPF 的差异)

IPv4 的 OSPF [OSPFV2] 中的大多数算法已在 IPv6 的 OSPF 中保留. 然而, 由于 IPv4 和 IPv6 之间的协议语义变化, 或者仅仅为了处理 IPv6 增加的地址大小, 一些更改是必要的.

以下小节描述了本文档与 [OSPFV2] 之间的差异.

IPv6 使用术语 "链路 (Link)" 来表示 "节点可以在链路层进行通信的通信设施或介质" ([IPV6]). "接口 (Interfaces)" 连接到链路. 多个 IPv6 子网可以分配给单个链路, 并且两个节点可以直接通过单个链路通信, 即使它们不共享公共的 IPv6 子网 (IPv6 前缀 (IPv6 Prefix)).

因此, IPv6 的 OSPF 基于每个链路运行, 而不是 IPv4 的基于每个 IP 子网的行为. IPv4 OSPF 规范 ([OSPFV2]) 中使用的术语 "网络 (Network)" 和 "子网 (Subnet)" 通常应被链路替换. 同样, OSPF 接口现在连接到链路而不是 IP 子网.

此更改影响 OSPF 协议数据包的接收、Hello 数据包的内容以及网络-LSA 的内容.

2.2. Removal of Addressing Semantics (移除地址语义)

在 IPv6 的 OSPF 中, 地址语义已从 OSPF 协议数据包和主要 LSA 类型中移除, 留下了一个与网络协议无关的核心. 具体而言:

  • IPv6 地址不存在于 OSPF 数据包中, 除非在链路状态更新数据包 (Link State Update Packets) 携带的 LSA 有效载荷中. 详情请参见第 2.7 节.

  • 路由器-LSA (Router-LSAs) 和网络-LSA (Network-LSAs) 不再包含网络地址, 而只是表达拓扑信息. 详情请参见第 2.8 节.

  • OSPF 路由器 ID (Router IDs)、区域 ID (Area IDs) 和 LSA 链路状态 ID (Link State IDs) 保持为 IPv4 的 32 位大小. 它们不能再被分配为 (IPv6) 地址.

  • 相邻路由器现在始终通过路由器 ID 进行识别. 以前, 它们在广播 (Broadcast)、NBMA (非广播多路访问, Non-Broadcast Multi-Access) 和点到多点 (Point-to-Multipoint) 链路上通过 IPv4 地址进行识别.

2.3. Addition of Flooding Scope (添加泛洪范围)

LSA 的泛洪范围 (Flooding Scope) 已被泛化, 并且现在在 LSA 的 LS 类型字段 (LS Type Field) 中明确编码. 现在 LSA 有三个独立的泛洪范围:

  • 链路本地范围 (Link-local Scope). LSA 仅在本地链路上泛洪, 不会进一步传播. 用于新的链路-LSA (Link-LSA). 详情请参见第 4.4.3.8 节.

  • 区域范围 (Area Scope). LSA 仅在单个 OSPF 区域内泛洪. 用于路由器-LSA、网络-LSA、区域间前缀-LSA (Inter-Area-Prefix-LSAs)、区域间路由器-LSA (Inter-Area-Router-LSAs) 和区域内前缀-LSA (Intra-Area-Prefix-LSAs).

  • AS 范围 (AS Scope). LSA 在整个路由域中泛洪. 用于 AS 外部-LSA (AS-External-LSAs). 发起 AS 范围 LSA 的路由器被视为 AS 边界路由器 (AS Boundary Router, ASBR), 并将在常规区域的路由器-LSA 中设置其 E 位 (E-bit).

OSPF 现在支持在单个链路上运行多个 OSPF 协议实例的能力. 例如, 这可能在多个提供商之间共享的 NAP (网络接入点, Network Access Point) 段上是必需的. 提供商可能支持希望保持独立的独立 OSPF 路由域, 即使它们有一个或多个公共的物理网络段 (即链路). 在 IPv4 的 OSPF 中, 这是通过 IPv4 的 OSPF 头中的认证字段以一种杂乱的方式支持的.

运行多个 OSPF 实例的另一个用途是, 如果出于某种原因, 您希望让单个链路属于两个或更多 OSPF 区域.

通过 OSPF 数据包头和 OSPF 接口数据结构中包含的 "实例 ID (Instance ID)" 来实现对链路上多个协议实例的支持. 实例 ID 仅影响 OSPF 数据包的接收, 并适用于普通 OSPF 接口和虚拟链路 (Virtual Links).

IPv6 链路本地地址 (Link-Local Addresses) 用于单个链路, 用于邻居发现 (Neighbor Discovery)、自动配置 (Auto-Configuration) 等目的. IPv6 路由器不转发具有链路本地源地址的 IPv6 数据报 [IP6ADDR]. 链路本地单播地址 (Link-Local Unicast Addresses) 从 IPv6 地址范围 FE80/10 中分配.

IPv6 的 OSPF 假设每个路由器在其每个附加的物理链路上都分配了链路本地单播地址 [IP6ADDR]. 在除虚拟链路之外的所有 OSPF 接口上, OSPF 数据包使用接口关联的链路本地单播地址作为源地址发送. 路由器学习所有其他附加到其链路的路由器的链路本地地址, 并在数据包转发期间使用这些地址作为下一跳信息.

在虚拟链路上, 必须 (MUST) 使用全局范围 (Global Scope) IPv6 地址作为 OSPF 协议数据包的源地址.

链路本地地址出现在 OSPF 链路-LSA 中 (参见第 4.4.3.8 节). 然而, 链路本地地址不允许出现在其他 OSPF LSA 类型中. 特别是, 链路本地地址禁止 (MUST NOT) 在区域间前缀-LSA (第 4.4.3.4 节)、AS 外部-LSA (第 4.4.3.6 节)、NSSA-LSA (第 4.4.3.7 节) 或区域内前缀-LSA (第 4.4.3.9 节) 中通告.

2.6. Authentication Changes (认证更改)

在 IPv6 的 OSPF 中, 认证已从 OSPF 协议中移除. "AuType" 和 "Authentication" 字段已从 OSPF 数据包头中移除, 所有与认证相关的字段已从 OSPF 区域和接口数据结构中移除.

当在 IPv6 上运行时, OSPF 依赖于 IP 认证头 (IP Authentication Header, 参见 [IPAUTH]) 和 IP 封装安全有效载荷 (IP Encapsulating Security Payload, 参见 [IPESP]), 如 [OSPFV3-AUTH] 中所述, 以确保路由交换的完整性和认证/机密性.

通过标准 IPv6 上层校验和 (IPv6 Upper-Layer Checksum, 如 [IPV6] 第 8.1 节所述) 提供对 OSPF 数据包交换的意外数据损坏的保护, 该校验和覆盖整个 OSPF 数据包和前置的 IPv6 伪头 (IPv6 Pseudo-Header, 参见附录 A.3.1).

2.7. Packet Format Changes (数据包格式更改)

IPv6 的 OSPF 直接在 IPv6 上运行. 除此之外, 所有地址语义已从 OSPF 数据包头中移除, 使其本质上是 "与网络协议无关的 (Network-Protocol-Independent)". 所有地址信息现在仅包含在各种 LSA 类型中.

详细来说, OSPF 数据包格式的更改包括以下内容:

  • OSPF 版本号已从 2 增加到 3.

  • Hello 数据包和数据库描述数据包 (Database Description Packets) 中的选项字段 (Options Field) 已扩展为 24 位.

  • 认证 (Authentication) 和 AuType 字段已从 OSPF 数据包头中移除 (参见第 2.6 节).

  • Hello 数据包现在完全不包含任何地址信息. 相反, 它现在包含一个接口 ID (Interface ID), 发起路由器已分配该 ID 以唯一标识 (在其自己的接口中) 其到链路的接口. 如果路由器成为链路上的指定路由器 (Designated Router), 此接口 ID 将用作网络-LSA 的链路状态 ID.

  • 两个选项位, "R 位 (R-bit)" 和 "V6 位 (V6-bit)", 已添加到选项字段中, 用于在 SPF 计算期间处理路由器-LSA (参见附录 A.2). 如果 "R 位" 清零, OSPF 发言者可以参与 OSPF 拓扑分发而不被用于转发中转流量; 这可以用于希望参与路由协议的多宿主主机 (Multi-Homed Hosts). V6 位专门化了 R 位; 如果 V6 位清零, OSPF 发言者可以参与 OSPF 拓扑分发而不被用于转发 IPv6 数据报. 如果 R 位设置且 V6 位清零, 则不转发 IPv6 数据报, 但可以转发属于另一个协议族的数据报.

  • OSPF 数据包头现在包含一个 "实例 ID (Instance ID)", 允许在单个链路上运行多个 OSPF 协议实例 (参见第 2.4 节).

2.8. LSA Format Changes (LSA 格式更改)

所有地址语义已从 LSA 头、路由器-LSA 和网络-LSA 中移除. 这两个 LSA 现在以与网络协议无关的方式描述路由域的拓扑. 添加了新的 LSA 来分发 IPv6 地址信息和下一跳解析所需的数据. IPv4 的一些 LSA 的名称已更改, 以使彼此更加一致.

详细来说, LSA 格式的更改包括以下内容:

  • 选项字段已从 LSA 头中移除, 扩展为 24 位, 并移至路由器-LSA、网络-LSA、区域间路由器-LSA 和链路-LSA 的主体中. 详情请参见附录 A.2.

  • LSA 类型字段已扩展 (到以前的选项空间) 为 16 位, 上三位编码泛洪范围和未知 LSA 类型的处理 (参见第 2.9 节).

  • LSA 中的地址现在表示为 [前缀 (Prefix), 前缀长度 (Prefix Length)] 而不是 [地址 (Address), 掩码 (Mask)] (参见附录 A.4.1). 默认路由表示为长度为 0 的前缀.

  • 路由器-LSA 和网络-LSA 现在没有地址信息, 并且与网络协议无关.

  • 路由器接口信息可以 (MAY) 分布在多个路由器-LSA 中. 接收者在运行 SPF 计算时必须 (MUST) 连接给定路由器发起的所有路由器-LSA.

  • 引入了一个称为链路-LSA 的新 LSA. 链路-LSA 具有链路本地泛洪范围; 它们永远不会泛洪到与其关联的链路之外. 链路-LSA 有三个目的: 1) 它们向所有其他附加到链路的路由器提供路由器的链路本地地址, 2) 它们向附加到链路的其他路由器通知要与链路关联的 IPv6 前缀列表, 3) 它们允许路由器通告要与将为链路发起的网络-LSA 关联的选项位集合. 详情请参见第 4.4.3.8 节.

  • 在 IPv4 中, 路由器-LSA 携带路由器的 IPv4 接口地址, 即链路本地地址的 IPv4 等价物. 这些仅在 OSPF 路由计算期间计算下一跳时使用 (参见 [OSPFV2] 第 16.1.1 节), 因此它们不需要泛洪到本地链路之外. 因此, 使用链路-LSA 分发这些地址更有效率. 请注意, 在所有情况下都不能通过接收 Hello 学习链路本地地址. 在 NBMA 链路上, 下一跳路由器不一定交换 Hello. 相反, 这些路由器通过指定路由器 (DR) 了解彼此的存在.

  • 网络 LSA 中的选项字段设置为链路上每个路由器在其链路-LSA 中通告的选项的逻辑或 (Logical OR).

  • 类型 3 汇总-LSA (Summary-LSAs) 已重命名为 "区域间前缀-LSA (Inter-Area-Prefix-LSAs)". 类型 4 汇总 LSA 已重命名为 "区域间路由器-LSA (Inter-Area-Router-LSAs)".

  • 区域间前缀-LSA、区域间路由器-LSA、NSSA-LSA 和 AS 外部-LSA 中的链路状态 ID 失去了其地址语义, 现在仅用于识别链路状态数据库的各个部分. 以前由链路状态 ID 表示的所有地址或路由器 ID 现在都包含在 LSA 主体中.

  • 网络-LSA 和链路-LSA 是唯一其链路状态 ID 具有额外含义的 LSA. 对于这些 LSA, 链路状态 ID 始终是正在描述的链路上发起路由器的接口 ID. 因此, 网络-LSA 和链路-LSA 现在是唯一大小无法限制的 LSA: 网络-LSA 必须 (MUST) 列出连接到链路的所有路由器, 链路-LSA 必须 (MUST) 列出路由器在链路上的所有地址.

  • 引入了一个称为区域内前缀-LSA 的新 LSA. 此 LSA 承载 IPv4 中包含在路由器-LSA 和网络-LSA 中的所有 IPv6 前缀信息. 详情请参见第 4.4.3.9 节.

  • AS 外部-LSA 中转发地址 (Forwarding Address) 或外部路由标签 (External Route Tag) 的包含现在是可选的. 此外, AS 外部-LSA 现在可以引用另一个 LSA, 以包含 OSPF 协议范围之外的附加路由属性. 例如, 此引用可用于将 BGP 路径属性附加到外部路由.

2.9. Handling Unknown LSA Types (处理未知的 LSA 类型)

未知 LSA 类型的处理已变得更加灵活, 因此, 基于 LS 类型, 未知 LSA 类型要么被视为具有链路本地泛洪范围, 要么像它们被理解一样被存储和泛洪. 此行为在链路状态头的 LS 类型字段的 LSA 处理位 (LSA Handling Bit) 中明确编码 (参见附录 A.4.2.1 中的 U 位).

由于希望在单个链路上混合路由器能力, 因此不支持简单丢弃未知类型的 IPv4 OSPF 行为. 当指定路由器支持的选项少于链路上的其他路由器时, 丢弃未知类型会导致问题.

2.10. Stub/NSSA Area Support (末梢/NSSA 区域支持)

在 IPv4 的 OSPF 中, 末梢 (Stub) 和 NSSA 区域旨在最小化区域内部路由器的链路状态数据库和路由表大小. 这允许资源最少的路由器参与甚至非常大的 OSPF 路由域.

在 IPv6 的 OSPF 中, 保留了末梢和 NSSA 区域的概念. 在 IPv6 中, 在强制 LSA 类型中, 末梢区域仅承载路由器-LSA、网络-LSA、区域间前缀-LSA、链路-LSA 和区域内前缀-LSA. NSSA 区域仅限于这些类型, 当然还有 NSSA-LSA. 这是 IPv4 末梢区域中承载的 LSA 类型的 IPv6 等价物: 路由器-LSA、网络-LSA、类型 3 汇总-LSA, 对于 NSSA 区域: 末梢区域类型和 NSSA-LSA.

2.11. Identifying Neighbors by Router ID (通过路由器 ID 识别邻居)

在 IPv6 的 OSPF 中, 给定链路上的相邻路由器始终通过其 OSPF 路由器 ID 进行识别. 这与 IPv4 行为形成对比, 其中点对点网络和虚拟链路上的邻居通过其路由器 ID 识别, 而广播、NBMA 和点到多点链路上的邻居通过其 IPv4 接口地址识别.

此更改影响 OSPF 数据包的接收 (参见 [OSPFV2] 第 8.2 节)、邻居查找 ([OSPFV2] 第 10 节) 和 Hello 数据包的接收 ([OSPFV2] 第 10.5 节).

路由器 ID 0.0.0.0 是保留的, 不应该 (SHOULD NOT) 使用.