当前位置: 首页 > news >正文

开放最短路径优先协议

目录

第一阶段:邻居发现(Neighbor Discovery)

核心目标

详细流程

第二阶段:邻接建立与LSDB同步(Database Synchronization)

核心目标

详细流程

步骤1:触发邻接建立

步骤2:主从选举(Master/Slave Negotiation)

步骤3:交换LSDB摘要(Exchange LSDB Catalogs)

步骤4:请求缺失LSA(Link State Request)

步骤5:同步完整LSA(Link State Update)

概述

1. 邻居发现与DR/BDR角色

2. LSDB同步(新路由器 ↔ DR/BDR)

3. 洪泛更新全网(DR主导)

4. 全网路由表更新


第一阶段:邻居发现(Neighbor Discovery)

核心目标

确认相邻路由器的物理连通性协议兼容性,建立基础邻居关系(Neighbor Adjacency)。

详细流程

1.主动发送 Hello 报文

  • 每个OSPF路由器周期性(默认每10秒)从所有启用OSPF的接口组播发送 Hello 报文。

  • 目的地址224.0.0.5(AllSPFRouters)

    组播地址224.0.0.5 确保只有OSPF路由器处理报文,减少其他设备负担
  • 携带关键信息

字段作用
Router ID发送方唯一标识(如手动配置或最大IP的接口地址)
Area ID发送接口所属区域(如Area 0)
Network Mask发送接口的子网掩码
Hello IntervalHello包发送间隔(默认10s)
Dead Interval邻居失效超时(默认40s)
Neighbors已知邻居的Router ID列表(初始为空)

2.接收并解析 Hello 报文

当路由器R2收到邻居R1的Hello报文时:

  • 记录邻居信息
    将R1的 Router ID 加入本地邻居表(Neighbor Table),状态标记为 Init(单向发现)。

3.双向确认(2-Way 状态)

  • R2在下一个Hello报文中,将R1的Router ID加入 Neighbors 字段列表。

  • 当R1收到R2的Hello报文(其中包含自己的Router ID)时:

    • 确认R2已感知到自己 → 双向通信建立

    • 将R2的邻居状态更新为 2-Way(稳定邻居状态)。

第二阶段:邻接建立与LSDB同步(Database Synchronization)

核心目标

在已建立的邻居关系(2-Way状态)基础上,与特定邻居(DR/BDR) 建立邻接关系(Adjacency),同步链路状态数据库(LSDB),确保区域内所有路由器拥有完全一致的拓扑视图

详细流程
步骤1:触发邻接建立

  • 条件

    • 在广播网络中,非DR/BDR路由器只与 DR 和 BDR 建立邻接。

    • OSPF——DR及BDR详解_dr和bdr-CSDN博客

    • 点对点链路中,所有邻居直接建立邻接。

  • 动作
    路由器向目标邻居(DR/BDR)发送 DBD(Database Description)报文,进入 ExStart 状态。

🌟 关键设计:通过DR/BDR集中管理同步,避免全互联洪泛风暴(N台路由器需建立O(N)邻接关系 → 优化为O(1))。

步骤2:主从选举(Master/Slave Negotiation)
  • 交换空DBD
    双方互发无LSA摘要的DBD(Flags字段标记I=1, M=1, MS=1),声明自己希望成为Master。

  • 选举规则

    • 比较双方的 Router ID,较大者成为 Master(控制序列号同步)。

    • 状态迁移ExStart → Exchange

步骤3:交换LSDB摘要(Exchange LSDB Catalogs)
  • Master主导传输
    Master发送携带 LSA头部摘要 的DBD报文(Flags: M=1, MS=1),序列号按序递增(Seq=Y+1, Y+2...)。

  • #用抓包工具抓包后,打开ospf的DBD包,可看到这些数据I为1,表示本地发出的第一个DBD包M为0,表示本地发出的最后一个DBD包MS为1,代表主,为0代表从		#ospf的主从关系表示的BR,BDR
    
  • Slave确认摘要
    Slave收到DBD后,回复相同序列号的DBD报文(包含自身摘要)。

  • 摘要内容
    每个LSA摘要包含:

    字段作用
    LSA Type类型(如1-Router, 2-Network)
    Link State ID唯一标识LSA
    Advertising Router通告该LSA的路由器ID
    Sequence Number版本标识(越大越新)
    Checksum数据完整性校验
  • 状态保持Exchange

步骤4:请求缺失LSA(Link State Request)

比对摘要差异
双方根据收到的DBD报文,对比本地LSDB:

  • 若发现对方有更新的LSA(序列号更高)→ 标记为 Need to Request

  • 若对方缺失本地持有的LSA → 标记为 Need to Send

  • 发送LSR
    通过 LSR(Link State Request) 报文精准请求缺失的LSA(指定Type/Link State ID/Adv Router)。
    状态迁移Exchange → Loading

步骤5:同步完整LSA(Link State Update)
  • 响应LSU
    收到LSR后,通过 LSU(Link State Update) 报文发送完整的LSA数据

  • 可靠传输
    接收方必须回复 LSAck(Link State Acknowledgment) 确认收到。

  • 循环直至完成
    重复 LSR → LSU → LSAck 过程,直到双方LSDB完全一致。
    状态迁移Loading → Full(邻接建立完成)

  • 💡 洪泛的起点
    新路由器同步完成后,立即洪泛自身的 Router-LSA(Type 1),宣告加入网络。

概述

1. 邻居发现与DR/BDR角色

新路由器周期性发送Hello报文(目的IP:224.0.0.5),所有直连OSPF路由器都会回复(非仅DR/BDR)。

新路由器会与所有邻居建立2-Way关系,但仅与DR/BDR建立邻接(Adjacency) 用于LSDB同步。

非DR/BDR路由器间保持2-Way状态,不交换LSDB(避免洪泛风暴)。

2. LSDB同步(新路由器 ↔ DR/BDR)

通过DBD摘要比对 → LSR精准请求 → LSU发送数据,新路由器获取全网拓扑信息

DR也会学习新路由器的LSA(如它的直连网络),存入本地LSDB。

同步阶段仅更新新路由器和DR/BDR的LSDB,其他路由器尚未感知
3. 洪泛更新全网(DR主导)

新路由器洪泛自身LSA
同步完成后,新路由器立即洪泛 Router-LSA(Type 1),宣告自身加入。

洪泛规则

  • 广播网络:新路由器将LSA单播给DR → DR通过组播224.0.0.5转发给全网。

  • 点对点网络:新路由器直接组播洪泛给邻居。

每台路由器收到新LSA后:

  1. 存入LSDB

  2. 其他邻接邻居转发(除接收端口)

  3. 回复LSAck确认
    → 直至全网LSDB一致。

4. 全网路由表更新

http://www.lryc.cn/news/624538.html

相关文章:

  • 在 CentOS 7 上使用 LAMP 架构部署 WordPress
  • 【秋招笔试】2025.08.16科大讯飞秋招机考真题
  • Unity爆炸力场实战指南
  • Avalonia实例实战七:动画
  • 文件读取的底层实现——generic_read_iter分析
  • 一个基于前端开发的经典飞机大战游戏,具有现代化的UI设计和流畅的游戏体验。
  • 【数据分析】R语言在生态学数据分析中的应用:从数据处理到可视化
  • 双指针从简单到复杂
  • 下划线字段在golang结构体中的应用
  • Drawnix:一款免费开源的白板工具,支持思维导图、流程图、类图和手绘图
  • 深入浅出讲透IPD:三层逻辑实例详解 —— 卫朋
  • 设计模式笔记_行为型_访问者模式
  • 【arXiv2025】计算机视觉|FGA:即插即用!让你的模型精准预测人群密度!
  • 微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题
  • 【深度学习】pytorch深度学习框架的环境配置
  • CPTS---Active 复现
  • 如何部署 PHPWind 8.5 UTF8 论坛?从下载到安装全流程(附安装包下载)
  • 20250818在荣品的PRO-RK3566开发板跑Buildroot的时候使用在线秒表https://tool.hiofd.com/stopwatch/
  • Python循环语句 从入门到精通
  • 【运维进阶】LNMP + WordPress 自动化部署实验
  • 第十六届蓝桥杯青少组C++省赛[2025.8.10]第二部分编程题(5、环形取硬币游戏)
  • Baumer高防护相机如何通过YoloV8深度学习模型实现网球运动员和网球速度的检测分析(C#代码UI界面版)
  • Opsqueue:为重负载而生的轻量级批处理队列,已开源!
  • Bellman-Ford与spfa算法简介
  • ARM架构下的cache transient allocation hint以及SMMUv2的TRANSIENTCFG配置详解
  • 大数据时代时序数据库选型指南:深度解析与 Apache IoTDB 实践
  • C++对象的内存布局
  • 一般情况下,python函数都会返回对象,但有时只调用一个函数,这是在修改这个信息
  • 【笔记】扩散模型(一一):Stable Diffusion XL 理论与实现
  • STRIDE威胁模型