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

OSPF数据包及工作过程

文章目录

    • 一、OSPF 数据包类型详解
      • 1. Hello 数据包(类型 1)
      • 2. 数据库描述包(DBD,类型 2)
      • 3. 链路状态请求包(LSR,类型 3)
      • 4. 链路状态更新包(LSU,类型 4)
      • 5. 链路状态确认包(LSAck,类型 5)
      • 通用数据包头部(24字节)
      • 交互流程示例
      • 关键区别
    • 二、OSPF DR/BDR 选举机制详解
      • 1. 为什么需要DR/BDR?
      • 2. 选举规则
        • 核心参数
        • **选举优先级顺序**
      • 3. 选举流程
        • 步骤1:初始Hello包交互
        • 步骤2:等待邻居发现
        • 步骤3:选举DR/BDR
        • 步骤4:角色确认
      • 4. 非抢占式选举机制
    • 三、OSPF 工作过程详解
      • 1. 邻居发现与关系建立
      • 2. 数据库同步(LSDB同步)
        • a. 主从协商(ExStart状态)
        • b. 摘要交换(Exchange状态)
        • c. 请求与更新(Loading/Full状态)
      • 3. 路由计算(SPF算法)
      • 4. 拓扑维护与更新
      • 5. 状态机转换表
      • 6. 关键注意事项
    • 四、OSPF状态机详解
      • 1. Down(稳定状态)
      • 2. Attempt(仅NBMA网络)
      • 3. Init
      • 4. 2-Way(稳定状态)
      • 5. ExStart
      • 6. Exchange
      • 7. Loading
      • 8. Full(稳定状态)
      • 状态转换触发总结
      • 关键注意事项
      • 验证命令示例(Cisco)

一、OSPF 数据包类型详解

OSPF(开放最短路径优先)协议通过以下五种核心数据包实现邻居维护、数据库同步和路由计算:


1. Hello 数据包(类型 1)

  • 功能

    • 发现邻居并维护邻接关系(周期性发送)。
    • 确保双向通信(通过邻居列表验证)。
    • 在广播网络中选举 DR(指定路由器)和 BDR(备份指定路由器)。
  • 关键字段

    • 网络掩码:(Network Mask):一旦路由器的某个接口激活了OSPF,该接口即开始发送Hello报文,该字段填充的是该接口的网络掩码。两台OSPF 路由器如果通过以太网接口直连,那么双方的直连接口必须配置相同的网络掩码,否则影响邻居关系建立

    • Hello间隔(默认10(P2P)/30秒(P2MP))(Hello Interval):接口周期性发送Hello报文的时间间隔(单位为s)。两台直连路由器要建立OSPF邻居关系,需确保接口的Hello Interval相同,否则邻居关系无法正常建立。

    • Dead间隔(4倍Hello时间)(Router Dead Interval):在邻居路由器被视为无效前,需等待收到对方Hello报文的时间(单位为s)。两台直连路由器要建立OSPF 邻居关系,需确保双方直连接口的Router Dead Interval相同,否则邻居关系无法正常建立。缺省情况下,OSPF路由器接口的Router Dead Interval为该接口的Hello Interval的4倍。。

    • 可选项(Options):该字段一共8bit,每个比特位都用于指示该路由器的某个特定的OSPF 特性。Options字段中的某些比特位会被检查,这有可能会直接影响到OSPF邻接关系的建立。(特殊区域的标记)

    • 指定路由器(Designated Router):网络中DR的接口IP地址。如果该字段值为0.0.0.0,则表示没有DR,或者DR尚未选举出来

    • 备份指定路由器(Backup Designated Router):网络中 BDR的接口IP地址。如果该字段值为0.0.0.0,则表示网络中没有BDR,或者BDR尚未选举出来。

    • 邻居(Neighbor)。在直连链路上发现的有效邻居,此处填充的是邻居的Router-iD,如果发现了多个邻居,则包含多个邻居字段。

  • 交互规则

    • 组播地址 224.0.0.5
    • 参数不匹配(如区域ID不一致)则无法建立邻居。

2. 数据库描述包(DBD,类型 2)

  • 功能

    • 通过摘要(LSA头部)同步链路状态数据库(LSDB)。
    • 使用主从(Master/Slave)机制控制同步顺序。
  • 关键字段

    • 接口最大传输单元(Interface Maximum Transmission Unit):接口的MTU。

    • 可选项(Options):路由器支持的OSPF可选项

    • l DD报文置位符:

      ​ I:init位,I=1,这是第一个DD报文

      ​ M:more位,M=1表示后续还有DD报文

      ​ MS:master位,MS=1,表示本端为主

    • DD序列号(DD Sequence Number): DD报文的序列号,在DD报文交互的过程中,DD序列号被逐次加1,用于确保DD报文传输的有序和可靠性。值得注意的是,DD序列号必须是由Master路由器来决定的,而Slave路由器只能使用Master路由器发送的DD序列号来发送自己的DD报文。(route id大的设备会成为master

    • l LSA头部(LSA Header):当路由器使用DD报文来描述自己的LSDB时,LSA的头部信息被包含在此处。一个DD报文可能包含一条或多条LSA的头部。

    在这里插入图片描述

  • 交互流程

    • 邻居进入 ExStart 状态协商主从角色。
    • 主路由器发送第一个DBD包启动同步。

3. 链路状态请求包(LSR,类型 3)

  • 功能

    • 请求缺失或过期的完整LSA条目。
  • 触发条件

    • 收到DBD包后,若本地LSDB缺少某些LSA或版本较旧。
  • 关键字段

    • 请求的LSA类型、链路状态ID、通告路由器ID ---- “LSA三元组” — 通过这三个参数可以唯一的标识出一条LSA。
    • 在这里插入图片描述

4. 链路状态更新包(LSU,类型 4)

  • 功能

    • 携带完整LSA信息,用于响应LSR或主动通告网络变化。
  • 触发条件

    • 当路由器感知到网络发生变化时,也可以触发LSU报文的泛洪,以便将该变化通知给网络中的其他OSPF 路由器。
    • 在MA网络中,非 DR、BDR路由器(DRother)向224.0.0.6这个组播地址发送LSU报文,而DR及 BDR会侦听这个组播地址,DR在接收LSU报文后向224.0.0.5发送LSU报文,从而将更新信息泛洪到整个OSPF区域,所有的OSPF 路由器都会侦听224.0.0.5这个组播地址。
  • 关键字段

    • 包含一个或多个LSA(如Router LSA、Network LSA等)。

      在这里插入图片描述

  • 交互规则

    • 普通路由器使用组播地址 224.0.0.5
    • DR/BDR 使用 224.0.0.6 接收更新。

5. 链路状态确认包(LSAck,类型 5)

  • 功能

    • 确认已收到LSU包,确保可靠传输。
    • 报文中包含着路由器所确认的LSA的头部(每个LSA头部的长度为20byte)

    在这里插入图片描述

  • 交互方式

    • 单播或组播发送,包含被确认LSA的头部信息。
    • 未收到确认时,LSU会重传(最大重传次数后判定邻居失效)。

通用数据包头部(24字节)

所有OSPF数据包共享一个24字节的头部,包含以下字段:

在这里插入图片描述

字段描述
版本OSPF版本(v2用于IPv4,v3用于IPv6)。
类型数据包类型(1~5)。
数据包长度包括头部在内的总字节数。
Router ID发送路由器的唯一标识(通常为最大IP地址)。
区域ID数据包所属区域(骨干区域为0.0.0.0)。
校验和校验数据包完整性。
认证字段认证类型(0-无认证,1-明文,2-MD5)及密钥。

交互流程示例

  1. 邻居发现
    • R1发送Hello包 → R2回复Hello包(包含R1的Router ID)→ 进入 2-Way 状态。
  2. 数据库同步
    • 交换DBD包协商主从 → 进入 Exchange 状态 → 对比LSA摘要。
  3. 请求缺失LSA
    • 发送LSR请求缺失条目 → 邻居回复LSU → 进入 Loading 状态。
  4. 完成同步
    • 所有LSA确认后进入 Full 状态 → 触发SPF计算生成路由表。

关键区别

数据包传输内容可靠性机制组播地址
Hello邻居参数周期性发送224.0.0.5
DBDLSDB摘要主从协商+序列号单播
LSR请求的LSA标识显式请求单播
LSU完整LSALSAck确认224.0.0.5/6
LSAck确认的LSA头部单播或组播

:OSPF通过序列号(Sequence Number)、老化时间(Age)和校验机制确保LSA的准确性和一致性。

二、OSPF DR/BDR 选举机制详解

DR(Designated Router,指定路由器)和BDR(Backup Designated Router,备份指定路由器)是OSPF在广播型多路访问网络(如以太网)和非广播多路访问网络(如帧中继)中优化LSA泛洪的关键角色。以下是其选举过程的核心逻辑:


1. 为什么需要DR/BDR?

  • 减少邻接关系数量:在N台路由器的网络中,若不使用DR/BDR,需建立 N(N-1)/2 个邻接关系,而使用DR/BDR后仅需 2(N-1) 个。
  • 抑制泛洪风暴:所有非DR/BDR路由器(DROther)仅与DR/BDR交换LSA,避免全网泛洪。

2. 选举规则

核心参数
参数描述
接口优先级范围 0-255,默认值 10表示不参与选举。
Router ID全网唯一的32位标识符,通常为最大环回口或物理接口IP地址。
选举优先级顺序
  1. 最高优先级:比较所有参与选举的路由器接口优先级,值最大者胜出。
  2. 最大Router ID:若优先级相同,Router ID最大的路由器当选。

3. 选举流程

步骤1:初始Hello包交互
  • 路由器启动后,通过组播地址 224.0.0.5 发送Hello包,包含:
    • 自身接口优先级
    • 当前已知的DR/BDR信息(初始为空)
步骤2:等待邻居发现
  • 路由器进入 2-Way 状态后,检查邻居的Hello包中的DR/BDR字段:
    • 若网络中已有DR/BDR,新加入的路由器接受现有角色(非抢占式)。
    • 若无DR/BDR(如首次启动),触发选举。
步骤3:选举DR/BDR
  1. 候选列表:所有接口优先级 >0 的路由器参与选举。
  2. 选举DR
    • 从候选列表中选出优先级最高的路由器作为DR。
    • 若存在多个相同优先级,选择Router ID最大的。
  3. 选举BDR
    • 在剩余候选路由器中,选出优先级最高的作为BDR。
    • 若优先级相同,同样比较Router ID。
步骤4:角色确认
  • 选举结果通过Hello包通告给所有邻居:
    • DR和BDR的IP地址写入Hello包的 DRBDR 字段。
    • 其他路由器(DROther)不再尝试成为DR/BDR。

4. 非抢占式选举机制

  • 关键特性:一旦DR/BDR选举完成,即使新加入的路由器优先级更高,也不会立即抢占现有角色。
  • 触发重新选举的条件
    • DR故障:BDR自动升级为DR,重新选举BDR。
    • BDR故障:直接选举新的BDR。
    • 同时DR和BDR故障:触发全新选举。

三、OSPF 工作过程详解

OSPF 协议通过分层状态机实现邻居发现、拓扑同步和路由计算,其核心流程如下:


1. 邻居发现与关系建立

  • 数据包:Hello 包(类型1)
  • 关键步骤
    1. 初始状态(Down):接口启用OSPF后,开始发送Hello包。
    2. 单向通信(Init):收到邻居的Hello包但未在对方邻居列表中发现自己。
    3. 双向通信(2-Way):在邻居Hello包中发现自己的Router ID,进入2-Way状态。
  • 特殊场景
    • 在广播/NBMA网络中,此时触发 DR/BDR选举(优先级 > Router ID)。
    • 点对点网络直接进入下一步。

2. 数据库同步(LSDB同步)

a. 主从协商(ExStart状态)
  • 数据包:空的DBD包(类型2),携带I,M,MS标志位,协商主从
  • 作用:确定主(Master)和从(Slave)角色,控制DBD包传输顺序。
  • 规则:Router ID大的成为Master。
b. 摘要交换(Exchange状态)
  • 数据包:携带LSA摘要的DBD包
  • 作用:双方交换LSDB中LSA的头部信息(类型、链路ID、序列号等)。
  • 结果:对比摘要后,标记本地缺失或过期的LSA。
c. 请求与更新(Loading/Full状态)
  • 数据包:LSR(类型3)、LSU(类型4)、LSAck(类型5)
  • 流程
    1. 发送LSR请求缺失的LSA。
    2. 邻居回复LSU携带完整LSA。
    3. 接收方通过LSAck确认LSU。
    4. 所有LSA同步完成后,进入Full状态(完全邻接)。

3. 路由计算(SPF算法)

  • 触发条件
    • 初次进入Full状态。
    • 网络拓扑变化(如收到LSU更新)。
  • 步骤
    1. 基于LSDB构建有向图(Shortest Path Tree)。
    2. 使用Dijkstra算法计算到达各网络的最短路径。
    3. 更新路由表,标记最优路径。

4. 拓扑维护与更新

  • 周期性维护
    • Hello包保活(默认10秒/30秒)(周期保活)。
    • LSA每30分钟刷新(防止序列号溢出)(周期更新)。
  • 事件驱动更新
    • 链路故障:立即发送LSU通告失效LSA。
    • 新邻居加入:触发局部LSDB同步。
  • 泛洪机制
    • LSU通过组播(224.0.0.5/6)扩散。
    • 每跳路由器确认(LSAck)并转发,直至全网同步。

5. 状态机转换表

状态描述触发条件
Down未检测到邻居接口初始化或邻居失效超时
Init收到邻居Hello但未双向通信收到Hello包且未在对方邻居列表
2-Way双向通信建立双方Hello包中包含彼此的Router ID
ExStart主从角色协商开始DBD交换
Exchange交换LSA摘要主从角色确定后
Loading请求缺失LSA发现本地LSDB不完整
Full完全邻接,路由计算就绪所有LSA同步完成

6. 关键注意事项

  • 网络类型影响
    • 广播/NBMA网络依赖DR/BDR转发LSU。
    • 点对点网络直接泛洪,无需DR/BDR。
  • 收敛优化
    • 增量SPF(iSPF)仅计算变化部分。
    • 路由抑制(Throttling)防止高频SPF计算。
  • 认证机制:所有OSPF包需通过认证(明文/MD5),否则丢弃。

四、OSPF状态机详解

OSPF 邻居关系通过状态机(Finite State Machine)管理,定义了路由器从发现邻居到建立完全邻接的全过程。以下是各状态的转换逻辑及关键行为:


1. Down(稳定状态)

  • 描述:初始状态,表示未收到任何来自邻居的Hello包。
  • 触发动作
    • 主动发送Hello包(组播地址 224.0.0.5)。
    • 若为NBMA网络,转为 Attempt 状态(需手动指定邻居)。

2. Attempt(仅NBMA网络)

  • 描述:在NBMA网络中,路由器尝试通过单播与配置的邻居建立连接。
  • 触发条件
    • 管理员手动配置了邻居IP地址。
  • 退出条件
    • 收到邻居回复的Hello包 → 进入 Init 状态。
    • 超时未收到回复 → 回到 Down 状态。

3. Init

  • 描述:已收到邻居的Hello包,但未在对方Hello包的邻居列表中发现本机Router ID。
  • 关键行为
    • 继续周期性发送Hello包。
    • 若后续Hello包中邻居列表包含本机Router ID → 进入 2-Way 状态。

4. 2-Way(稳定状态)

  • 描述:双向通信确认,双方均将对方加入邻居列表。
  • 关键逻辑
    • 广播/NBMA网络
      • 检查DR/BDR角色:
        • 若本机或邻居为DR/BDR → 进入 ExStart 状态。
        • 若双方均为DROther → 保持2-Way(不建立邻接)。
    • 点对点网络:直接进入 ExStart 状态。
  • 2-Way的前提
    • Router-id无冲突,修改router-id需要重置ospf进程使生效;
    • 掩码长度一致(MA网络中);
    • 区域ID一致;
    • 验证密码一致;
    • hello-time一致;
    • dead-time一致;
    • 特殊区域类型一致;

5. ExStart

  • 描述:交换开始状态(主从协商),通过交换空的DBD包协商主从(Master/Slave)关系。
  • 协商规则
    • Router ID较大者成为Master,控制DBD包的序列号递增(slave只能使用master发送的seq)。
  • 退出条件
    • 主从角色确定 → 进入 Exchange 状态。

6. Exchange

  • 描述:交换携带LSA摘要的DBD包,同步LSDB摘要信息。
  • 关键行为
    • Master优先发送DBD包,Slave根据Master的序列号回复。
    • 对比本地与邻居的LSA摘要,标记缺失或过期的LSA。
  • 退出条件
    • 所有摘要交换完成 → 进入 LoadingFull 状态。

7. Loading

  • 描述:请求并接收完整的LSA条目。
  • 交互流程
    1. 发送LSR(Link State Request)请求缺失的LSA。
    2. 邻居回复LSU(Link State Update)携带完整LSA。
    3. 接收方通过LSAck确认 → 重复至所有LSA同步完成。
  • 退出条件:所有LSA同步 → 进入 Full 状态。

8. Full(稳定状态)

  • 描述:完全邻接状态,LSDB完全同步,触发SPF计算生成路由表。

  • full的前提:

    • 两端MTU一致,否则可能卡在EXSTART\Exchange状态
  • 计算路由的前提:

    • 两端网络类型一致,否则邻居状态full,但无法学习路由
  • 后续行为

    • 周期性发送Hello包维持邻居关系。
    • 网络变化时通过LSU泛洪更新,重新同步LSDB。

状态转换触发总结

当前状态触发条件下一状态
Down发送Hello包Init
Init收到Hello包且本机Router ID出现在邻居列表中2-Way
2-WayDR/BDR角色确认或点对点网络ExStart
ExStart主从协商完成Exchange
ExchangeDBD摘要交换完成,无缺失LSAFull
ExchangeDBD摘要交换完成,发现缺失LSALoading
Loading所有LSR请求的LSA已确认Full

关键注意事项

  1. 非抢占式选举:DR/BDR一旦选举完成,除非故障否则不重新选举。
  2. 网络类型影响
    • 广播/NBMA网络:DROther间保持2-Way,仅与DR/BDR建立Full邻接。
    • 点对点网络:直接建立Full邻接。
  3. 常见故障点
    • 卡在Init:Hello参数(区域ID、认证、掩码)不匹配。
    • 卡在ExStart:MTU不一致或组播通信故障。
    • 卡在Loading:LSAck未确认导致LSU重传失败。

验证命令示例(Cisco)

show ip ospf neighbor          # 查看邻居状态及角色
show ip ospf interface gi0/1  # 检查接口状态和DR/BDR选举
debug ip ospf adj             # 实时跟踪邻接建立过程(慎用)

相关文章:

  • PaginationInnerInterceptor使用(Mybatis-plus分页)
  • 基于遗传算法的智能组卷系统设计与实现(springboot+ssm+React+mysql)含万字详细文档
  • 【项目管理】成本类计算 笔记
  • 基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结
  • 在ARM Linux应用层下驱动MFRC522
  • vue项目中使用antvX6(可拖拽,vue3)
  • 【Vue】组件基础
  • 浙江大学 DeepSeek 公开课 第三季 第1期讲座 - 唐谈 研究员 (附PPT下载) | 突破信息差
  • 【Linux网络】构建UDP服务器与字典翻译系统
  • 基于LangChain与Neo4j构建企业关系图谱的金融风控实施方案,结合工商数据、供应链记录及舆情数据,实现隐性关联识别与动态风险评估
  • java 使用Caffeine实现本地缓存
  • 归一化对C4.5决策树无效的数学原理与实证分析
  • ios17 音频加载失败问题
  • 基础服务系列-Mac Ngrok 内网穿透
  • 如何在腾讯云Ubuntu服务器上部署Node.js项目
  • Novartis诺华制药社招入职综合能力测评真题SHL题库考什么?
  • 在kali中安装AntSword(蚁剑)
  • 【 Git 全局忽略文件完全指南:配置、规则与最佳实践】
  • 强化学习系统学习路径与实践方法
  • 微软Edge浏览器字体设置
  • 甘肃古浪县发生3.0级地震,未接到人员伤亡和财产损失报告
  • 管理规模归零,华夏基金“ETF规模一哥”张弘弢清仓卸任所有产品
  • 租到“甲醛房”,租客可以解约吗?租金能要回来吗?
  • 二十届中央第五轮巡视完成进驻
  • 法治课|男子同时与两名女子办婚礼闹剧,是否应受处罚?