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)及密钥。 |
交互流程示例
- 邻居发现
- R1发送Hello包 → R2回复Hello包(包含R1的Router ID)→ 进入
2-Way
状态。
- R1发送Hello包 → R2回复Hello包(包含R1的Router ID)→ 进入
- 数据库同步
- 交换DBD包协商主从 → 进入
Exchange
状态 → 对比LSA摘要。
- 交换DBD包协商主从 → 进入
- 请求缺失LSA
- 发送LSR请求缺失条目 → 邻居回复LSU → 进入
Loading
状态。
- 发送LSR请求缺失条目 → 邻居回复LSU → 进入
- 完成同步
- 所有LSA确认后进入
Full
状态 → 触发SPF计算生成路由表。
- 所有LSA确认后进入
关键区别
数据包 | 传输内容 | 可靠性机制 | 组播地址 |
---|---|---|---|
Hello | 邻居参数 | 周期性发送 | 224.0.0.5 |
DBD | LSDB摘要 | 主从协商+序列号 | 单播 |
LSR | 请求的LSA标识 | 显式请求 | 单播 |
LSU | 完整LSA | LSAck确认 | 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 ,默认值 1 。0 表示不参与选举。 |
Router ID | 全网唯一的32位标识符,通常为最大环回口或物理接口IP地址。 |
选举优先级顺序
- 最高优先级:比较所有参与选举的路由器接口优先级,值最大者胜出。
- 最大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
- 候选列表:所有接口优先级
>0
的路由器参与选举。 - 选举DR:
- 从候选列表中选出优先级最高的路由器作为DR。
- 若存在多个相同优先级,选择Router ID最大的。
- 选举BDR:
- 在剩余候选路由器中,选出优先级最高的作为BDR。
- 若优先级相同,同样比较Router ID。
步骤4:角色确认
- 选举结果通过Hello包通告给所有邻居:
- DR和BDR的IP地址写入Hello包的
DR
和BDR
字段。 - 其他路由器(DROther)不再尝试成为DR/BDR。
- DR和BDR的IP地址写入Hello包的
4. 非抢占式选举机制
- 关键特性:一旦DR/BDR选举完成,即使新加入的路由器优先级更高,也不会立即抢占现有角色。
- 触发重新选举的条件:
- DR故障:BDR自动升级为DR,重新选举BDR。
- BDR故障:直接选举新的BDR。
- 同时DR和BDR故障:触发全新选举。
三、OSPF 工作过程详解
OSPF 协议通过分层状态机实现邻居发现、拓扑同步和路由计算,其核心流程如下:
1. 邻居发现与关系建立
- 数据包:Hello 包(类型1)
- 关键步骤:
- 初始状态(Down):接口启用OSPF后,开始发送Hello包。
- 单向通信(Init):收到邻居的Hello包但未在对方邻居列表中发现自己。
- 双向通信(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)
- 流程:
- 发送LSR请求缺失的LSA。
- 邻居回复LSU携带完整LSA。
- 接收方通过LSAck确认LSU。
- 所有LSA同步完成后,进入
Full
状态(完全邻接)。
3. 路由计算(SPF算法)
- 触发条件:
- 初次进入
Full
状态。 - 网络拓扑变化(如收到LSU更新)。
- 初次进入
- 步骤:
- 基于LSDB构建有向图(Shortest Path Tree)。
- 使用Dijkstra算法计算到达各网络的最短路径。
- 更新路由表,标记最优路径。
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 状态(需手动指定邻居)。
- 主动发送Hello包(组播地址
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(不建立邻接)。
- 检查DR/BDR角色:
- 点对点网络:直接进入 ExStart 状态。
- 广播/NBMA网络:
- 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。
- 退出条件:
- 所有摘要交换完成 → 进入 Loading 或 Full 状态。
7. Loading
- 描述:请求并接收完整的LSA条目。
- 交互流程:
- 发送LSR(Link State Request)请求缺失的LSA。
- 邻居回复LSU(Link State Update)携带完整LSA。
- 接收方通过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-Way | DR/BDR角色确认或点对点网络 | ExStart |
ExStart | 主从协商完成 | Exchange |
Exchange | DBD摘要交换完成,无缺失LSA | Full |
Exchange | DBD摘要交换完成,发现缺失LSA | Loading |
Loading | 所有LSR请求的LSA已确认 | Full |
关键注意事项
- 非抢占式选举:DR/BDR一旦选举完成,除非故障否则不重新选举。
- 网络类型影响:
- 广播/NBMA网络:DROther间保持2-Way,仅与DR/BDR建立Full邻接。
- 点对点网络:直接建立Full邻接。
- 常见故障点:
- 卡在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 # 实时跟踪邻接建立过程(慎用)