跳到主要内容

4.2. 协议报文处理

OSPF for IPv6 直接运行在 IPv6 network layer 之上. 因此, 它被封装在一个或多个 IPv6 header 中, 其中直接封装它的 IPv6 header 的 Next Header 字段设置为 89.

与 OSPF for IPv4 一样, OSPF for IPv6 的 OSPF routing protocol packet 只沿 adjacency 发送 (用于发现 adjacency 的 Hello packet 除外). OSPF packet 类型和功能在 IPv4 与 IPv6 中相同, 由标准 OSPF packet header 的 Type 字段编码.

4.2.1. 发送协议报文

当 IPv6 路由器发送 OSPF routing protocol packet 时, 它按如下方式填写标准 OSPF for IPv6 packet header (见 Appendix A.3.1) 的字段:

Version #

设置为 3, 即本规范中记录的 protocol version number.

Type

OSPF packet 的类型, 例如 Link State Update 或 Hello packet.

Packet length

整个 OSPF packet 的长度, 以字节为单位, 包括标准 OSPF packet header.

Router ID

路由器自身的标识 (即发起该 packet 的路由器).

Area ID

发送该 packet 的 interface 所属的 OSPF area.

Instance ID

与发送该 packet 的 outgoing interface 关联的 OSPF Instance ID.

Checksum

标准 IPv6 Upper-Layer checksum (如 [IPV6] Section 8.1 所述), 覆盖整个 OSPF packet 和前置的 IPv6 pseudo-header (见 Appendix A.3.1).

OSPF routing protocol packet 的 IPv6 source address 和 destination address 的选择方式与 [OSPFV2] Section 8.1 中的 IPv4 逻辑相同. IPv6 destination address 从 AllSPFRouters, AllDRouters 以及与 adjacency 另一端关联的 Neighbor IP address 中选择 (在 IPv6 中, 对于除 virtual link 之外的所有 link, 该地址是 IPv6 link-local address).

Link State Request packet 和 Link State Acknowledgment packet 的发送分别与 [OSPFV2] Sections 10.9 和 13.5 中记录的 IPv4 过程保持不变. Hello packet 的发送记录在 Section 4.2.1.1 中, Database Description packet 的发送记录在 Section 4.2.1.2 中. Link State Update packet 的发送记录在 Section 4.5.2 中.

4.2.1.1. 发送 Hello 报文

IPv6 按以下方式改变 OSPF Hello packet 的发送方式 (与 [OSPFV2] Section 9.5 比较):

  • 在 interface 上发送 Hello packet 之前, 该 interface 的 Interface ID 必须复制到 Hello packet 中.

  • Hello packet 不再包含 IP network mask, 因为 OSPF for IPv6 按 link 运行, 而不是按 subnet 运行.

  • Designated Router 和 Backup Designated Router 的选择现在在 Hello 中用其 Router ID 表示, 而不是用其 IP interface address 表示. 将 Designated Router (或 Backup Designated Router) 通告为 0.0.0.0 表示尚未选择 Designated Router (或 Backup Designated Router).

  • Hello packet 中的 Options 字段位置发生了移动, 并且在此过程中变得更大. 现在可以有更多 Options bit. 在 Hello packet 中必须正确设置的 bit 如下. 当且仅当 interface 连接到 regular area, 即不是 stub 或 NSSA area 时, 设置 E-bit. 类似地, 当且仅当 interface 连接到 NSSA area (见 [NSSA]) 时, 设置 N-bit. 最后, 当且仅当路由器希望抑制以后在该 interface 上发送 Hello (见 [DEMAND]) 时, 设置 DC-bit. Hello packet 的 Options 字段中无法识别的 bit 应清零.

在 NBMA network 上发送 Hello packet 时, IPv6 的处理方式与 IPv4 完全相同, 如 [OSPFV2] Section 9.5.1 所记录.

4.2.1.2. 发送 Database Description 报文

Database Description packet 的发送与 [OSPFV2] Section 10.8 的差异如下:

  • Database Description packet 中的 Options 字段位置发生了移动, 并且在此过程中变得更大. 现在可以有更多 Options bit. 在 Database Description packet 中必须正确设置的 bit 如下. 当且仅当路由器希望抑制在该 interface 上发送 Hello (见 [DEMAND]) 时, 设置 DC-bit. Database Description packet 的 Options 字段中无法识别的 bit 应清零.

4.2.2. 接收协议报文

每当路由器接收到 OSPF protocol packet 时, 都会用接收它的 interface 对其进行标记. 对于配置了 virtual link 的路由器, 可能无法立即明确应将该 packet 与哪个 interface 关联. 例如, 考虑 [OSPFV2] Figure 6 中所示的 Router RT11. 如果 RT11 在其通往 Network N8 的 interface 上接收到 OSPF protocol packet, 它可能希望将该 packet 与通往 Area 2 的 interface 关联, 或者与通往 Router RT10 的 virtual link (它是 backbone 的一部分) 关联. 下文中, 我们假定该 packet 初始关联到 non-virtual link.

为了将该 packet 交给 OSPF 处理, 必须对封装 IPv6 header 执行以下检查:

  • packet 的 IP destination address 必须是与接收 interface 关联的某个 IPv6 unicast address (这包括 link-local address), IPv6 multicast address AllSPFRouters 或 AllDRouters 之一, 或者 IPv6 global address (用于 virtual link).

  • 直接封装它的 IPv6 header 的 Next Header 字段必须指定 OSPF protocol (89).

  • 任何封装的 IP Authentication Header (见 [IPAUTH]) 和 IP Encapsulating Security Payload (见 [IPESP]) 必须被处理和/或验证, 以确保 OSPF routing exchange 的完整性以及认证/机密性. 这在 [OSPFV3-AUTH] 中描述.

处理封装 IPv6 header 后, 将处理 OSPF packet header. header 中指定的字段必须与接收 OSPFv3 interface 的配置匹配. 如果不匹配, packet 应该被丢弃:

  • version number 字段必须指定 protocol version 3.

  • 必须验证 IPv6 Upper-Layer checksum (如 [IPV6] Section 8.1 所述), 它覆盖整个 OSPF packet 和前置的 IPv6 pseudo-header (见 Appendix A.3.1).

  • 必须验证 OSPF header 中的 Area ID 和 Instance ID. 如果以下两种情况都不成立, packet 应被丢弃. header 中指定的 Area ID 和 Instance ID 必须满足以下之一:

    1. 匹配接收 link 的某个 Area ID 和 Interface Instance ID. 与 IPv4 不同, IPv6 source address 不限制在与接收 link 相同的 IPv6 subnet 内. IPv6 OSPF 按 link 运行, 而不是按 IP subnet 运行.

    2. 匹配 backbone area 以及已配置 virtual link 的其他条件. 接收路由器必须是 ABR (Area Border Router), 且 packet 中指定的 Router ID (source router) 必须是某条已配置 virtual link 的另一端. 此外, 接收 link 必须有一个连接到该 virtual link 已配置 transit area 的 OSPFv3 interface, 并且 Instance ID 必须匹配该 virtual link 的 Instance ID. 如果所有这些检查都成功, packet 将被接受并与 virtual link (以及 backbone area) 关联.

  • 本地发起的 packet 不应该由 OSPF 处理, 除非是为了支持 Section 4.9 中描述的连接到同一 link 的多个 interface. 本地发起的 packet 的 source address 等于路由器的某个 local address.

  • IPv6 destination 为 AllDRouters 的 packet 只有在接收 OSPFv3 interface 的状态为 DR 或 Backup 时才应被接受 (见 Section 9.1 [OSPFV2]).

header 处理完成后, packet 会根据其 OSPF packet 类型进一步处理. OSPF packet 类型和功能在 IPv4 与 IPv6 中相同.

如果 packet 类型是 Hello, 则应按 Section 4.2.2.1 中描述的 Hello packet 处理继续处理. 所有其他 packet 类型只在 adjacency 上发送/接收. 这意味着该 packet 必须由路由器的某个 active neighbor 发送. neighbor 由接收到的 packet 的 OSPF header 中出现的 Router ID 标识. 不匹配任何 active neighbor 的 packet 将被丢弃.

Database Description packet, Link State Request packet 和 Link State Acknowledgment packet 的接收处理分别与 [OSPFV2] Sections 10.6, 10.7 和 13.7 中记录的 IPv4 过程几乎相同, 但有以下例外.

  • Database Description packet 中具有未知 LS type 且具有可接受 flooding scope 的 LSA, 按与已知 LS type 的 LSA 相同的方式处理. 在 OSPFv2 [OSPFV2] 中, 这些 LSA 会导致 adjacency 因 SequenceMismatch event 而被关闭.

Hello packet 的接收记录在 Section 4.2.2.1 中, Link State Update packet 的接收记录在 Section 4.5.1 中.

4.2.2.1. 接收 Hello 报文

Hello packet 的接收处理与 [OSPFV2] Section 10.5 的差异如下:

  • 在所有 link 类型上 (例如 broadcast, NBMA, point-to-point 等), neighbor 仅由其 OSPF Router ID 标识. 对于除 virtual link 之外的所有 link 类型, Neighbor IP address 设置为接收到的 OSPF Hello packet 的 IPv6 header 中的 IPv6 source address.

  • Hello packet 中不再有 Network Mask 字段.

  • neighbor 选择的 Designated Router 和 Backup Designated Router 现在编码为 OSPF Router ID, 而不是 IP interface address.