附录 A. OSPF 数据格式 (OSPF Data Formats)
A. OSPF 数据格式
本附录描述 OSPF 协议报文和 OSPF LSA 的格式. OSPF 协议直接运行在 IP 网络层之上.
在描述任何数据格式之前, 先说明 OSPF 封装的细节.
接下来描述 OSPF Options 字段. 该字段描述 OSPF 路由域中各部分可能支持或不支持的各种能力.
OSPF Options 字段包含在 OSPF Hello packet, Database Description packet 以及 OSPF LSA 中.
OSPF 报文格式在第 A.3 节中详述. OSPF LSA 的说明见第 A.4 节.
A.1 OSPF 报文封装
OSPF 直接运行在 Internet Protocol 的网络层之上. 因此, OSPF 报文仅由 IP 头部和本地数据链路头部封装.
OSPF 不定义对其协议报文进行分片的方法, 当传输大于网络 MTU 的报文时依赖 IP 分片.
必要时, OSPF 报文长度可以达到 65,535 字节 (包括 IP 头部). 可能较大的 OSPF 报文类型
(Database Description packet, Link State Request packet, Link State Update packet 和 Link State Acknowledgment packet)
通常可以拆分为若干独立协议报文, 且不损失功能. 建议这样做; 应尽可能避免 IP 分片.
基于这一理由, 除非正在执行 Path MTU Discovery (见 [Ref22]), 否则应尝试将通过虚链路发送的 OSPF 报文大小限制为 576 字节.
OSPF 的 IP 封装还有以下重要特性:
o 使用 IP 组播. 在 broadcast 网络上发送时, 某些 OSPF 消息会以组播方式发送.
使用两个不同的 IP 组播地址. 发送到这些组播地址的分组绝不应被转发; 它们只应传播一跳.
为确保这些分组不会传播多跳, 其 IP TTL 必须设置为 1.
AllSPFRouters
该组播地址被分配为 224.0.0.5. 所有运行 OSPF 的路由器都应准备接收发送到该地址的分组.
Hello packet 始终发送到该目的地. 此外, 泛洪过程中的某些 OSPF 协议报文也会发送到该地址.
AllDRouters
该组播地址被分配为 224.0.0.6. Designated Router 和 Backup Designated Router 都必须准备接收发往该地址的分组.
泛洪过程中的某些 OSPF 协议报文会发送到该地址.
o OSPF 的 IP protocol number 为 89. 该编号已在 Network Information Center 注册.
IP protocol number 的分配记录在 [Ref11] 中.
o 所有 OSPF 路由协议报文都使用 [Ref12] 中定义的 normal service TOS 值 binary 0000 发送.
o 路由协议报文发送时 IP precedence 设置为 Internetwork Control. OSPF 协议报文在发送和接收时都应优先于普通 IP 数据流量.
将 IP 头部中的 IP precedence 字段设置为 Internetwork Control [Ref5] 可能有助于实现这一目标.
A.2 Options 字段
OSPF Options 字段出现在 OSPF Hello packet, Database Description packet 和所有 LSA 中.
Options 字段使 OSPF 路由器能够支持 (或不支持) 可选能力, 并将其能力级别传达给其他 OSPF 路由器.
通过这种机制, 不同能力的路由器可以混合存在于同一个 OSPF 路由域中.
在 Hello packet 中使用时, Options 字段允许路由器因为能力不匹配而拒绝邻居.
另一方面, 当能力在 Database Description packet 中交换时, 路由器可以因为邻居功能较弱而选择不向其转发某些 LSA.
最后, 在 LSA 中列出能力使路由器能够在路由表计算的某些部分排除功能较弱的路由器, 从而绕开这些路由器转发流量.
OSPF Options 字段已有五个位被分配, 但本备忘录只完整描述其中一个 (E-bit). 每个位在下面简要说明.
路由器在发送 Hello packet 或 Database Description packet 以及产生 LSA 时, 应复位 (即清除) Options 字段中无法识别的位.
反过来, 路由器在收到的 Hello Packet, Database Description packet 或 LSA 中遇到无法识别的 Option 位时,
应忽略该能力并正常处理该报文/LSA.
+------------------------------------+
| * | * | DC | EA | N/P | MC | E | * |
+------------------------------------+
Options 字段
E-bit
该位描述 AS-external-LSA 的泛洪方式, 如本备忘录第 3.6, 9.5, 10.8 和 12.1.2 节所述.
MC-bit
该位描述是否按照 [Ref18] 中的规范转发 IP multicast datagram.
N/P-bit
该位描述 Type-7 LSA 的处理方式, 如 [Ref19] 所规定.
EA-bit
该位描述路由器接收和转发 External-Attributes-LSA 的意愿, 如 [Ref20] 所规定.
DC-bit
该位描述路由器对 demand circuit 的处理, 如 [Ref21] 所规定.
A.3 OSPF 报文格式
OSPF 有五种不同的报文类型. 所有 OSPF 报文类型都以标准 24 字节头部开始. 首先描述该头部.
随后各节分别描述每种报文类型. 在这些小节中, 会展示每个报文如何划分为字段, 然后逐项列出字段定义.
除 OSPF Hello packet 外, 所有 OSPF 报文类型都处理 LSA 列表. 例如, Link State Update packet 实现 LSA
在整个 OSPF 路由域中的泛洪. 因此, 若不了解 LSA 格式, 就无法解析 OSPF 协议报文. LSA 的格式见第 A.4 节.
OSPF 报文的接收处理在第 8.2 节中详述. OSPF 报文的发送在第 8.1 节中说明.
A.3.1 OSPF 报文头部
每个 OSPF 报文都以标准 24 字节头部开始. 该头部包含判断是否应接受该报文以供进一步处理所需的全部信息.
该判断在本规范第 8.2 节中说明.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | Type | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Version #
OSPF 版本号. 本规范记录协议的 version 2.
Type
OSPF 报文类型如下. 详见第 A.3.2 至 A.3.6 节.
Type Description
________________________________
1 Hello
2 Database Description
3 Link State Request
4 Link State Update
5 Link State Acknowledgment
Packet length
OSPF 协议报文的字节长度. 该长度包括标准 OSPF 头部.
Router ID
报文源的 Router ID.
Area ID
标识该报文所属区域的 32 位编号. 所有 OSPF 报文都关联到单个区域. 大多数报文只传播一跳.
通过虚链路传播的报文标记为骨干 Area ID 0.0.0.0.
Checksum
整个报文内容的标准 IP checksum, 从 OSPF 报文头部开始, 但不包括 64 位 authentication 字段.
该 checksum 的计算方法是对报文中除 authentication 字段之外的所有 16 位字求反码和, 再取 16 位反码.
如果报文长度不是 16 位字的整数倍, 则在计算 checksum 前用一个零字节填充报文.
checksum 被视为报文认证过程的一部分; 对某些认证类型, 会省略 checksum 计算.
AuType
标识用于该报文的认证过程. 认证在本规范附录 D 中讨论. 当前定义的认证类型列表见附录 D.
Authentication
供认证方案使用的 64 位字段. 详见附录 D.
A.3.2 Hello 报文
Hello packet 是 OSPF packet type 1. 这些报文会在所有接口 (包括虚链路) 上周期性发送, 以建立和维护邻居关系.
此外, Hello Packet 会在具有 multicast 或 broadcast 能力的物理网络上组播, 从而动态发现相邻路由器.
连接到同一公共网络的所有路由器必须就某些参数达成一致 (Network mask, HelloInterval 和 RouterDeadInterval).
这些参数包含在 Hello packet 中, 因而参数差异可以阻止邻居关系形成. Hello packet 的接收处理详见第 10.5 节.
Hello packet 的发送见第 9.5 节.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 1 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Network Mask |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HelloInterval | Options | Rtr Pri |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RouterDeadInterval |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Designated Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Backup Designated Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
Network mask
与该接口关联的网络掩码. 例如, 如果该接口连接到一个第三字节用于子网划分的 class B 网络,
则网络掩码为 0xffffff00.
Options
路由器支持的可选能力, 如第 A.2 节所记录.
HelloInterval
该路由器两个 Hello packet 之间的秒数.
Rtr Pri
该路由器的 Router Priority. 用于 (Backup) Designated Router 选举. 如果设置为 0,
该路由器没有资格成为 (Backup) Designated Router.
RouterDeadInterval
在宣布一台静默路由器 down 之前等待的秒数.
Designated Router
发送路由器视角中该网络的 Designated Router 身份. 此处通过它在该网络上的 IP 接口地址标识 Designated Router.
如果没有 Designated Router, 设置为 0.0.0.0.
Backup Designated Router
发送路由器视角中该网络的 Backup Designated Router 身份. 此处通过它在该网络上的 IP 接口地址标识 Backup Designated Router.
如果没有 Backup Designated Router, 设置为 0.0.0.0.
Neighbor
最近在该网络上看到有效 Hello packet 的每台路由器的 Router ID. 最近表示在过去 RouterDeadInterval 秒内.
A.3.3 Database Description 报文
Database Description packet 是 OSPF packet type 2. 这些报文在邻接关系初始化时交换.
它们描述链路状态数据库的内容. 可以使用多个报文描述数据库. 为此使用 poll-response 过程.
其中一台路由器被指定为 master, 另一台为 slave. master 发送 Database Description packet (poll),
slave 发送 Database Description packet (response) 来确认. response 通过报文的 DD sequence number 与 poll 关联.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 2 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Interface MTU | Options |0|0|0|0|0|I|M|MS
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DD sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- -+
| |
+- An LSA Header -+
| |
+- -+
| |
+- -+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
Database Description packet 的格式与 Link State Request packet 和 Link State Acknowledgment packet 非常相似.
三者的主体部分都是条目列表, 每个条目描述链路状态数据库的一个部分.
Database Description Packet 的发送记录在第 10.8 节. Database Description packet 的接收记录在第 10.6 节.
Interface MTU
可以从关联接口发出的最大 IP datagram 的字节大小, 且不需要分片. 常见 Internet 链路类型的 MTU 可见 [Ref22] 表 7-1.
通过虚链路发送的 Database Description packet 中 Interface MTU 应设置为 0.
Options
路由器支持的可选能力, 如第 A.2 节所记录.
I-bit
Init bit. 设置为 1 时, 该报文是 Database Description Packet 序列中的第一个.
M-bit
More bit. 设置为 1 时, 表示后续还有更多 Database Description Packet.
MS-bit
Master/Slave bit. 设置为 1 时, 表示该路由器在 Database Exchange 过程中为 master.
否则, 该路由器为 slave.
DD sequence number
用于为 Database Description Packet 集合排序. 初始值 (由 Init bit 设置表示) 应唯一.
随后 DD sequence number 递增, 直到完整数据库描述发送完毕.
报文其余部分由链路状态数据库各部分的一个 (可能不完整的) 列表组成. 数据库中的每个 LSA 都由其 LSA header 描述.
LSA header 记录在第 A.4.1 节. 它包含唯一标识 LSA 及其当前实例所需的全部信息.
A.3.4 Link State Request 报文
Link State Request packet 是 OSPF packet type 3. 与相邻路由器交换 Database Description packet 后,
路由器可能发现其链路状态数据库的某些部分已过期. Link State Request packet 用于请求邻居数据库中更新的部分.
可能需要使用多个 Link State Request packet.
发送 Link State Request packet 的路由器心中有它所请求数据库部分的精确实例.
每个实例由 LS sequence number, LS checksum 和 LS age 定义, 尽管这些字段并不在 Link State Request Packet 本身中指定.
路由器可能在响应中收到更新的实例.
Link State Request packet 的发送记录在第 10.9 节. Link State Request packet 的接收记录在第 10.7 节.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 3 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LS type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Link State ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertising Router |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
请求的每个 LSA 都由其 LS type, Link State ID 和 Advertising Router 指定.
这能唯一标识该 LSA, 但不能唯一标识其实例. Link State Request packet 被理解为请求最新实例 (无论该实例是什么).
A.3.5 Link State Update 报文
Link State Update packet 是 OSPF packet type 4. 这些报文实现 LSA 泛洪.
每个 Link State Update packet 将一组 LSA 从其源点再向外推进一跳. 一个报文中可以包含多个 LSA.
Link State Update packet 会在支持 multicast/broadcast 的物理网络上组播.
为使泛洪过程可靠, 被泛洪的 LSA 会在 Link State Acknowledgment packet 中确认.
如果需要重传某些 LSA, 重传的 LSA 始终直接发送给邻居. 关于 LSA 可靠泛洪的更多信息见第 13 节.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 4 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| # LSAs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- +-+
| LSAs |
+- +-+
| ... |
# LSAs
本次 update 中包含的 LSA 数量.
Link State Update packet 的主体由 LSA 列表组成. 每个 LSA 都以通用 20 字节头部开始, 该头部在第 A.4.1 节中描述.
不同类型 LSA 的详细格式在第 A.4 节中描述.
A.3.6 Link State Acknowledgment 报文
Link State Acknowledgment Packet 是 OSPF packet type 5. 为使 LSA 泛洪可靠, 被泛洪的 LSA 会被显式确认.
这种确认通过发送和接收 Link State Acknowledgment packet 完成. 一个 Link State Acknowledgment packet 中可以确认多个 LSA.
根据发送接口状态以及相应 Link State Update packet 的发送者, Link State Acknowledgment packet 会发送到组播地址 AllSPFRouters,
组播地址 AllDRouters, 或作为单播发送. Link State Acknowledgement packet 的发送记录在第 13.5 节.
Link State Acknowledgement packet 的接收记录在第 13.7 节.
该报文格式类似于 Data Description packet. 两种报文的主体都只是 LSA header 列表.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version # | 5 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- -+
| |
+- An LSA Header -+
| |
+- -+
| |
+- -+
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
每个被确认的 LSA 都由其 LSA header 描述. LSA header 记录在第 A.4.1 节.
它包含唯一标识 LSA 及其当前实例所需的全部信息.