4.2. Protocol Packet Processing (协议数据包处理)
IPv6 的 OSPF 直接在 IPv6 的网络层上运行. 因此, 它封装在一个或多个 IPv6 头中, 紧接封装的 IPv6 头的下一头部 (Next Header) 字段设置为值 89.
与 IPv4 的 OSPF 一样, IPv6 的 OSPF 路由协议数据包仅沿邻接关系发送 (Hello 数据包除外, 它们用于发现邻接关系). OSPF 数据包类型和功能在 IPv4 和 IPv6 中都是相同的, 由标准 OSPF 数据包头的类型 (Type) 字段编码.
4.2.1. Sending Protocol Packets (发送协议数据包)
当 IPv6 路由器发送 OSPF 路由协议数据包时, 它按如下方式填充标准 IPv6 OSPF 数据包头的字段 (参见附录 A.3.1):
Version # (版本号)
设置为 3, 这是本规范中记录的协议的版本号.
Type (类型)
OSPF 数据包的类型, 例如链路状态更新 (Link State Update) 或 Hello 数据包.
Packet length (数据包长度)
整个 OSPF 数据包的长度 (以字节为单位), 包括标准 OSPF 数据包头.
Router ID (路由器 ID)
路由器本身的标识 (谁发起数据包).
Area ID (区域 ID)
正在发送数据包的接口的 OSPF 区域.
Instance ID (实例 ID)
与发送数据包的接口关联的 OSPF 实例 ID.
Checksum (校验和)
标准 IPv6 上层校验和 (如 [IPV6] 第 8.1 节所述), 覆盖整个 OSPF 数据包和前置的 IPv6 伪头 (参见附录 A.3.1).
OSPF 路由协议数据包的 IPv6 源地址和目标地址的选择与 [OSPFV2] 第 8.1 节中的 IPv4 逻辑相同. IPv6 目标地址从 AllSPFRouters、AllDRouters 以及与邻接关系另一端关联的邻居 IP 地址中选择 (在 IPv6 中, 对于除虚拟链路之外的所有链路, 这是一个 IPv6 链路本地地址).
链路状态请求 (Link State Request) 数据包和链路状态确认 (Link State Acknowledgment) 数据包的发送与 [OSPFV2] 第 10.9 和 13.5 节中记录的 IPv4 过程保持不变. Hello 数据包的发送在第 4.2.1.1 节中记录, 数据库描述 (Database Description) 数据包的发送在第 4.2.1.2 节中记录. 链路状态更新 (Link State Update) 数据包的发送在第 4.5.2 节中记录.
4.2.1.1. Sending Hello Packets (发送 Hello 数据包)
IPv6 改变了 OSPF Hello 数据包的发送方式如下 (与 [OSPFV2] 第 9.5 节相比):
-
在 Hello 数据包在接口上发送之前, 接口的接口 ID 必须复制到 Hello 数据包中.
-
Hello 数据包不再包含 IP 网络掩码 (Network Mask), 因为 IPv6 的 OSPF 是按链路运行而不是按子网运行.
-
指定路由器和备份指定路由器的选择现在在 Hello 中通过它们的路由器 ID 而不是通过它们的 IP 接口地址指示. 将指定路由器 (或备份指定路由器) 通告为 0.0.0.0 表示指定路由器 (或备份指定路由器) 尚未被选择.
-
Hello 数据包中的选项 (Options) 字段已移动位置, 在此过程中变得更大. 现在可以有更多的选项位. 那些必须在 Hello 数据包中正确设置的如下. E 位当且仅当接口连接到常规区域 (即, 不是末梢区域或 NSSA 区域) 时才设置. 类似地, N 位当且仅当接口连接到 NSSA 区域时才设置 (参见 [NSSA]). 最后, DC 位当且仅当路由器希望抑制在接口上发送未来的 Hello 时才设置 (参见 [DEMAND]). Hello 数据包的选项字段中的无法识别的位应被清除.
在 NBMA 网络上发送 Hello 数据包对于 IPv6 的处理方式与 [OSPFV2] 第 9.5.1 节中记录的 IPv4 完全相同.
4.2.1.2. Sending Database Description Packets (发送数据库描述数据包)
数据库描述数据包的发送与 [OSPFV2] 第 10.8 节有以下不同:
- 数据库描述数据包中的选项 (Options) 字段已移动位置, 在此过程中变得更大. 现在可以有更多的选项位. 那些必须在数据库描述数据包中正确设置的如下. DC 位当且仅当路由器希望抑制在接口上发送 Hello 时才设置 (参见 [DEMAND]). 数据库描述数据包的选项字段中的无法识别的位应被清除.
4.2.2. Receiving Protocol Packets (接收协议数据包)
每当路由器接收到 OSPF 协议数据包时, 都会标记接收到它的接口. 对于配置了虚拟链路的路由器, 可能不会立即明显数据包应该与哪个接口关联. 例如, 考虑 [OSPFV2] 图 6 中描绘的路由器 RT11. 如果 RT11 在其到网络 N8 的接口上接收到 OSPF 协议数据包, 它可能希望将数据包与到区域 2 的接口关联, 或与到路由器 RT10 的虚拟链路 (它是骨干网的一部分) 关联. 在下文中, 我们假设数据包最初与非虚拟链路关联.
为了将数据包传递给 OSPF 进行处理, 必须对封装的 IPv6 头执行以下测试:
-
数据包的 IP 目标地址必须是与接收接口关联的 IPv6 单播地址之一 (这包括链路本地地址)、IPv6 多播地址 AllSPFRouters 或 AllDRouters 之一, 或 IPv6 全局地址 (用于虚拟链路).
-
紧接封装的 IPv6 头的下一头部 (Next Header) 字段必须指定 OSPF 协议 (89).
-
任何封装的 IP 认证头 (参见 [IPAUTH]) 和 IP 封装安全有效载荷 (参见 [IPESP]) 必须被处理和/或验证以确保 OSPF 路由交换的完整性和认证/机密性. 这在 [OSPFV3-AUTH] 中进行了描述.
在处理完封装的 IPv6 头之后, 处理 OSPF 数据包头. 头中指定的字段必须与接收 OSPFv3 接口配置的字段匹配. 如果不匹配, 数据包应该被丢弃:
-
版本号 (Version Number) 字段必须指定协议版本 3.
-
必须验证 IPv6 上层校验和 (如 [IPV6] 第 8.1 节所述), 覆盖整个 OSPF 数据包和前置的 IPv6 伪头 (参见附录 A.3.1).
-
必须验证 OSPF 头中找到的区域 ID (Area ID) 和实例 ID (Instance ID). 如果以下两种情况都失败, 则应丢弃数据包. 头中指定的区域 ID 和实例 ID 必须:
-
匹配接收链路的区域 ID 和接口实例 ID 之一. 与 IPv4 不同, IPv6 源地址不限于与接收链路位于同一 IPv6 子网中. IPv6 OSPF 按链路运行而不是按 IP 子网运行.
-
匹配骨干区域和配置的虚拟链路的其他条件. 接收路由器必须是 ABR (区域边界路由器), 数据包中指定的路由器 ID (源路由器) 必须是配置的虚拟链路的另一端. 此外, 接收链路必须具有连接到虚拟链路的配置传输区域的 OSPFv3 接口, 并且实例 ID 必须与虚拟链路的实例 ID 匹配. 如果所有这些检查都成功, 则接受数据包并将其与虚拟链路 (和骨干区域) 关联.
-
-
本地发起的数据包不应由 OSPF 处理, 除非支持连接到同一链路的多个接口, 如第 4.9 节所述. 本地发起的数据包的源地址等于路由器的本地地址之一.
-
IPv6 目标为 AllDRouters 的数据包只应在接收 OSPFv3 接口的状态为 DR 或备份时才被接受 (参见 [OSPFV2] 第 9.1 节).
在头处理之后, 数据包根据其 OSPF 数据包类型进一步处理. OSPF 数据包类型和功能对于 IPv4 和 IPv6 都是相同的.
如果数据包类型是 Hello, 则应按照第 4.2.2.1 节中描述的 Hello 数据包处理进一步处理. 所有其他数据包类型仅在邻接关系上发送/接收. 这意味着数据包必须由路由器的活动邻居之一发送. 邻居由出现在接收数据包的 OSPF 头中的路由器 ID 标识. 与任何活动邻居都不匹配的数据包将被丢弃.
数据库描述数据包、链路状态请求数据包和链路状态确认数据包的接收处理与 [OSPFV2] 第 10.6、10.7 和 13.7 节中记录的 IPv4 过程几乎相同, 但有以下例外.
- 数据库描述数据包中具有未知 LS 类型但具有可接受泛洪范围的 LSA 的处理方式与具有已知 LS 类型的 LSA 相同. 在 OSPFv2 [OSPFV2] 中, 这些会导致邻接关系因 SequenceMismatch 事件而中断.
Hello 数据包的接收在第 4.2.2.1 节中记录, 链路状态更新数据包的接收在第 4.5.1 节中记录.
4.2.2.1. Receiving Hello Packets (接收 Hello 数据包)
Hello 数据包的接收处理与 [OSPFV2] 第 10.5 节有以下不同:
-
在所有链路类型 (例如, 广播、NBMA、点对点等) 上, 邻居仅通过其 OSPF 路由器 ID 标识. 对于除虚拟链路之外的所有链路类型, 邻居 IP 地址设置为接收的 OSPF Hello 数据包的 IPv6 头中的 IPv6 源地址.
-
Hello 数据包中不再有网络掩码 (Network Mask) 字段.
-
邻居对指定路由器和备份指定路由器的选择现在编码为 OSPF 路由器 ID 而不是 IP 接口地址.