8. 协议报文处理 (Protocol Packet Processing)
-
协议报文处理 (Protocol Packet Processing)
本节讨论 OSPF 路由协议报文的一般处理。路由器的链路状态数据库保持同步非常重要。因此,路由协议报文在发送和接收时都应比普通数据报文得到优先处理 (preferential treatment)。
路由协议报文仅沿邻接发送(Hello 报文除外,它用于发现邻接)。这意味着所有路由协议报文都只经过单一 IP 跳 (hop),那些通过虚链路发送的报文除外。
所有路由协议报文都以一个标准头部开始。下面各小节详细说明了如何填写和验证这个标准头部。然后,针对每种报文类型,列出了给出该特定报文类型处理更多细节的小节。
8.1. 发送协议报文 (Sending protocol packets)
当路由器发送一个路由协议报文时,它按下述方式填写标准 OSPF 报文头部的字段。有关头部格式的更多细节请查阅 A.3.1 节:
Version # (版本号)
设为 2,即本规范中记录的协议版本号。
Packet type (报文类型)
OSPF 报文的类型,例如 Link State Update 或 Hello 报文。
Packet length (报文长度)
整个 OSPF 报文以字节为单位的长度,包括标准 OSPF 报文头部。
Router ID (路由器 ID)
路由器自身的身份(即始发该报文的路由器)。
Area ID (区域 ID)
报文被发送进的 OSPF 区域。
Checksum (校验和)
整个 OSPF 报文的 IP 标准 16 位反码 (one's complement) 校验和,不包括 64 位认证字段。该校验和作为相应认证过程的一部分计算;对于某些 OSPF 认证类型,校验和计算被省略。详见 D.4 节。
AuType and Authentication (认证类型与认证)
每次 OSPF 报文交换都要经过认证。认证类型由协议分配,记录在附录 D 中。可以为每个 IP 网络/子网使用不同的认证过程。AuType 指示所用认证过程的类型。64 位认证字段则供所选认证过程使用。在形成待发送报文时,该过程应当是最后被调用的。详见 D.4 节。
报文的 IP 目的地址按如下方式选择。在物理点到点网络上,IP 目的地址总是设为 AllSPFRouters 地址。在所有其他网络类型(包括虚链路)上,大多数 OSPF 报文作为单播 (unicasts) 发送,即直接发送到邻接的另一端。在这种情况下,IP 目的地址就是与邻接另一端相关联的邻居 IP 地址(参见第 10 节)。唯一不作为单播发送的报文是在广播网络上;在这些网络上,Hello 报文被发送到多播目的地址 AllSPFRouters,Designated Router 及其 Backup 将它们的 Link State Update 报文和 Link State Acknowledgment 报文都发送到多播地址 AllSPFRouters,而所有其他路由器将其 Link State Update 和 Link State Acknowledgment 报文都发送到多播地址 AllDRouters。
Link State Update 报文的重传 (Retransmissions) 总是直接发送给邻居。在多路访问 (multi-access) 网络上,这意味着重传应当发送到邻居的 IP 地址。
IP 源地址应设为发送接口的 IP 地址。到无编号 (unnumbered) 点到点网络的接口没有相关联的 IP 地址。在这些接口上,IP 源应设为属于该路由器的任何其他 IP 地址。因此,必须至少给该路由器分配一个 IP 地址。[2] 注意,在大多数情况下,虚链路的行为与无编号点到点网络完全相同。然而,每条虚链路确实有一个 IP 接口地址(在路由表构建过程中发现),该地址在通过虚链路发送报文时被用作 IP 源。
有关特定 OSPF 报文类型格式的更多信息,请查阅表 10 中列出的各节。
Type 报文名称 详细小节(发送)
_________________________________________________________
1 Hello 第 9.5 节
2 Database description 第 10.8 节
3 Link state request 第 10.9 节
4 Link state update 第 13.3 节
5 Link state ack 第 13.5 节
Table 10: 描述 OSPF 协议报文发送的小节。8.2. 接收协议报文 (Receiving protocol packets)
每当路由器接收到一个协议报文时,它都被标记为是在哪个接口上接收的。对于配置了虚链路的路由器,可能不能立即明确该将报文与哪个接口关联。例如,考虑图 6 中描绘的路由器 RT11。如果 RT11 在其到网络 N8 的接口上接收一个 OSPF 协议报文,它可能希望将该报文与到 Area 2 的接口关联,或者与到路由器 RT10 的虚链路(它是主干的一部分)关联。在下文中,我们假设该报文最初与非虚链路关联。[3]
为了使报文在 IP 层被接受,即使在报文被传递给 OSPF 处理之前,它也必须通过若干项测试:
o IP 校验和必须正确。
o 报文的 IP 目的地址必须是接收接口的 IP 地址,或 IP 多播地址 AllSPFRouters 或 AllDRouters 之一。
o 指定的 IP 协议必须是 OSPF(89)。
o 本地始发的报文不应再传递给 OSPF。也就是说,应当检查源 IP 地址,确保这不是路由器自身生成的多播报文。
接下来,验证 OSPF 报文头部。头部中指定的字段必须与为接收接口配置的值相匹配。如果不匹配,应当丢弃该报文:
o 版本号字段必须指定协议版本 2。
o 必须验证 OSPF 头部中找到的 Area ID。如果以下两种情况都失败,应当丢弃该报文。头部中指定的 Area ID 必须满足以下两者之一:
(1) 匹配接收接口的区域 ID。在这种情况下,报文是经单一跳发送的。因此,报文的 IP 源地址要求与接收接口在同一网络上。这可以通过将报文的 IP 源地址与接口的 IP 地址在两者都用接口掩码掩码后进行比较来验证。在点到点网络上不应执行此比较。在点到点网络上,链路两端的接口地址是独立分配的(如果分配的话)。
(2) 指示主干。在这种情况下,报文是经虚链路发送的。接收路由器必须是区域边界路由器,并且报文中指定的 Router ID(源路由器)必须是一条已配置虚链路的另一端。接收接口还必须附接到该虚链路已配置的 Transit area(传输区域)。如果所有这些检查都成功,报文被接受,并从此与虚链路(以及主干区域)关联。
o IP 目的地址为 AllDRouters 的报文,仅当接收接口的状态为 DR 或 Backup 时才应被接受(参见 9.1 节)。
o 报文中指定的 AuType 必须与相关联区域指定的 AuType 匹配。
o 报文必须经过认证。认证过程由 AuType 的设置指示(参见附录 D)。认证过程可能使用一个或更多认证密钥 (Authentication keys),这些密钥可以按每接口配置。认证过程也可能验证 OSPF 报文头部中的校验和字段(当被使用时,该校验和设为 OSPF 报文内容排除 64 位认证字段后的标准 IP 16 位反码校验和)。如果认证过程失败,应当丢弃该报文。
如果报文类型是 Hello,它随后应被 Hello 协议进一步处理(参见 10.5 节)。所有其他报文类型仅在邻接上发送/接收。这意味着该报文必定是由路由器的某个活动邻居 (active neighbors) 发送的。如果接收接口连接到广播网络、Point-to-MultiPoint 网络或 NBMA 网络,发送方由报文 IP 头部中的 IP 源地址标识。如果接收接口连接到点到点网络或虚链路,发送方由报文 OSPF 头部中的 Router ID(源路由器)标识。与接收接口相关联的数据结构包含活动邻居列表。与任何活动邻居都不匹配的报文被丢弃。
此时所有接收到的协议报文都与一个活动邻居相关联。有关特定报文类型的进一步输入处理,请查阅表 11 中列出的各节。
Type 报文名称 详细小节(接收)
________________________________________________________
1 Hello 第 10.5 节
2 Database description 第 10.6 节
3 Link state request 第 10.7 节
4 Link state update 第 13 节
5 Link state ack 第 13.7 节
Table 11: 描述 OSPF 协议报文接收的小节。