9. 接口数据结构 (The Interface Data Structure)
-
接口数据结构 (The Interface Data Structure)
OSPF interface 是路由器与网络之间的连接. 我们假定每个连接的网络/子网只有一个 OSPF interface, 尽管 Appendix F 中考虑了在单个网络上支持多个接口. 每个接口结构最多有一个 IP 接口地址.
OSPF interface 可被视为属于包含所连接网络的区域. 路由器通过该接口产生的所有路由协议报文都会标记该接口的 Area ID. 一个接口上可以形成一个或多个路由器邻接关系. 路由器的 LSA 反映其接口及其关联邻接关系的状态.
以下数据项与接口关联. 注意, 其中若干项实际上是所连接网络的配置; 这些项必须对连接到该网络的所有路由器相同.
Type OSPF interface type 是 point-to-point, broadcast, NBMA, Point-to-MultiPoint 或 virtual link.
State 接口的功能级别. State 决定是否允许在接口上形成完整邻接关系. State 也反映在路由器的 LSA 中.
IP interface address 与接口关联的 IP 地址. 它在通过此接口产生的所有路由协议报文中作为 IP 源地址出现. 连接到未编号点到点网络的接口没有关联 IP 地址.
IP interface mask 也称为 subnet mask, 指示 IP 接口地址中标识所连接网络的部分. 将 IP interface address 与 IP interface mask 相与会得到所连接网络的 IP 网络号. 在点到点网络和虚链路上, IP interface mask 未定义. 在这些网络上, 链路本身不分配 IP 网络号, 因而链路两端的地址独立分配, 如果有分配的话.
Area ID 所连接网络所属区域的 Area ID. 从该接口产生的所有路由协议报文都标记此 Area ID.
HelloInterval 路由器在接口上发送 Hello packets 的时间间隔, 以秒为单位. 在从此接口发出的 Hello packets 中通告.
RouterDeadInterval 当邻居停止听到该路由器的 Hello Packets 后, 在声明该路由器 down 之前等待的秒数. 在从此接口发出的 Hello packets 中通告.
InfTransDelay 通过该接口传输 Link State Update Packet 所需秒数的估计值. Link State Update packet 中包含的 LSA 在传输前会将其 age 增加该值. 该值应考虑传输和传播时延; 它必须大于零.
Router Priority 一个 8 位无符号整数. 当连接到某网络的两台路由器都尝试成为 Designated Router 时, Router Priority 最高者优先. Router Priority 设置为 0 的路由器没有资格成为所连接网络上的 Designated Router. 在从此接口发出的 Hello packets 中通告.
Hello Timer 一个 interval timer, 使接口发送 Hello packet. 该定时器每 HelloInterval 秒触发一次. 注意, 在非广播网络上, 会向每个合格邻居发送单独的 Hello packet.
Wait Timer 一个 single shot timer, 使接口退出 Waiting 状态, 并因此在网络上选择 Designated Router. 该定时器长度为 RouterDeadInterval 秒.
List of neighboring routers 连接到该网络的其他路由器. 此列表由 Hello Protocol 形成. 会与其中某些邻居形成邻接关系. 可通过检查所有邻居状态来确定相邻邻居集合.
Designated Router 为所连接网络选择的 Designated Router. 在所有广播网络和 NBMA 网络上, Designated Router 由 Hello Protocol 选择. 为 Designated Router 保存两项标识: 其 Router ID, 以及它在该网络上的 IP 接口地址. Designated Router 为该网络通告链路状态; 该 network-LSA 以 Designated Router 的 IP 地址标记. Designated Router 初始化为 0.0.0.0, 表示没有 Designated Router.
Backup Designated Router Backup Designated Router 也由 Hello Protocol 在所有广播网络和 NBMA 网络上选择. 所连接网络上的所有路由器都会与 Designated Router 和 Backup Designated Router 成为邻接. 当前 Designated Router 失效时, Backup Designated Router 成为 Designated Router. Backup Designated Router 初始化为 0.0.0.0, 表示没有 Backup Designated Router.
Interface output cost(s) 在接口上发送数据报文的代价, 以链路状态 metric 表示. 这在 router-LSA 中作为该接口的链路代价通告. 接口代价必须大于零.
RxmtInterval 属于此接口的邻接关系进行 LSA 重传之间的秒数. 重传 Database Description 和 Link State Request Packets 时也使用该值.
AuType 所连接网络/子网上使用的认证类型. 认证类型在 Appendix D 中定义. 所有 OSPF 报文交换都经过认证. 不同网络/子网可以使用不同认证方案.
Authentication key 该配置数据允许认证过程生成和/或验证 OSPF 协议报文. Authentication key 可按接口配置. 例如, 如果 AuType 指示 simple password, 则 Authentication key 是插入 OSPF 报文头部的 64 位明文 password. 如果 Autype 指示 Cryptographic authentication, 则 Authentication key 是共享 secret, 用于生成/验证附加到 OSPF 协议报文的 message digests. 使用 Cryptographic authentication 时, 支持多个同时存在的密钥, 以实现平滑密钥过渡 (见 Section D.3).
9.1. 接口状态 (Interface states)
本节记录路由器接口可能达到的各种状态. 这些状态按功能递进顺序列出. 例如, 不可运行状态最先列出, 后面是一系列中间状态, 最终达到完全可用状态. 本规范有时通过诸如 "those interfaces in state greater than X" 的引用来利用这种排序. Figure 11 显示接口状态变化图. 图中的弧以导致状态变化的事件标记. 这些事件记录在 Section 9.2. 接口状态机在 Section 9.3 中更详细描述.
Down
这是初始接口状态. 在此状态下, 低层协议已指示该接口不可用. 这样的接口不会发送或接收任何协议流量. 在此状态下, 接口参数应设置为初始值. 所有接口定时器应禁用, 且不应有与该接口关联的邻接关系.
Loopback
在此状态下, 路由器通往网络的接口被回环. 接口可能在硬件或软件中回环. 该接口不能用于常规数据流量. 不过, 仍可能希望获得该接口质量的信息, 例如通过向该接口发送 ICMP pings 或类似 bit error test 的方式. 因此, IP 报文仍可以寻址到 Loopback 状态的接口. 为方便这一点, 这类接口在 router-LSAs 中作为单个 host routes 通告, 其目的地是 IP interface address.[4]
+----+ UnloopInd +--------+
|Down|<--------------|Loopback|
+----+ +--------+
|
|InterfaceUp
+-------+ | +--------------+
|Waiting|<-+------------->|Point-to-point|
+-------+ +--------------+
|
WaitTimer|BackupSeen
|
|
| NeighborChange
+------+ +-+<---------------- +-------+
|Backup|<----------|?|----------------->|DROther|
+------+---------->+-+<-----+ +-------+
Neighbor | |
Change | |Neighbor
| |Change
| +--+
+---->|DR|
+--+
Figure 11: 接口状态变化
除图中所示状态转换外,
Event InterfaceDown 始终强制进入 Down State,
Event LoopInd 始终强制进入 Loopback State
Waiting
在此状态下, 路由器正在尝试确定该网络的 (Backup) Designated Router 身份. 为此, 路由器监视它收到的 Hello Packets. 在转换出 Waiting 状态之前, 路由器不允许选举 Backup Designated Router 或 Designated Router. 这可防止 (Backup) Designated Router 不必要地变化.
Point-to-point
在此状态下, 接口可运行, 并连接到物理点到点网络或虚链路. 进入此状态时, 路由器尝试与相邻路由器形成邻接关系. Hello Packets 每 HelloInterval 秒发送给邻居.
DR Other
该接口连接到广播或 NBMA 网络, 且另一台路由器已被选为 Designated Router. 在此状态下, 路由器自身也未被选为 Backup Designated Router. 路由器与 Designated Router 和 Backup Designated Router (如果存在) 形成邻接关系.
Backup
在此状态下, 路由器自身是所连接网络上的 Backup Designated Router. 当前 Designated Router 失效时, 它会提升为 Designated Router. 路由器与连接到该网络的所有其他路由器建立邻接关系. 与 Designated Router 相比, Backup Designated Router 在 Flooding Procedure 中执行的功能略有不同 (见 Section 13.3). 关于 Backup Designated Router 执行的功能, 详见 Section 7.4.
DR 在此状态下, 该路由器自身是所连接网络上的 Designated Router. 它与连接到该网络的所有其他路由器建立邻接关系. 路由器还必须为该网络节点产生 network-LSA. network-LSA 将包含到连接该网络的所有路由器的链路, 包括 Designated Router 自身. 关于 Designated Router 执行的功能, 详见 Section 7.3.9.2. 导致接口状态变化的事件 (Events causing interface state changes)
多种事件可以导致状态变化. 这些事件在 Figure 11 中显示为带标签的弧. 标签定义列在下面. 关于这些事件对 OSPF 协议运行影响的详细解释, 请参见 Section 9.3.
InterfaceUp
低层协议已指示网络接口可运行. 这使接口能够从 Down 状态转换出来. 在虚链路上, 接口可运行指示实际上是最短路径计算的结果 (见 Section 16.7).
WaitTimer
Wait Timer 已触发, 表示在选举 (Backup) Designated Router 之前所需的等待期结束.
BackupSeen
路由器检测到该网络的 Backup Designated Router 存在或不存在. 这通过两种方式之一完成. 第一, 可能收到来自某个邻居的 Hello Packet, 该邻居声称自己是 Backup Designated Router. 或者, 可能收到来自某个邻居的 Hello Packet, 该邻居声称自己是 Designated Router, 并指示没有 Backup Designated Router. 无论哪种情况, 都必须与该邻居存在双向通信, 即路由器自身也必须出现在该邻居的 Hello Packet 中. 该事件表示 Waiting 状态结束.
NeighborChange
与该接口关联的双向邻居集合发生了变化. 需要重新计算 (Backup) Designated Router. 以下邻居变化会导致 NeighborChange 事件. 邻居状态的解释见 Section 10.1.
o 已与某邻居建立双向通信. 换句话说, 该邻居的状态已转换为 2-Way 或更高.
o 与某邻居不再存在双向通信. 换句话说, 该邻居的状态已转换为 Init 或更低.
o 某个双向邻居新近声明自己为 Designated Router 或 Backup Designated Router. 这是通过检查该邻居的 Hello Packets 检测到的.
o 某个双向邻居不再声明自己为 Designated Router, 或不再声明自己为 Backup Designated Router. 这同样通过检查该邻居的 Hello Packets 检测到.
o 某个双向邻居通告的 Router Priority 发生变化. 这同样通过检查该邻居的 Hello Packets 检测到.
LoopInd
已收到接口现在回环到自身的指示. 该指示可来自网络管理, 也可来自低层协议.
UnloopInd
已收到接口不再回环的指示. 与 LoopInd 事件一样, 该指示可来自网络管理, 也可来自低层协议.
InterfaceDown
低层协议指示该接口不再可用. 无论当前接口状态是什么, 新接口状态都将是 Down.9.3. 接口状态机 (The Interface state machine)
下面详细描述接口状态变化. 每次状态变化由一个事件调用 (Section 9.2). 该事件可能根据接口当前状态产生不同影响. 因此, 下面的状态机按当前接口状态和收到的事件组织. 状态机中的每个条目描述得到的新接口状态和所需的额外动作集合.
当接口状态变化时, 可能需要产生新的 router-LSA. 更多细节见 Section 12.4.
以下某些必需动作涉及为邻居状态机生成事件. 例如, 当接口变为不可运行时, 必须销毁与该接口关联的所有邻居连接. 关于邻居状态机的更多信息, 见 Section 10.3.
State(s): Down
Event: InterfaceUp
New state: Depends upon action routine
Action: 启动 interval Hello Timer, 使接口能够周期性发送 Hello packets.
如果所连接网络是物理点到点网络、Point-to-MultiPoint 网络或虚链路,
接口状态转换为 Point-to-Point. 否则, 如果路由器没有资格成为
Designated Router, 接口状态转换为 DR Other.
否则, 所连接网络是广播或 NBMA 网络, 且路由器有资格成为
Designated Router. 在这种情况下, 为尝试发现所连接网络的
Designated Router, 接口状态设置为 Waiting, 并启动 single
shot Wait Timer. 此外, 如果网络是 NBMA 网络, 则检查该接口
配置的邻居列表, 并为每个同样有资格成为 Designated Router 的
邻居生成 neighbor event Start.
State(s): Waiting
Event: BackupSeen
New state: Depends upon action routine.
Action: 按 Section 9.4 所示计算所连接网络的 Backup Designated Router
和 Designated Router. 作为该计算的结果, 接口的新状态将是
DR Other, Backup 或 DR.
State(s): Waiting
Event: WaitTimer
New state: Depends upon action routine.
Action: 按 Section 9.4 所示计算所连接网络的 Backup Designated Router
和 Designated Router. 作为该计算的结果, 接口的新状态将是
DR Other, Backup 或 DR.
State(s): DR Other, Backup or DR
Event: NeighborChange
New state: Depends upon action routine.
Action: 按 Section 9.4 所示重新计算所连接网络的 Backup Designated
Router 和 Designated Router. 作为该计算的结果, 接口的新状态
将是 DR Other, Backup 或 DR.
State(s): Any State
Event: InterfaceDown
New state: Down
Action: 重置所有接口变量, 并禁用接口定时器. 此外, 销毁与该接口
关联的所有邻居连接. 这是通过在所有关联邻居上生成事件
KillNbr 完成的 (见 Section 10.2).
State(s): Any State
Event: LoopInd
New state: Loopback
Action: 由于此接口不再连接到所连接网络, 执行上述 InterfaceDown
事件关联的动作.
State(s): Loopback
Event: UnloopInd
New state: Down
Action: 不需要任何动作. 例如, 进入 Loopback 状态时接口变量已经重置.
注意, 在接口再次完全可用之前, 必须接收 InterfaceUp 事件.9.4. 选举 Designated Router (Electing the Designated Router)
本节描述用于计算网络的 Designated Router 和 Backup Designated Router 的算法. 该算法由 Interface state machine 调用. 路由器第一次为某个网络运行选举算法时, 该网络的 Designated Router 和 Backup Designated Router 初始化为 0.0.0.0. 这表示没有 Designated Router 和 Backup Designated Router.
Designated Router 选举算法按如下方式进行: 将执行计算的路由器称为 Router X. 检查连接到该网络且已与 Router X 建立双向通信的邻居列表. 该列表准确地说就是 Router X 在该网络上状态大于或等于 2-Way 的邻居集合 (见 Section 10.1). Router X 自身也被视为在列表中. 从列表中丢弃所有没有资格成为 Designated Router 的路由器. Router Priority 为 0 的路由器没有资格成为 Designated Router. 随后只对列表中剩余路由器执行以下步骤:
(1) 记录该网络当前 Designated Router 和 Backup Designated Router 的值. 这稍后用于比较.
(2) 按如下方式计算该网络新的 Backup Designated Router. 只有列表中未声明自己为 Designated Router 的路由器才有资格成为 Backup Designated Router. 如果这些路由器中有一个或多个声明自己为 Backup Designated Router, 即它们当前在自己的 Hello Packets 中把自己列为 Backup Designated Router, 但未列为 Designated Router, 则声明 Router Priority 最高者为 Backup Designated Router. 如果平局, 选择 Router ID 最高者. 如果没有路由器声明自己为 Backup Designated Router, 则选择 Router Priority 最高的路由器, 同样排除那些声明自己为 Designated Router 的路由器, 并再次使用 Router ID 打破平局.
(3) 按如下方式计算该网络新的 Designated Router. 如果一个或多个路由器声明自己为 Designated Router, 即它们当前在自己的 Hello Packets 中把自己列为 Designated Router, 则声明 Router Priority 最高者为 Designated Router. 如果平局, 选择 Router ID 最高者. 如果没有路由器声明自己为 Designated Router, 则将 Designated Router 指定为刚选出的 Backup Designated Router.
(4) 如果 Router X 现在新近成为 Designated Router 或 Backup Designated Router, 或者现在不再是 Designated Router 或 Backup Designated Router, 则重复 steps 2 和 3, 然后进入 step 5. 例如, 如果 Router X 现在是 Designated Router, 当重复 step 2 时, X 将不再有资格参与 Backup Designated Router 选举. 这将确保, 除其他事项外, 没有路由器会同时声明自己为 Backup Designated Router 和 Designated Router.[5]
(5) 作为这些计算的结果, 路由器自身现在可能是 Designated Router 或 Backup Designated Router. 这会带来的额外职责见 Sections 7.3 和 7.4. 应相应设置路由器的接口状态. 如果路由器自身现在是 Designated Router, 新接口状态为 DR. 如果路由器自身现在是 Backup Designated Router, 新接口状态为 Backup. 否则, 新接口状态为 DR Other.
(6) 如果所连接网络是 NBMA 网络, 且路由器自身刚刚成为 Designated Router 或 Backup Designated Router, 它必须开始向那些没有资格成为 Designated Router 的邻居发送 Hello Packets (见 Section 9.5.1). 这是通过为每个 Router Priority 为 0 的邻居调用 neighbor event Start 完成的.
(7) 如果上述计算导致 Designated Router 或 Backup Designated Router 的身份发生变化, 则需要修改与此接口关联的邻接关系集合. 某些邻接可能需要形成, 另一些可能需要断开. 为完成这一点, 对所有状态至少为 2-Way 的邻居调用事件 AdjOK?. 这会导致重新检查它们成为邻接的资格 (见 Sections 10.3 和 10.4).
选举算法复杂性的原因在于希望当前 Designated Router 失效时, 能从 Backup Designated Router 有序过渡到 Designated Router. 这种有序过渡通过引入 hysteresis 来保证: 在旧 Backup 接受其新的 Designated Router 职责之前, 不能选择新的 Backup Designated Router.
上述过程可能选出同一台路由器同时作为 Designated Router 和 Backup Designated Router, 尽管该路由器永远不会是执行计算的路由器 (Router X) 自身. 被选出的 Designated Router 可能不是 Router Priority 最高的路由器, Backup Designated Router 也不一定具有第二高 Router Priority. 如果 Router X 自身没有资格成为 Designated Router, 则上述过程中可能既不会选择 Backup Designated Router, 也不会选择 Designated Router. 还要注意, 如果 Router X 是唯一有资格成为 Designated Router 的连接路由器, 它会选择自身作为 Designated Router, 且该网络没有 Backup Designated Router.9.5. 发送 Hello packets (Sending Hello packets)
Hello packets 从每个正常工作的路由器接口发出. 它们用于发现和维护邻居关系.[6] 在广播和 NBMA 网络上, Hello Packets 还用于选举 Designated Router 和 Backup Designated Router.
Hello packet 格式详见 Section A.3.2. Hello Packet 包含路由器的 Router Priority (用于选择 Designated Router), 以及从接口发出 Hello Packets 的间隔 (HelloInterval). Hello Packet 还指示为了保持活动状态, 必须多久听到一次邻居 (RouterDeadInterval). 对连接到同一公共网络的所有路由器, HelloInterval 和 RouterDeadInterval 都必须相同. Hello packet 还包含所连接网络的 IP 地址掩码 (Network Mask). 在未编号点到点网络和虚链路上, 此字段应设置为 0.0.0.0.
Hello packet 的 Options 字段描述路由器的可选 OSPF 能力. 本规范定义了一项可选能力 (见 Sections 4.5 和 A.2). 当且仅当所连接区域能够处理 AS-external-LSAs, 即它不是 stub area 时, Options 字段的 E-bit 应置位. 如果 E-bit 设置不正确, 相邻路由器将拒绝接受该 Hello Packet (见 Section 10.5). Hello Packet 的 Options 字段中无法识别的位应设置为零.
为确保相邻路由器之间的双向通信, Hello packet 包含网络上最近看到其 Hello Packets 的所有路由器列表. Hello packet 还包含路由器当前选择的 Designated Router 和 Backup Designated Router. 这些字段中的值 0.0.0.0 表示尚未选择.
在广播网络和物理点到点网络上, Hello packets 每 HelloInterval 秒发送到 IP 多播地址 AllSPFRouters. 在虚链路上, Hello packets 每 HelloInterval 秒作为单播发送 (直接寻址到虚链路另一端). 在 Point-to-MultiPoint 网络上, 每 HelloInterval 秒向每个连接邻居发送单独的 Hello packets. 在 NBMA 网络上发送 Hello packets 的情况见下一节.
9.5.1. 在 NBMA 网络上发送 Hello packets
为使 Hello Protocol 在非广播网络上工作, 可能需要静态配置信息 (见 Sections C.5 和 C.6). 在 NBMA 网络上, 每个有资格成为 Designated Router 的连接路由器都知道该网络上的所有邻居 (通过配置或某种未指定机制). 每个邻居都标记有该邻居的 Designated Router 资格.
接口状态必须至少为 Waiting, 才能从 NBMA 接口发出任何 Hello Packets. 随后 Hello Packets 直接以单播方式发送到路由器邻居的某个子集. 有时 Hello Packet 会按定时器周期性发送; 其他时候则作为对收到 Hello Packet 的响应发送. 路由器发送 hello 的行为根据路由器自身是否有资格成为 Designated Router 而变化.
如果路由器有资格成为 Designated Router, 它必须周期性向所有同样有资格的邻居发送 Hello Packets. 此外, 如果路由器自身是 Designated Router 或 Backup Designated Router, 它还必须周期性向所有其他邻居发送 Hello Packets. 这意味着任意两台有资格路由器始终交换 Hello Packets, 这是 Designated Router 选举算法正确运行所必需的. 为最小化发送的 Hello Packets 数量, NBMA 网络上有资格的路由器数量应保持较小.
如果路由器没有资格成为 Designated Router, 它必须周期性向 Designated Router 和 Backup Designated Router (如果存在) 发送 Hello Packets. 它还必须响应从任何有资格邻居 (当前 Designated Router 和 Backup Designated Router 除外) 收到的 Hello Packet 而发送 Hello Packet. 这是为了与任何潜在 Designated Router 建立初始双向关系.
周期性向任何邻居发送 Hello packets 时, Hello Packets 之间的间隔由邻居状态决定. 如果邻居处于 Down 状态, Hello Packets 每 PollInterval 秒发送一次. 否则, Hello Packets 每 HelloInterval 秒发送一次.