Router ID
概述
- 运行OSPF协议之前,必须选取一个RID
- 用来标识唯一的OSPF路由器
- RID可以自动选取,也可以手动配置
选取规则
图表
规则 备注 RID选取顺序规则 1. 手动配置(推荐使用)
2. 活动的回环接口上选择IP地址最高的
3. 活动的物理接口上选择IP地址最高的PS RID的选取具有非抢占性,除非重启OSPF进程
OSPF数据包结构和类型(封装在IP协议之上,IP协议号89)
数据包结构
包结构图示
OSPF数据报头
图表
名字 释义 备注 OSPF Header OSPF数据包报头 Version:2 OSPF的版本号 IPv4 版本号是2
IPv5版本号是3Message Type:Hello Packet(1) 数据包类型 有五种类型 Packet Length:44 数据包长度 不同类型的数据包长度不同 Source OSPF Router:192.168.1.254 OSPF的RID
(路由器ID)OSPF协议的Route ID Area ID:0.0.0.0(Backbone) 区域ID 0代表骨干网
其他数字代表非骨干网Checksum:0x0c51[correct] 校验和 Auth Type:Null(0) 认证方式 两种认证方式 Auth Data(none):00000000000000 认证数据信息
* 解析图示
* ![alt OSPF包结构-数据报头解析](https://i.loli.net/2021/04/09/unTewRbU6cHPMK9.png)
* 抓包图示
* ![alt OSPF包结构-数据包报头](https://i.loli.net/2021/04/09/bOPS9lIFo51Yq2W.png)
数据包类型
图示
作用
图表
OSPF数据包类型 作用 Hello包 建立、维护邻居关系 Database Description 数据库描述(DD) LSDB摘要(仅仅包含LSA头部Header信息)
与邻居的LSDB数据库进行比对,只记录自己没有的LSLink-State Request 链路状态请求 询问邻居LSA的信息
请求LSA,不是一个数据包Linl-State Update 链路状态更新 当自己LS发生变化,给邻居发送LS更新信息 Link-State Acknowledgment链路状态确认 收到邻居发送的LS更新信息,给邻居发送一个ACK确认信息
* 实验
* 拓扑
* ![alt OSPF数据包类型实验](https://i.loli.net/2021/04/09/XAVBSEnQmF8dgTv.png)
* 配置
* R1配置
1
2
3
4
5
6
7
8
sys
sys R1
int g 0/0/1
ip add 12.0.0.1 24
ospf 1 route-id 1.1.1.1
area 0
network 12.0.0.0 0.0.0.255
* R2配置
1
2
3
4
5
6
7
8
sys
sys R2
int g 0/0/0
ip add 12.0.0.2 24
ospf 1 route-id 2.2.2.2
area 0
network 12.0.0.0 0.0.0.255
* 图示
* ![alt OSPG数据包类型抓包结果](https://i.loli.net/2021/04/09/wvEKjietu1IcXCT.png)
DD数据信息(Database Description)包
- 图示
- 通过Sequence Number 来区分不同的LS信息
- 图示
图示
OSPF状态机制
1. OSPF状态概述
图示
图表
状态 | 备注 |
---|---|
down 失效状态 | 没有收到Hello包 |
Init 初始状态 | 收到Hello包,邻居的Hello包中的邻居列表没有自己的路由信息 |
2-way 双向通信状态 | 收到Hello包,并且邻居发送的Hello包中的邻居列表中包含自己的路由信息 此时,两个邻居路由器形成邻居关系 |
ExStart 交换初始状态 | 决定信息交换时路由器的主从关系 向邻居第一次发送DD(Database Description)数据包中的RID来确定主从关系 |
ExChange 交换状态 | 向邻居发送DD(Database Description)数据包 |
Loading加载状态 | LSR和LSU交换、LSACK确认 |
Full 完全邻接状态 | LSDB同步,形成邻接关系 |
PS | 只有2-way状态和Full状态是稳定状态 |
概述
创建邻居
down 失效状态
- 路由器没有使用OSPF协议
- 路由器没有邻居
Init 初始状态
- 路由器收到了邻居的Hello包,但是邻居的Hallo包中的邻居列表没有有关该路由器的路由信息
- A泛洪: 大家好,我是A,我没有邻居
- B泛洪:大家好,我是B,我有个邻居是A(此时A对于B来说就是Init状态)
2-way 双向通信状态
- 路由器收到邻居的Hello包,并且邻居Hello包中的邻居列表中有自己的路由信息
- A泛洪: 大家好,我是A,我没有邻居
- B泛洪:大家好,我是B,我有个邻居是A(此时A对于B来说就是Init状态)
- 此时,A收到B泛洪的Hello包中的邻居列表中有自己的信息,进入2-way状态
- 通过上面的状态变化,路由器的邻居关系创建成功
图示
邻居状态的建立
创建邻接
ExStart 交换初始状态
- 建立邻居关系的两个路由器,互相发送第一个DD(Database Description)数据包
- 对两个路由器发送的第一个DD(Database Description)数据包中的RID(Router ID)进行对比,选择一个作为Master(RID大的作为Master)
ExChange 交换状态
- 建立邻居关系的路由器,再次发送DD(Database Description)数据包。
- 比对两个DD(Database Description)数据包中的LSDB(Link-State Database)是否一致。
- 如果一致,路由器状态为FULL 安全邻接状态
- 如果不一致,路由器发送LSR(Link-State Request)数据包给邻居,邻居会发送LSU(Link-State Request)数据包,路由器发送LSACK(Link-State Acknowlege)数据包确认。
Loading 加载状态
- 建立邻居关系的路由器,比对DD(Database Description)数据包中的LSDB(Link-State Database)。
- 如果LSDB不一致,路由器发送LSR(Link-State Request)数据包给邻居,邻居发送LSU(Link-State Update)数据包,路由器发送LSACK(Link-State Acknowlege)数据包确认。
Full 完全邻接状态
- 如果LSDB一致,Full完全邻接状态建立
- 只要邻居LSDB一致,进入Full状态
- 只有2-way和Full状态是稳定状态
图示
建立邻接关系