OSPF 邻居建立与LSA同步时序图


OSPF 邻居建立与LSA同步时序图

sequenceDiagram participant R1 as 路由器 A participant R2 as 路由器 B Note over R1, R2: 1. 建立邻居关系 (双向通信) R1->>R2: Hello 分组 (Type 1) Note left of R1: 状态: Down -> Init R2->>R1: Hello 分组 (Type 1) Note right of R2: 状态: Down -> Init Note left of R1: 在Hello中看到自己的RID,<br/>状态: Init -> 2-Way Note right of R2: 在Hello中看到自己的RID,<br/>状态: Init -> 2-Way Note over R1, R2: 2. 主从关系协商 & 交换DBD摘要 R1->>R2: DBD 分组 (Type 2) [I=1, M=1, MS=1, Seq=X] Note left of R1: 状态: 2-Way -> ExStart R2->>R1: DBD 分组 (Type 2) [I=1, M=1, MS=1, Seq=Y] Note right of R2: 状态: ExStart<br/>(比较RID,R2为“主”) R2->>R1: DBD 分组 (Type 2) [I=0, M=1, MS=1, Seq=Y] Note right of R2: 状态: ExStart -> Exchange Note left of R1: 状态: ExStart -> Exchange R1->>R2: DBD 分组 (Type 2) [I=0, M=1, MS=0, Seq=Y+1] loop 交换多个DBD分组 R2->>R1: DBD 分组 (Type 2) [M=1, ...] R1->>R2: DBD 分组 (Type 2) [M=1, ...] end R2->>R1: DBD 分组 (Type 2) [M=0, ...] (最后一个) R1->>R2: DBD 分组 (Type 2) [M=0, ...] (最后一个) Note over R1, R2: 3. 请求并同步完整的LSA Note left of R1: 状态: Exchange -> Loading Note right of R2: 状态: Exchange -> Loading (或Full) R1->>R2: LSR 分组 (Type 3) (请求缺少的LSA) R2->>R1: LSU 分组 (Type 4) (包含完整的LSA) R1->>R2: LSAck 分组 (Type 5) (确认LSU) R2->>R1: LSR 分组 (Type 3) (请求缺少的LSA) R1->>R2: LSU 分组 (Type 4) (包含完整的LSA) R2->>R1: LSAck 分组 (Type 5) (确认LSU) Note left of R1: 状态: Loading -> Full Note right of R2: 状态: Loading -> Full Note over R1, R2: 4. 完全邻接 (FULL) Note over R1, R2: 5. 维护:当链路状态变化时 R1->>R2: LSU 分组 (Type 4) (洪泛更新) R2->>R1: LSAck 分组 (Type 5) (确认更新)

时序图分步详解

阶段一:建立邻居关系(Hello分组)

  1. 初始状态: R1和R2启动OSPF,初始状态为 Down
  2. 发送Hello: R1向组播地址 224.0.0.5 发送一个Hello分组,其中包含自己的Router ID和已知的邻居列表(此时为空)。R1状态变为 Init
  3. 回复Hello: R2收到Hello后,记录下R1的Router ID,并回复一个Hello分组,在这个分组的“邻居”字段中,会包含R1的Router ID。R2状态变为 Init
  4. 确认双向通信: R1在R2发来的Hello分组中看到了自己的Router ID,这意味着“我知道你看到我了”,双向通信建立。R1状态变为 2-Way。同理,R2状态也变为 2-Way

关键点: 在 2-Way 状态,邻居关系已经建立,但链路状态数据库还未同步。

阶段二:主从协商与数据库摘要交换(DBD分组)

  1. 进入ExStart状态: 双方都进入 ExStart 状态,准备开始交换数据库摘要(DBD)。
  2. 主从选举
    • R1发送一个空的DBD分组,设置 I=1(初始),M=1(还有更多),MS=1(我认为我是主),并携带一个初始序列号Seq=X。
    • R2也发送一个空的DBD分组,同样设置 I=1, M=1, MS=1,序列号为Seq=Y。
    • 双方通过比较Router ID(高者为优)来决定主从。假设R2的Router ID更高,则R2成为 ,R1成为
  3. 交换DBD(Exchange状态)
    • 作为主设备,R2开始发送第一个真正的DBD分组,其中包含LSA的头部信息。它设置 I=0, M=1, MS=1,并使用自己的序列号Seq=Y。
    • R1收到后,回复一个DBD分组进行确认,设置 MS=0(表示自己是从),并使用主的序列号Seq=Y+1。
    • 这个过程持续进行,主设备发送DBD,从设备用相同的序列号回复确认,直到所有LSA头部信息交换完毕。最后一个DBD分组会设置 M=0

关键点: DBD交换的是“目录”(LSA头部),不是完整数据。主从关系确保了交换过程的有序性。

阶段三:请求并同步完整LSA(LSR/LSU/LSAck分组)

  1. 进入Loading状态: 双方根据收到的DBD“目录”,与自己的LSDB进行比较,找出自己缺少或过时的LSA,然后进入 Loading 状态。
  2. 请求LSA
    • R1向R2发送 LSR,明确请求它需要的某个LSA的完整内容。
    • R2用 LSU 来回应,LSU分组中包含了R1所请求的完整LSA。
    • R1收到LSU后,更新自己的LSDB,并回复 LSAck 进行确认。
  3. 双向同步: R2同样会向R1发送LSR,请求它需要的LSA,R1也用LSU和LSAck回应。

阶段四:完全邻接(Full)

  • 当双方的所有LSR请求都得到满足,LSDB完全同步后,邻居状态最终变为 Full
  • 此时,这两台路由器才算是建立了 完全的邻接关系,可以基于完全相同的拓扑图(LSDB)进行SPF最短路径计算。

阶段五:维护(持续进行)

  • Full 状态,Hello分组会持续发送以维持邻居关系。
  • 当任何一路由器的链路状态发生变化(如接口UP/DOWN),它会立即洪泛发送 LSU 给所有邻接路由器,邻居们收到后更新LSDB并回复 LSAck,从而完成拓扑的快速收敛。
posted @ 2025-11-20 09:31  morty-root  阅读(110)  评论(0)    收藏  举报