OSPF数据包与状态

Router ID

  • 概述

    • 运行OSPF协议之前,必须选取一个RID
    • 用来标识唯一的OSPF路由器
    • RID可以自动选取,也可以手动配置
  • 选取规则

    • 图表

      规则 备注
      RID选取顺序规则 1. 手动配置(推荐使用)
      2. 活动的回环接口上选择IP地址最高的
      3. 活动的物理接口上选择IP地址最高的
      PS RID的选取具有非抢占性,除非重启OSPF进程
  • 手动配置方式

    • 命令

      1
      2
      3
      ospf 1 route-id 1.1.1.1
      # 重启 OSPF 进程
      <R1>reset ospf process
  • 图表

    • alt RID选取规则

OSPF数据包结构和类型(封装在IP协议之上,IP协议号89)

  • 数据包结构

    • 包结构图示

      • alt OSPF数据包结构
    • OSPF数据报头

      • 图表

        名字 释义 备注
        OSPF Header OSPF数据包报头
        Version:2 OSPF的版本号 IPv4 版本号是2
        IPv5版本号是3
        Message 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)
  • 数据包类型

    • 图示

      • alt OSPF数据包类型
    • 作用

      • 图表

        OSPF数据包类型 作用
        Hello包 建立、维护邻居关系
        Database Description 数据库描述(DD) LSDB摘要(仅仅包含LSA头部Header信息)
        与邻居的LSDB数据库进行比对,只记录自己没有的LS
        Link-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)包

    • 图示
      • alt OSPF数据包类型-DD数据包
    • 通过Sequence Number 来区分不同的LS信息
  • 图示

    • alt OSPF数据包类型

OSPF状态机制

1. OSPF状态概述

图示

alt 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状态是稳定状态

概述

  1. 创建邻居

    • 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状态
      • 通过上面的状态变化,路由器的邻居关系创建成功
    • 图示

      • 邻居状态的建立

        alt OSPF邻居状态的建立

  2. 创建邻接

    • 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状态是稳定状态
    • 图示

      • 建立邻接关系

        alt 建立邻接关系流程

        alt 建立邻接关系2

吴超 wechat
subscribe to my blog by scanning my public wechat account