跳到主要内容

9. 接口数据结构 (The Interface Data Structure)

  1. 接口数据结构 (The Interface Data Structure)

    一个 OSPF 接口是路由器与网络之间的连接。我们假设对每个所连网络/子网有单一 OSPF 接口,尽管在单个网络上支持多个接口的情况在附录 F 中考虑。每个接口结构最多有一个 IP 接口地址。

    一个 OSPF 接口可以被认为属于包含其所连网络的区域。路由器经此接口始发的所有路由协议报文都标以该接口的 Area ID。一个接口上可能形成一个或多个路由器邻接。路由器的 LSA 反映了其接口及其相关联邻接的状态。

    下列数据项与接口相关联。注意其中许多项实际上是所连网络的配置;这些项对于连接到该网络的所有路由器必须相同。

    Type (类型) OSPF 接口类型是 point-to-point、broadcast、NBMA、Point-to-MultiPoint 或 virtual link(虚链路)之一。

    State (状态) 接口的功能级别。State 决定是否允许在接口上形成完全邻接。State 也反映在路由器的 LSA 中。

    IP interface address (IP 接口地址) 与接口相关联的 IP 地址。它作为经此接口始发的所有路由协议报文中的 IP 源地址出现。到无编号点到点网络的接口没有相关联的 IP 地址。

    IP interface mask (IP 接口掩码) 也称为子网掩码 (subnet mask),它指示 IP 接口地址中标识所连网络的部分。将 IP 接口地址与 IP 接口掩码相与 (masking) 即得到所连网络的 IP 网络号。在点到点网络和虚链路上,IP 接口掩码未定义。在这些网络上,链路本身不被分配 IP 网络号,因此链路两端的地址是独立分配的(如果分配的话)。

    Area ID (区域 ID) 所连网络所属区域的 Area ID。从接口始发的所有路由协议报文都标以此 Area ID。

    HelloInterval 路由器在该接口上发送 Hello 报文之间的时间间隔,以秒为单位。在经此接口发出的 Hello 报文中通告。

    RouterDeadInterval 当路由器的邻居停止听到该路由器的 Hello 报文后,在它们声明该路由器失效 (down) 之前的秒数。在经此接口发出的 Hello 报文中通告。

    InfTransDelay 经此接口传输一个 Link State Update 报文所需估计的秒数。Link State Update 报文中所含的 LSA 在传输前其年龄 (age) 会增加此数值。该值应考虑传输和传播延迟;它必须大于零。

    Router Priority (路由器优先级) 一个 8 位无符号整数。当连接到同一网络的两台路由器都试图成为 Designated Router 时,Router Priority 较高者优先。Router Priority 设为 0 的路由器无资格成为所连网络的 Designated Router。在经此接口发出的 Hello 报文中通告。

    Hello Timer (Hello 定时器) 一个间隔定时器,使接口发送一个 Hello 报文。该定时器每 HelloInterval 秒触发一次。注意在非广播网络上,会向每个合格的邻居发送单独的 Hello 报文。

    Wait Timer (Wait 定时器) 一个单次定时器,使接口退出 Waiting 状态,从而在网络上选择一个 Designated Router。该定时器的长度为 RouterDeadInterval 秒。

    List of neighboring routers (相邻路由器列表) 连接到此网络的其他路由器。该列表由 Hello 协议形成。将与其中部分邻居形成邻接。相邻邻居的集合可以通过检查所有邻居的状态来确定。

    Designated Router (指定路由器) 为所连网络选出的 Designated Router。Designated Router 在所有广播和 NBMA 网络上由 Hello 协议选出。为 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 也在所有广播和 NBMA 网络上由 Hello 协议选出。所连网络上的所有路由器都与 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) (接口输出代价) 在该接口上发送一个数据报文的代价,以链路状态度量 (link state metric) 表示。这在 router-LSA 中作为此接口的链路代价 (link cost) 通告。一个接口的代价必须大于零。

    RxmtInterval 属于此接口的邻接的 LSA 重传之间的秒数。也用于重传 Database Description 和 Link State Request 报文。

    AuType (认证类型) 在所连网络/子网上使用的认证类型。认证类型在附录 D 中定义。所有 OSPF 报文交换都要经过认证。不同的网络/子网上可能使用不同的认证方案。

    Authentication key (认证密钥) 此配置数据使认证过程能够生成和/或验证 OSPF 协议报文。Authentication key 可以按每接口配置。例如,如果 AuType 指示简单口令 (simple password),Authentication key 将是一个 64 位的明文口令 (clear password),被插入 OSPF 报文头部。如果 AuType 指示密码学认证 (Cryptographic authentication),则 Authentication key 是一个共享密钥 (shared secret),用于生成/验证附加到 OSPF 协议报文的消息摘要 (message digests)。使用密码学认证时,支持多个同时生效的密钥以实现平滑的密钥过渡 (key transition)(参见 D.3 节)。

    9.1. 接口状态 (Interface states)

    本小节记录了路由器接口可能达到的各种状态。这些状态按功能递进的顺序列出。例如,inoperative(不工作)状态首先列出,随后是在达到最终、完全功能状态之前的一系列中间状态。规范利用这种排序,有时会引用诸如 "那些状态大于 X 的接口" 之类的说法。图 11 显示了接口状态变化的图。图的弧 (arcs) 标以引起状态变化的事件。这些事件在 9.2 节记录。接口状态机 (interface state machine) 在 9.3 节更详细地描述。
    
    Down (失效)
        这是接口的初态。在此状态下,低级协议已指示接口不可用。在此类接口上不会发送或接收任何协议流量。在此状态下,接口参数应设为初始值。所有接口定时器应被禁用,并且不应有与接口相关联的邻接。
    
    Loopback (环回)
        在此状态下,路由器到网络的接口被环回 (looped back)。接口可能在硬件或软件中被环回。该接口将不可用于常规数据流量。然而,仍可能希望通过向该接口发送 ICMP ping 或通过类似比特误码测试 (bit error test) 的方式来获取该接口的质量信息。为此,IP 报文仍可被寻址到一个处于 Loopback 状态的接口。为便于此操作,此类接口在 router-LSA 中被通告为单一主机路由 (single host routes),其目的地是 IP 接口地址。[4]
    
    Waiting (等待)
        在此状态下,路由器正试图确定该网络的(Backup)Designated Router 的身份。为此,路由器监控它接收到的 Hello 报文。在它转换出 Waiting 状态之前,不允许路由器选举 Backup Designated Router 或 Designated Router。这防止了(Backup)Designated Router 的不必要变更。
    
    Point-to-point (点到点)
        在此状态下,接口是可操作的,并且连接到物理点到点网络或虚链路。进入此状态后,路由器尝试与相邻路由器形成邻接。每 HelloInterval 秒向邻居发送 Hello 报文。
    
    DR Other (其他 DR)
        该接口连接到一个广播或 NBMA 网络,在该网络上另一台路由器已被选为 Designated Router。在此状态下,路由器自身也未被选为 Backup Designated Router。路由器与 Designated Router 和 Backup Designated Router(如果它们存在)两者都形成邻接。
    
    Backup (备份)
        在此状态下,路由器自身是所连网络的 Backup Designated Router。当当前的 Designated Router 失效时,它将被提升为 Designated Router。路由器与连接到该网络的所有其他路由器建立邻接。Backup Designated Router 在泛洪过程 (Flooding Procedure) 中执行的功能与 Designated Router 略有不同(参见 13.3 节)。关于 Backup Designated Router 所执行功能的更多细节请参见 7.4 节。
    
    DR  在此状态下,此路由器自身是所连网络的 Designated Router。与连接到该网络的所有其他路由器建立邻接。路由器还必须始发一个 network-LSA 用于该网络节点。network-LSA 将包含到连接到该网络的所有路由器(包括 Designated Router 自身)的链路。关于 Designated Router 所执行功能的更多细节请参见 7.3 节。
    
    
                             +----+   UnloopInd   +--------+
                             |Down|<--------------|Loopback|
                             +----+               +--------+
                                |
                                |InterfaceUp
                     +-------+  |               +--------------+
                     |Waiting|<-+------------->|Point-to-point|
                     +-------+                  +--------------+
                         |
                WaitTimer|BackupSeen
                         |
                         |
                         |   NeighborChange
     +------+           +-+<---------------- +-------+
     |Backup|<----------|?|----------------->|DROther|
     +------+---------->+-+<-----+           +-------+
               Neighbor  |       |
                Change    |       |Neighbor
                          |       |Change
                          |     +--+
                          +---->|DR|
                                +--+
    
                  Figure 11: Interface State changes
    
             In addition to the state transitions pictured,
             Event InterfaceDown always forces Down State, and
             Event LoopInd always forces Loopback State
    

    9.2. 引起接口状态变化的事件 (Events causing interface state changes)

    状态变化可由若干事件引起。这些事件在图 11 中描绘为带标签的弧。标签定义列在下面。关于这些事件对 OSPF 协议操作影响的详细解释,请查阅 9.3 节。

    InterfaceUp (接口就绪)
    低级协议已指示网络接口可操作。这使得接口能够转换出 Down 状态。在虚链路上,接口可操作指示实际上是路由计算的结果(参见 16.7 节)。

    WaitTimer (Wait 定时器触发)
    Wait Timer 已触发,指示在选举(Backup)Designated Router 之前所需的等待期结束。

    BackupSeen (看到 Backup)
    路由器已检测到网络存在或不存在 Backup Designated Router。这通过两种方式之一完成。首先,可能从声称自身为 Backup Designated Router 的邻居接收一个 Hello 报文。或者,可能从声称自身为 Designated Router、并指示没有 Backup Designated Router 的邻居接收一个 Hello 报文。无论哪种情况,都必须与该邻居存在双向通信,即路由器自身也必须出现在该邻居的 Hello 报文中。此事件标志着 Waiting 状态的结束。

    NeighborChange (邻居变更)
    与接口相关联的双向邻居集合发生了变化。(Backup)Designated Router 需要重新计算。下列邻居变化导致 NeighborChange 事件。关于邻居状态的解释,请参见 10.1 节。

    o 已与某个邻居建立双向通信。换言之,邻居的状态已转换到 2-Way 或更高。

    o 不再与某个邻居有双向通信。换言之,邻居的状态已转换到 Init 或更低。

    o 某个双向邻居新近声明自身为 Designated Router 或 Backup Designated Router。这通过检查该邻居的 Hello 报文检测到。

    o 某个双向邻居不再声明自身为 Designated Router,或不再声明自身为 Backup Designated Router。这同样通过检查该邻居的 Hello 报文检测到。

    o 一个双向邻居通告的 Router Priority 发生了变化。这同样通过检查该邻居的 Hello 报文检测到。

    LoopInd (环回指示)
    已接收到接口现在被环回自身的指示。该指示可以来自网络管理,也可以来自低级协议。

    UnloopInd (解除环回指示)
    已接收到接口不再被环回的指示。与 LoopInd 事件一样,该指示可以来自网络管理,也可以来自低级协议。

    InterfaceDown (接口失效)
    低级协议指示此接口不再可操作。无论当前接口状态是什么,新的接口状态都将是 Down。

    9.3. 接口状态机 (The Interface state machine)

    接口状态变化的详细描述如下。每次状态变化由一个事件(9.2 节)调用。该事件可能产生不同的效果,取决于接口的当前状态。因此,下面的状态机按当前接口状态和接收到的事件组织。状态机中的每个条目描述了结果的新接口状态以及所需的一组附加动作。

    当接口的状态变化时,可能有必要始发一个新的 router-LSA。更多细节请参见 12.4 节。

    下面所需的某些动作涉及为邻居状态机生成事件。例如,当接口变得不可操作时,所有与该接口相关联的邻居连接必须被销毁。关于邻居状态机的更多信息,请参见 10.3 节。


    State(s): Down

    Event: InterfaceUp

    New state: 取决于动作例程

    Action: 启动间隔 Hello Timer,使能周期性地从此接口发送 Hello 报文。如果所连网络是物理点到点网络、Point-to-MultiPoint 网络或虚链路,接口状态转换到 Point-to-Point。否则,如果路由器无资格成为 Designated Router,接口状态转换到 DR Other。否则,所连网络是广播或 NBMA 网络,并且路由器有资格成为 Designated Router。在这种情况下,为了试图发现所连网络的 Designated Router,接口状态被设为 Waiting 并启动单次 Wait Timer。此外,如果网络是 NBMA 网络,检查为此接口配置的邻居列表,并为每个也有资格成为 Designated Router 的邻居生成邻居事件 Start。


    State(s): Waiting

    Event: BackupSeen

    New state: 取决于动作例程。

    Action: 计算所连网络的 Backup Designated Router 和 Designated Router,如 9.4 节所示。作为该计算的结果,接口的新状态将是 DR Other、Backup 或 DR。


    State(s): Waiting

    Event: WaitTimer

    New state: 取决于动作例程。

    Action: 计算所连网络的 Backup Designated Router 和 Designated Router,如 9.4 节所示。作为该计算的结果,接口的新状态将是 DR Other、Backup 或 DR。


    State(s): DR Other, Backup or DR

    Event: NeighborChange

    New state: 取决于动作例程。

    Action: 重新计算所连网络的 Backup Designated Router 和 Designated Router,如 9.4 节所示。作为该计算的结果,接口的新状态将是 DR Other、Backup 或 DR。


    State(s): Any State

    Event: InterfaceDown

    New state: Down

    Action: 所有接口变量被重置,接口定时器被禁用。此外,所有与接口相关联的邻居连接被销毁。这是通过向所有相关联邻居生成事件 KillNbr 来完成(参见 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 的算法。该算法由接口状态机调用。路由器首次为网络运行选举算法时,网络的 Designated Router 和 Backup Designated Router 都初始化为 0.0.0.0。这表示既没有 Designated Router 也没有 Backup Designated Router。
    
    Designated Router 选举算法如下进行:将执行计算的路由器称为路由器 X。检查连接到网络、并与路由器 X 建立了双向通信的邻居列表。该列表正是路由器 X 在该网络上的、状态大于或等于 2-Way 的邻居集合(参见 10.1 节)。路由器 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 报文中将自身列为 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 报文中将自身列为 Designated Router),则 Router Priority 最高者被声明为 Designated Router。平局时,选择 Router ID 最高者。如果没有路由器声明自身为 Designated Router,则将 Designated Router 赋为与 newly elected Backup Designated Router 相同。
    
    (4) 如果路由器 X 现在新成为 Designated Router 或新成为 Backup Designated Router,或者现在不再是 Designated Router 或不再是 Backup Designated Router,重复步骤 2 和 3,然后进入步骤 5。例如,如果路由器 X 现在是 Designated Router,当重复步骤 2 时,X 将不再有资格参与 Backup Designated Router 选举。其中一点是,这将确保没有路由器会同时声明自身为 Backup Designated Router 和 Designated Router。[5]
    
    (5) 作为这些计算的结果,路由器自身现在可能是 Designated Router 或 Backup Designated Router。关于这将带来的额外职责,请参见 7.3 节和 7.4 节。路由器的接口状态应相应设置。如果路由器自身现在是 Designated Router,新接口状态为 DR。如果路由器自身现在是 Backup Designated Router,新接口状态为 Backup。否则,新接口状态为 DR Other。
    
    (6) 如果所连网络是 NBMA 网络,并且路由器自身刚成为 Designated Router 或 Backup Designated Router,它必须开始向那些无资格成为 Designated Router 的邻居发送 Hello 报文(参见 9.5.1 节)。这是通过为每个 Router Priority 为 0 的邻居调用邻居事件 Start 来完成(参见 10.2 节)。
    
    (7) 如果上述计算导致 Designated Router 或 Backup Designated Router 的身份发生变化,与此接口相关联的邻接集合将需要被修改。某些邻接可能需要形成,其他邻接可能需要断开。为完成此操作,对状态至少为 2-Way 的所有邻居调用事件 AdjOK?。这将使它们的邻接资格被重新检查(参见 10.3 节和 10.4 节)。
    
    上述选举算法之所以复杂,是出于当当前 Designated Router 失效时、从 Backup Designated Router 到 Designated Router 的有序过渡的期望。这种有序过渡通过引入迟滞 (hysteresis) 来保证:在旧的 Backup 接受其新的 Designated Router 职责之前,不能选出新的 Backup Designated Router。
    
    上述过程可能选出同一台路由器同时作为 Designated Router 和 Backup Designated Router,尽管该路由器永远不会是进行计算的路由器(路由器 X)自身。选出的 Designated Router 可能不是 Router Priority 最高的路由器,Backup Designated Router 也不一定是 Router Priority 第二高的。如果路由器 X 自身无资格成为 Designated Router,上述过程可能既不选出 Backup Designated Router 也不选出 Designated Router。还需注意,如果路由器 X 是唯一有资格成为 Designated Router 的所连路由器,它将选择自身为 Designated Router,并且该网络将没有 Backup Designated Router。
    

    9.5. 发送 Hello 报文 (Sending Hello packets)

    Hello 报文从每个可操作的路由器接口发出。它们用于发现和维护邻居关系。[6] 在广播和 NBMA 网络上,Hello 报文还用于选举 Designated Router 和 Backup Designated Router。
    
    Hello 报文的格式在 A.3.2 节详述。Hello 报文包含路由器的 Router Priority(用于选择 Designated Router),以及从接口发出的 Hello 报文之间的间隔(HelloInterval)。Hello 报文还指示邻居必须多久被听到一次才能保持活跃(RouterDeadInterval)。HelloInterval 和 RouterDeadInterval 对于所有连接到公共网络的路由器必须相同。Hello 报文还包含所连网络的 IP 地址掩码(Network Mask)。在无编号点到点网络以及虚链路上,此字段应设为 0.0.0.0。
    
    Hello 报文的 Options 字段描述路由器的可选 OSPF 能力。本规范中定义了一个可选能力(参见 4.5 节和 A.2 节)。Options 字段的 E 位 (E-bit) 应当被设置,当且仅当所连区域能够处理 AS-external-LSA(即它不是末梢区域)。如果 E 位设置不正确,相邻路由器将拒绝接受该 Hello 报文(参见 10.5 节)。Hello 报文 Options 字段中无法识别的位应设为零。
    
    为了确保相邻路由器之间的双向通信,Hello 报文包含最近从其处看到 Hello 报文的、网络上所有路由器的列表。Hello 报文还包含路由器当前选择的 Designated Router 和 Backup Designated Router。这些字段中的值 0.0.0.0 表示尚未选出。
    
    在广播网络和物理点到点网络上,Hello 报文每 HelloInterval 秒发送到 IP 多播地址 AllSPFRouters。在虚链路上,Hello 报文每 HelloInterval 秒作为单播发送(直接寻址到虚链路的另一端)。在 Point-to-MultiPoint 网络上,每 HelloInterval 秒向每个所连邻居发送单独的 Hello 报文。在 NBMA 网络上发送 Hello 报文将在下一节介绍。
    
    
    9.5.1.  在 NBMA 网络上发送 Hello 报文 (Sending Hello packets on NBMA networks)
    
        为了使 Hello 协议在非广播网络上运作,可能需要静态配置信息(参见 C.5 节和 C.6 节)。在 NBMA 网络上,每个有资格成为 Designated Router 的所连路由器都会知道其在该网络上的所有邻居(通过配置或某种未规定的机制)。每个邻居都标以该邻居的 Designated Router 资格。
    
        任何 Hello 报文要被从 NBMA 接口发出,接口状态必须至少为 Waiting。然后 Hello 报文被直接(作为单播)发送到路由器邻居的某个子集。有时 Hello 报文按定时器周期性发送;其他时候它作为对接收到的 Hello 报文的响应而发送。路由器的 Hello 发送行为根据其自身是否有资格成为 Designated Router 而变化。
    
        如果路由器有资格成为 Designated Router,它必须周期性地向所有也有资格的邻居发送 Hello 报文。此外,如果路由器自身是 Designated Router 或 Backup Designated Router,它还必须向所有其他邻居周期性发送 Hello 报文。这意味着任何两台有资格的路由器总是在交换 Hello 报文,这对于 Designated Router 选举算法的正确运作是必要的。为了最小化发送的 Hello 报文数量,NBMA 网络上有资格的路由器数量应保持较小。
    
        如果路由器无资格成为 Designated Router,它必须周期性地向 Designated Router 和 Backup Designated Router(如果它们存在)发送 Hello 报文。它还必须在接收到来自任何有资格邻居(当前 Designated Router 和 Backup Designated Router 除外)的 Hello 报文时回复一个 Hello 报文。这是建立与任何潜在 Designated Router 的初始双向关系所必需的。
    
        当周期性地向任何邻居发送 Hello 报文时,Hello 报文之间的间隔由邻居的状态决定。如果邻居处于 Down 状态,Hello 报文每 PollInterval 秒发送一次。否则,Hello 报文每 HelloInterval 秒发送一次。