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分组)
- 初始状态: R1和R2启动OSPF,初始状态为
Down。 - 发送Hello: R1向组播地址
224.0.0.5发送一个Hello分组,其中包含自己的Router ID和已知的邻居列表(此时为空)。R1状态变为Init。 - 回复Hello: R2收到Hello后,记录下R1的Router ID,并回复一个Hello分组,在这个分组的“邻居”字段中,会包含R1的Router ID。R2状态变为
Init。 - 确认双向通信: R1在R2发来的Hello分组中看到了自己的Router ID,这意味着“我知道你看到我了”,双向通信建立。R1状态变为
2-Way。同理,R2状态也变为2-Way。
关键点: 在
2-Way状态,邻居关系已经建立,但链路状态数据库还未同步。
阶段二:主从协商与数据库摘要交换(DBD分组)
- 进入ExStart状态: 双方都进入
ExStart状态,准备开始交换数据库摘要(DBD)。 - 主从选举:
- 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成为 从。
- R1发送一个空的DBD分组,设置
- 交换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。
- 作为主设备,R2开始发送第一个真正的DBD分组,其中包含LSA的头部信息。它设置
关键点: DBD交换的是“目录”(LSA头部),不是完整数据。主从关系确保了交换过程的有序性。
阶段三:请求并同步完整LSA(LSR/LSU/LSAck分组)
- 进入Loading状态: 双方根据收到的DBD“目录”,与自己的LSDB进行比较,找出自己缺少或过时的LSA,然后进入
Loading状态。 - 请求LSA:
- R1向R2发送 LSR,明确请求它需要的某个LSA的完整内容。
- R2用 LSU 来回应,LSU分组中包含了R1所请求的完整LSA。
- R1收到LSU后,更新自己的LSDB,并回复 LSAck 进行确认。
- 双向同步: R2同样会向R1发送LSR,请求它需要的LSA,R1也用LSU和LSAck回应。
阶段四:完全邻接(Full)
- 当双方的所有LSR请求都得到满足,LSDB完全同步后,邻居状态最终变为
Full。 - 此时,这两台路由器才算是建立了 完全的邻接关系,可以基于完全相同的拓扑图(LSDB)进行SPF最短路径计算。
阶段五:维护(持续进行)
- 在
Full状态,Hello分组会持续发送以维持邻居关系。 - 当任何一路由器的链路状态发生变化(如接口UP/DOWN),它会立即洪泛发送 LSU 给所有邻接路由器,邻居们收到后更新LSDB并回复 LSAck,从而完成拓扑的快速收敛。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号