1. Open Shortest path first(开放最短路径优先)特征


  • 采用 SPF 算法(迪杰斯特拉算法 Dijkstra),基于 IGP 协议、链路状态路由协议(工作在 IP 层面),是无类协议(更新时带掩码),支持VISM(可变长子网掩码)和CIDR(无类域间路由)
  • IP 协议号 「89」
  • 支持区域划分,可以缩小 LSDB,减少 SPF 算法的运行
  • 只有在同一个区域内才使用 SPF 算法,区域之间的路由通过「骨干区域」来转发
  • 域内是链路状态算法绝对无环,但是域间是距离矢量算法有可能有环
    • 同区域中 LSDB 一致
    • 不同区域 LSDB 不一致
  • 封装在 IP 报文中,采用「组播方式」发现邻居和更新报文
    • 224.0.0.5(All-SPF Router):所有运行 OSPF 设备监听的地址(DR、BDR 向 DR Other 发送 DD、LSA 报文时使用)
    • 224.0.0.6(All-DR/BDR Router):只有 DR/BDR 设备监听的地址(DR Other 向 DR、BDR 发送 DD、LSA 报文时使用)
  • OSPF 区域内部优先级是「10」,区域外部优先级是「150」(只能手工修改外部优先级)
  • OSPF 路由的选路优先级
    • Cisco:O > OIA > OE1 > ON1 > OE2 > ON2
    • Huawei:域内 > 域间 > OE1 or ON1 > OE2 or ON2
  • 采用触发更新机制
  • 为了确保 LSDB 的完整可靠性,OSPF「每 1800s」更新邻居状态信息
  • OSPF 需要维护三张表
    • 邻居表
    • 拓扑表
    • 路由表
  • 支持三种认证
    • 不认证
    • 简单明文认证
    • MD5 认证
  • 在单区域内只要有 1、2类 LSA 发生变化,整个 OSPF 区域都会受到影响(SPF 算法),其他 LSA 变化,整个 OSPF 几乎不受到影响
  • 在多区域内只要有 1、2类 LSA 发生变化,整个 OSPF 区域都会受到影响(SPF 算法),其他 LSA 变化,整个 OSPF 几乎不受到影响。ABR 上有汇总路由;OSPF 中有Stub、Nssa节点不会受到影响

    2. 术语


  • 链路状态通告(LSA):链路状态信息的集合(包含接口地址、掩码、链路类型、链路上 DR 设备的 Router ID)
  • 链路状态更新(LSU):是 LSA 的载体,通过 LSU 承载多条 LSA
  • 链路状态数据库(LSDB):包含整个区域中所有网络的地图
  • SPF 算法:以自身为根,其他设备为叶,计算出到达叶的最短路径树
  • 链路(Link):路由器上的一个接口
  • 区域(Area):由同一组路由器组成,共享相同 LSDB
  • 邻居关系(2-Way):通过交互 Hello 报文,知道链路对端的设备
  • 邻接关系(Full):在邻居关系基础上,交互链路状态信息,彼此交互自身的 LSA,形成完整的 LSDB
  • OSPF 自治系统:采用同一种路由协议,交换路由信息的路由和网络

    3. OSPF 的特性


1)区域概念

只有链路状态协议才有区域概念

  • OSPF 划分区域可以减少 LSA 泛洪 | 区域类型 | LSA Type 1 | LSA Type 2 | LSA Type 3 | LSA Type 4 | LSA Type 5 | LSA Type 7 | | —- | —- | —- | —- | —- | —- | —- | | 标准区域(包括骨干和标准区域) | √ | √ | √ | √ | √ | × | | Stub 区域 | √ | √ | √ | × | × | × | | Totally Stub 区域 | √ | √ | × | × | × | × | | NSSA 区域 | √ | √ | √ | × | ⭕️ | √ | | Totally NSSA区域 | √ | √ | × | × | × | √ |

① 骨干区域

  • [Area 0],全网只有一个(不可分割)

    ② 标准区域

  • 除了 Area 0 以外的所有区域

  • 所有的标准区域都需要连接[Area 0]

    2)路由器类型

  • 内部路由器:所有接口都属于同一个区域

  • 骨干路由器:至少有一个接口属于骨干区域
  • 区域边界路由器(ABR):同时属于两个以上的区域,但必须有一个是骨干区域。将普通区域和骨干区域连接在一起
  • AS边界路由器(ASBR):与其他路由协议交换路由信息的设备(引入了外部路由的信息)

    3)路由器角色

    1. 在同一个网络中,只有一个 DR 和 BDR
    2. DR 和 BDR 只有在 Broadcast 和 NBMA 网络中才有作用,在 P2P 和 P2MP 中可以没有 DR 和 BDR

① 指定路由器(DR)

  • 用于同步数据库,保证数据库的一致性和完整性
  • 减少 MA 网络中邻接关系的数量

    ② 备份指定路由器(BDR)

  • 作为 DR 的备份,在 DR 失效后顶替 DR

    ③ 成员路由器(DR Other)

  • 既不是 DR 也不是 BDR 的设备

    4)DR 和 BDR 的选举规则

    • DR 要在选举期内(2-Way 状态,40s 的 Waiting Timer)进行选举,否则不进行选举[DR/BDR 不具备抢占性]
    • 同一广播域如果因为配置错误导致的双 DR/BDR 时,广播域合并时,双 DR/BDR 进行比较,未被选举上的成为 DR Other

① DR 和 BDR 选举规则

  1. 首先比较优先级,越大越优先(默认为 1,优先级范围 0~255,优先级为 0 不参与选举)
  2. 如果优先级相同,再比较 Router ID,越大越优先

    ② DR 和 BDR 选举流程

  3. 首先查看 Hello 报文中 DR 和 BDR 字段是否为空

  4. 如果都为空,会先选举出 BDR
  5. 如果 DR 字段为空,BDR 字段不为空。BDR 提升为 DR,重新选举 BDR
  6. 如果 DR 字段不为空,BDR 字段为空。重新选举 BDR

    5)Router ID

  • 用于标识区域内的唯一路由器(IPv4 格式),不可冲突(必须唯一);否则无法建立邻居关系
    • 如果二次修改了 Router ID,需要重启 OSPF 进程或者重启设备
    • 不同区域之间可以冲突,但是如果该设备变为了 ASBR 就不可冲突
  • Router ID 的生成方式

    • 全局指定:所有协议都会调用全局指定的 Router ID 作为协议的 ID
    • 协议下指定:只能用于该协议
    • 自动选举:先使用环回口 IP 地址大的接口作为 Router ID;如果没有环回口,则使用接口 IP 地址大的作为 Router ID

      6)Authentication

  • 如果一个设备配置了区域认证和接口认证,接口认证优于区域认证

  • Header 头部中的认证没有区分区域和接口,所以只要认证方式和密码相同就可以认证成功
  • 认证类型
    • 报文中Auth type=0:不认证
    • 报文中Auth type=1:简单认证
    • 报文中Auth type=2:MD5认证
  • 认证方式

    • 接口认证(只有配置了认证的接口才携带认证字段)
    • 区域认证(只要在配置了区域认证的接口都会携带认证字段)
    • Virtual Link 认证(Vlink 是属于区域认证)

      7)接口开销计算

  • 建议把参考带宽修改为整网最大链路带宽的 2 倍(所有设备都需要修改)

  • Mertic 值:108bit/接口带宽 = 100Mbit/接口带宽
  • 常用的链路开销

    • 56kbit/s 串口 → 开销的缺省值是 1785
    • 64kbit/s 串口 → 开销的缺省值是 1562
    • E1(2.048Mbit/s)→ 开销的缺省值是 48
    • Ethernet(100Mbit/s)→ 开销的缺省值是 1

      8)被动接口

  • 禁止接口接收和发送 OSPF 报文,但可以将接口地址宣告进 OSPF

    4. OSPF Message


1)Message Type

  • Hello:建立和周期性维护邻居关系
  • DD(Database Description):描述 LSDB 的摘要信息
  • LSR(Link State Request):请求具体的 LSA 信息
  • LSU(Link State Update):向邻居发送所请求的 LSA 信息
  • LSAck(Link State Acknowledgmen):对收到的 LSA 进行确认

    2)OSPF Header Message

    image.png
    OSPF Header Message 格式解析

  • Version:版本

  • Type:消息类型
    • 1 = Hello
    • 2 = DD
    • 3 = LSR
    • 4 = LSU
    • 5 = LSAck
  • Packet length:表示该 OSPF 报文的总长度
  • Router ID:发送该报文的 Router ID,32bit
  • Area ID:表示发送者属于哪个区域,32bit
  • Checksum:校验和
  • Autype:认证类型。同区域必须一致,否则无法建立邻居关系
    • 0 = 不认证
    • 1 = 简单认证(密码认证)
    • 2 = MD5 认证(Hash算法)
  • Authentication:认证密码。OSPF 的 5 种报文类型都会携带认证字段

    3)Hello Message

    ① Hello Message

    用来发现和建立邻居关系和周期性维护 OSPF 的邻居关系

  • 广播网络类型默认每「10s」发送一次,如果「4 倍的 Hello time」没有收到 Hello 报文,就会认为邻居失效

    • 可以修改 Hello 报文的更新时间;修改 Hello 时间后,Dead 会自动调整
    • 可以修改 Hello 报文的老化时间;修改 Dead 时间后,Hello 时间不会自动调整
  • NBMA 网络默认每「30s」发送一次

image.png
Hello Message 格式解析

  • Network Mask:发送 Hello 报文接口的掩码[只在 Broadcast 和 NBMA 中生效(掩码必须一致,否则无法建立邻居关系),P2P 和 P2MP 不生效]
  • Hello Interval:发送 Hello 报文的间隔时间[广播类型网络默认「10s」,如果 Hello Time 不一致会影响邻居的建立]
  • Options:可选项
    • DN = 1:用于防环,避免在 MPLS VPN 中产生环路
    • O = 1:用来支持 9、10、11类 LSA(不透明 LSA,优雅重启)
    • DC =1:在按需链路上支持 OSPF 的能力,但是会引起僵尸网络
    • L = 1:表示数据包包含 LLS 数据库
    • N/P = 1:如果是[Hello Message 表示为 N 位];如果是[LSA 表示为 P 位]
      • N:表示支持 NSSA 区域(LSA Type 7)
      • P:表示 ABR 需要将 LSA Type 7 转换为 LSA Type 5
    • MC = 1:用于支持 MOSPF
    • E = 1:用于支持 5 类 LSA(可以接收外部路由)
    • MT =1 :用于支持多拓扑
  • Rtr Pri:优先级。用来选举 DR 和 BDR,默认为 1(越大越优)
  • Router Dead Interval:死亡时间。默认是「Hello 时间的 4 倍」,如果在该时间内没有收到 Hello Message,邻居就会中断
  • Designated Router:DR 的接口地址
  • Backup Designated Router:BDR 的接口地址
  • Neighbor:活动邻居。包含所有邻居路由器的 Router ID

    ② Option 选项

    Options 字段中除了 “ DN 位 “ 以外都无法手工控制

image.png

4)DD Message

用来同步交互 LSA 的摘要信息,主要是交互「LS Type、Link state ID、Advertising」

① DD Message

image.png
DD Message 格式解析

  • Interface MTU:接口MTU。华为默认不检测 MTU(需要手工开启),如果 MTU 不一致会导致卡在 Exstart 或 Exchange 状态(Cisco 默认会检测)
  • Options:可选项
  • DB Description:数据库描述
    • I = 1:表示初始化报文
    • M = 1:表示后面还有更多报文
    • M/S = 1:表示该设备是 Master
  • DD Sequence:DD 随机序列号,用于隐式确认
  • LSA Headers:表示 DD 报文所包含的 LSA 的头部信息

    ② 主从选举

    前两个 DD 报文是空报文,用于 Master 和 Slave 的选举,主从选举后才开始交互 LSA 摘要信息,选举主从的目的是为了隐式确认

  • 主从选举是比较设备的Router ID,越大越优

    ③ 确认机制

    所有需要达到 Full 状态的设备都需要进行隐式确认的主从选举,主要是保证 LSA 能够正常同步

  • 显式确认:通过 LSR→LSU→LSAck 的确认过程

  • 隐式确认:Master 随机生成 Seq,如果 Slave 用该 Seq+1 响应,则认为 Slave 已经收到该报文(通过 Master 的 Seq 进行确认),直到 DD 报文交互完毕,如果对方没有收到对应的报文,会重新发送

    ④ MTU 的问题

    MTU 不一致不会影响邻居关系的建立(Hello 包不检测 MTU),但会邻接关系的建立(就算不检测 MTU 值,也有几率卡在 Looding 状态,因为数据会按照接口配置的 MTU 值大小进行传输)

  • 如果 Master MTU > Salve MTU,两端都会卡在 Exstart 状态(因为 Salve 的 MTU 小,无法收到 Master 发来报文,会一直将 MS-bit=1 并发送,表示自己是一个 Master)

  • 如果 Master MTU < Salve MTU,Master会卡在 Exstart 状态,Slave 会卡在 Exchange 状态(因为 Master 无法收到 Slave 的报文,Slave 却能收到 Master 的报文)

    5)LSR Message

    用来请求缺少的具体 LSA

image.png
LSR Message 格式解析

  • LS Type:LSA 类型
  • Link State ID:根据 LSA 中的 LS Type 和 LSA description 在路由域中描述一个 LSA
  • Advertising Router:产生此 LSA 的 Router ID

    6)LSU Message

    用来发送在 LSR Message 中请求的缺少 LSA,包括具体的缺少 LSA 信息(一条LSU可以包含多条LSA信息)

image.png
LSU Message 格式解析

  • Number of LSAs:LSA 的数据
  • LSA:具体的不同类型的 LSA

    7)LSAck Message

    用来确认请求缺少的具体 LSA 信息是否收到

image.png
LSAck Message 格式解析

  • LSAs Headers:通过 LSA Header 确认收到该 LSA

    5. OSPF 的网络类型


1)OSPF 网络类型分类

  • P2P:PPP、HDLC、LACP 默认都是 P2P 网络类型
  • P2MP:为了解决 NBMA 环境单独开发的网络类型,没有任何一种协议默认是 P2MP
  • MA:以太网环境默认都是广播类型
  • NBMA:FR、ATM 默认是 NBMA 类型 | 类型/报文 | Hello | DD | LSR | LSU | LSAck | Hello时间 | Dead时间 | DR/BDR | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | Broadcast | 组播 | 单播 | 单播 | 单播/组播 | 单播/组播 | 10s | 40s | 需要选举 | | P2P | 组播 | 组播 | 组播 | 组播 | 组播 | 10s | 40s | 不需要选举 | | NBMA | 单播 | 单播 | 单播 | 单播 | 单播 | 30s | 120s | 需要选举 | | P2MP | 组播 | 单播 | 单播 | 单播 | 单播 | 30s | 120s | 不需要选举 |

2)不同网络类型之间的邻接关系建立情况

不同网络类型之间 默认邻接关系建立情况 修改Hello时间后的建立情况 路由表情况 修改 Hello 时间后的路由表情况 问题原因
Broadcast 和 P2P 可以建立邻接关系 / 没有路由 /
- 因为 P2P 不选举 DR/BDR,导致没有 LSA Type 2(Broadcast 和 P2P 描述的拓扑是不一样的)
Broadcast 和 P2MP 无法建立邻接关系 可以建立邻接关系 没有路由 没有路由
- 因为 P2MP 就相当于多个 P2P,不选举 DR/BDR,导致没有 LSA Type 2(Broadcast 和 P2MP 描述的拓扑是不一样的)
Broadcast 和 NBMA 无法建立邻接关系 / 没有路由 /
- 因为 Broadcast 可以识别 NBMA 发来的单播 Hello 报文
- NBMA 无法识别 Broadcast 发来的组播 Hello 报文
P2P 和 P2MP 无法建立邻接关系 可以建立邻接关系 没有路由 有路由
- 因为 Hello 时间不一致
P2P/P2MP 和 NBMA 无法建立邻接关系 / 没有路由 /
- 因为 Hello 时间不一致
- P2P 和 P2MP 可以识别 NBMA 发来的单播 Hello 报文,但是 NBMA 无法识别 P2P 和 P2MP 发来的组播 Hello 报文

6. OSPF 状态机和邻居/邻接关系的建立


1)OSPF 邻居状态机

  • 如果相邻设备间只需在彼此在邻居表中看到对方,应当建立邻居关系「邻居状态会从 Init 切换为 2-Way」
  • 如果相邻设备间需要彼此交互 LSDB,应当建立邻接关系「邻居状态会从 Init 切换为 ExStart」,但需要满足任意一种条件才会建立邻接关系:
    • 网络类型为 P2P(不选举 DR/BDR)
    • 网络类型为 P2MP(不选举 DR/BDR)
    • 路由器自身是 DR/BDR
    • 邻居路由器是 DR/BDR

image.png

  • Down:邻居状态变迁的初始状态,表示最近没有收到任何邻居的 Hello 报文,但是会向外发送 Hello 报文,尝试建立连接
  • Attempt:仅用于 NBMA,表示最近没有收到任何邻居的 Hello 报文,但是会每「 30s 」向外发送 Hello 报文,尝试建立连接
  • Init:发送了第一个Hello报文,或收到了由邻居发送的 Hello 报文,但是 Active Neighbor 字段中没有携带自己的Router ID
  • 2-Way:收到了由邻居发送的 Hello 报文,并在 Active Neighbor 字段中发现携带了自己的 Router ID,邻居状态建立完毕
  • ExStart:建立邻接的第一步,已经发送了为 None 的 DD 报文,并确定路由器的主从和 DD 序列号
  • Exchange:开始正式交互后续 DD 报文中的 LSA 摘要信息,描述完整的链路状态数据库
  • Loading:交互 LSR、LSU、LSAck 报文,用于请求、发送和确认在 Exchange 状态下发现缺失的 LSA
  • Full:请求列表为空时,表示邻接关系建立完毕,LSDB 已经完成同步。邻接将出现在 Router-LSA 和 Network-LSA 中

    2)建立邻居关系和邻接关系的过程

    image.png

    ① 邻居关系的建立

  • OR1 没有从运行 OSPF 的接口接收到任何 Hello 报文时,但会向外发送 Hello 报文,用于探测[此时状态为 Down]

  • OR2 收到 OR1 发出的 Hello 报文,查看该报文中的 Active Neighbor 字段,发现没有携带自己的 Router IDOR2 将 OR1 发出 Hello 报文的 Heads 中提取出 Source Router ID,用于在响应 Hello 报文时将 OR1 的 Router ID 添加进 Active Neighbor 字段中[此时状态变迁为 Init]
  • OR1 收到 OR2 发出的 Hello 报文,查看该报文中的 Active Neighbor 字段,发现字段内携带了自己的 Router ID。OR1 同时响应 Hello 报文,在 Active Neighbor 中携带 OR2 的 Router ID[此时状态变迁为 2-Way]
  • OR2 收到后,查看到报文中的 Active Neighbor 携带了自己的 Router ID[此时状态变迁为 2-Way]
  • 当两端同时进入 2-Way 状态后,标志邻居关系已经建立(只有 DR other 之间才会停留在 2-Way 状态)

    ② 邻接关系建立的过程

  • 如果在建立邻居关系前没有选举 DR 和 BDR 则需要等待一个 Waiting Timer 时间(40s)

  • 选举出 DR/BDR 后,才开始发送 DD 报文(前两个 DD 报文为 None,用于主从选举(Master/Slave))[此时状态变迁为 Exstarty]
    • 从 Init 变迁到 Exstart,设备之间都认为自己是主设备
    • 双方都随机生成 Seq,并把 I-bit=1、M-bit=1、MS-bit=1。双方都收到对方发来的 DD 报文后,比较 Router ID(Router ID 大的成为Master设备)
    • 比较完成后,Slave(I-bit=0;M-bit=0/1;MS-bit=0)通过 Msater 设备的 Seq 号交互 DD 报文
    • Master 收到 Slave 以自己的 Seq 发送报文,则认为 Slave 已经收到了报文
  • 主从选举完成后,开始正式交互 LSA 摘要信息[此时状态变迁为 Exchangey]
    • Slave(I-bit=0;M-bit=0/1;MS-bit=1)后续发送的报文,则用 Master 初始 Seq+1,直到 DD 报文交互完成
  • 相互交互完最后一个 DD 报文后,会产生一个交互完成信息(Exchange Done)[此时的状态变迁为 Loadingy]
    • 当邻接关系变为 Loading 后,开始发送 LS Request 报文请求在 DD 中发现自身 LSDB 中缺少的 LSA(激活重传列表)
      • 收到 LS Request 报文后,通过 LS Update 报文发送邻接设备缺少的 LSA
      • 发送 LS Ack 报文进行 LSA 的确认,确保传输的可靠性
  • 当重传列表为空时[此时的状态变迁为 Full]

    3)影响邻居建立的条件

  1. Hello 和 Dead timer 不一致
  2. 认证不匹配
  3. 区域不匹配
  4. Router ID 冲突
  5. 掩码长度不匹配(只在 MA 和 NBMA 中影响;P2P、P2MP、VLink 不影响)
  6. Option 选项不匹配(N/P 和 E-bit 不匹配)
  7. 不在同一网段(只在 MA 和 NBMA 中影响;P2P、P2MP、VLink 不影响;也就是说 OSPF 有源检查机制)
  8. 网络类型不匹配
  9. 版本不匹配
  10. 存在 IP、协议号的过滤

    7. 接口状态机


image.png

1)接口状态

  • Down:接口的初始状态。表明此时接口不可用,不能用于收发流量
  • Loopback:设备到网络的接口处于环回状态。环回接口不能用于正常的数据传输,但可以通过 Router-LSA 进行通告。因此,进行连通性测试时能够发现到达这个接口的路径
  • Waiting:设备正在判定网络上的 DR 和 BDR。在设备参与 DR 和 BDR 选举前,接口上会启动 Waiting 定时器。在这个定时器超时前,设备发送的 Hello 报文不包含 DR 和 BDR 信息,设备不能被选举为 DR 或 BDR。这样可以避免不必要地改变链路中已存在的 DR 和 BDR。仅 NMBA 网络、广播网络有此状态
  • P-2-P:接口连接到物理点对点网络或者是虚拟链路,这个时候设备会与链路连接的另一端设备建立邻接关系。仅 P2P、P2MP 网络有此状态
  • DR Other:设备没有被选为 DR 或 BDR,但连接到广播网络或 NBMA 网络上的其他设备被选举为 DR。它会与 DR 和 BDR 建立邻接关系
  • BDR:设备是相连的网络中的 BDR,并将在当前的 DR 失效时成为 DR。该设备与接入该网络的所有其他设备建立邻接关系
  • DR:设备是相连的网络中的 DR。该设备与接入该网络的所有其他设备建立邻接关系

    2)状态切换输入事件

  • IE1(Interface UP):底层协议表明接口是可操作的

  • IE2(WaitTimer):等待定时器超时,表明 DR/BDR 选举等待时间结束
  • IE3(Backup Seen):设备已检测过网络中是否存在 BDR。发生这个事件主要有下面两种方式(都说明邻居间已进行了相互通信,可以结束 Waiting 状态了):
    • 接口收到邻居设备的 Hello 报文,宣称自己是 BDR
    • 接口收到邻居设备的 Hello 报文,宣称自己是 DR,而没有指明有 BDR
  • IE4:接口所在的设备在网络中被选举为 DR
  • IE5:接口所在的设备在网络中被选举为 BDR
  • IE6:接口所在的设备在网络中没有被选举为 DR/BDR
  • IE7(Neighbor Change):表明 DR/BDR 需要重新选举。下面的这些邻居关系变化可能会导致DR/BDR重新选举:
    • 接口所在的设备和一个邻居设备建立了双向通信关系
    • 接口所在的设备和一个邻居设备之间丢失了双向通信关系
    • 通过邻居设备发送的 Hello 报文检测到邻居设备重新宣称自己是 DR/BDR
    • 通过邻居设备发送的 Hello 报文再一次检测到邻居设备宣称自己不再是 DR/BDR
    • 通过邻居设备发送的 Hello 报文再一次检测到相邻设备的 DR 优先级都已经改变
  • IE8(Un LoopInd):网管系统或者底层协议表明接口不再处于环回状态
  • IE9(Interface Down):底层协议表明接口不可操作。任何一种状态都可能触发此事件切换到 Down 状态
  • IE10(LoopInd):网管系统或者底层协议表明接口处于环回状态。任何一种状态都可能触发此事件切换到 Loopback 状态

    8. LSA 类型


LSA 类型 LSA 生成 LSA 作用和泛洪范围 Link State ID Advertising Router
Router LSA(Type 1) 每个设备都会产生
- 描述设备的链路状态信息和开销
- 在所属区域内泛洪
产生此 LSA 的 Router ID 通告该 LSA 的 Router ID
Network LSA(Type 2) DR 产生
- 描述本网络中所连接的设备的 Router ID
- 在所属的区域内泛洪
DR 的接口 IP DR 的 Router ID
Network-Summary LSA(Type 3) ABR 产生
- 描述区域间网络的路由信息
- 在非 Totally Stub/Nssa 区域的相关区域防洪(跨区域传播,但是每经过一个 ABR,Adv 会改变)
目标网络前缀 ABR 的 Router ID
ASBR-Summary LSA(Type 4) ABR 产生
- 描述 ASBR 的位置信息(ABR 到达 ASBR 的 Metric)
- 在非 Totally Stub 区域的相关区域泛洪(跨区域传播,但是每经过一个 ABR 会改变 Adv 进行跨区域通告)
ASBR 的 Router ID ABR 的 Router ID
AS-External LSA(Type 5) ASBR 产生
- 描述 ASBR 到达外部目标网络的路由信息
- 在非 Stub/Nssa 区域的整个 OSPF 域中泛洪
目标网络前缀 ASBR 的 Router ID
NSSA LSA(Type 7) ASBR 产生
- 描述 Nssa 中 ASBR 到达外部目标网络的路由信息
- 在 Nssa 区域内泛洪,经过 ABR 会将 LSA Type 7 转 LSA Type 5
目标网络前缀 ASBR 的 Router ID
Opaque LSA(Type 9、10、11 LSA)
- Type 9 LSA:仅在接口所在网段泛洪。用于支持 GR 的 Grace LSA
- Type 10 LSA:在区域内泛洪。用于支持 TE 的LSA
- Type 11 LSA:在 OSPF 域内泛洪

1)LSA 三要素

通过 LS Type、Link state ID、Advertising Router,可以唯一确认一条 LSA

  • LS Type:LSA 的类型
  • Link-State ID:链路状态 ID,根据 LSA 中的 LS Type 和 LSA description 在路由域中描述一个 LSA
  • Advertising Router:产生此 LSA 的路由器 Router ID

    2)LSA Message Header

    除 Hello 报文外,其他所有的 OSPF 报文都携带 LSA 信息

  • LSA 正常情况下每「1800s(30min)」更新一次,老化时间「3600s(1h)」

    • 正常情况下不会超过 1800s 更新一次
    • 如果超过 1800s 没有收到更新则不正常,超过 3600s 后删除该 LSA
  • OSPF 不能删除不是自己的产生的 LSA,只能由源路由器发送「Age = 3600」的 LSA 进行删除自己生成的 LSA[路由撤销]
    • 容易造成僵尸 LSA,如果产生僵尸 LSA 需要重启所有的路由器
    • 如果只是重启单台路由器,设备启动后该路由器会从其他邻居重新获取到该僵尸 LSA
  • LSA 采用触发更新机制(增加、删除、修改、调整开销、IP路由变化、接口状态变化等),只要接口信息发生变化就会引起 LSA 更新(无需等待 1800s)
  • LSA 的新旧比较
    • 比较 LSA Sequence,越大越优
      • LSA Sequence 是一个 32 位有符号整数。LSA Sequence 用来比较 LSA 的新旧或相同。LSA 每更新一次,Seq 都会 +1,只能由发送此 LSA 的设备增加
      • 初始序号为:80000001,序号越大越新(取值范围 -80000001 ~ +7FFFFFFF),如果到达 7FFFFFFF 后,清空 LSDB 进行提早老化,重新泛洪学习
    • 比较 Checksum 值,越大越优
    • 比较 LSA Age 时间是否等于 MAX-Age 时间(3600s)
      1. 如果等于则最优
      2. 如果不等于则比较两个报文的 Age 差值,>900s(15min)越小越优
      3. 如果不等于则比较两个报文的 Age 差值,<900s(15min)会认为是同一条 LSA,忽略后收到的 LSA

image.png
LSA Message Header 格式解析

  • LS Age:LSA 已经生存的时间
  • Options:可选字段
  • LS Type:表明 LSA 的类型
  • Link State ID:链路状态 ID,根据 LSA 中的 LS Type 和 LSA description 在路由域中描述一个 LSA
  • Advertising Router:产生此 LSA 的路由器 Router ID
  • LS sequence number:序号,用来检测 LSA 的新旧和重复
  • LS Checksum:LSA 校验和
  • Length:LSA 的长度

    3)常用 LSA 类型解析

    image.png

    ① Router LSA(LSA Type 1)

    ABR 会生成多条 1类 LSA,因为 ABR 会为每个区域生成并维护 LSDB

  • 每个路由器都会生成一条 1类 LSA,描述了区域内路由器的端口链路状态信息和开销(哪些接口运行了OSPF协议)。在所属的区域内泛洪

    • LS Type:Router
    • LS ID:产生此 LSA 的 Router ID
    • Adv:通告该 LSA 的 Router ID
  • Router LSA 类型 | Type | Link ID | Data | | —- | —- | —- | | point to point | 邻居的 Router ID | 本端连接到邻居的接口 IP | | StubNet | 与邻居相连接口的网络前缀 | 与邻居相连接口的网络掩码 | | TransNet | DR 的接口 IP | 本端与 DR 相连的接口 IP | | Virtual Link | VLink 邻居的 Router ID | 本端连接到 Vlink 的接口 IP |

    • StubNet 描述路由信息
    • P2P、TransNet 和 Virtual Link 描述拓扑信息
      • P2P 会生成 2 条 LSA,既包含拓扑描述也包含路由描述。P2P 如果处于同一网段,两端设备都会把该网段当成一个伪节点,在 1类 LSA 中 Metric 为 48,在路由表中会因为是直连 Cost 值为 0。P2P 如果处于不同网段,两端设备会把自身的网段分别当作伪节点,在 1类 LSA 中 Metric 为 48,在路由表中会因为是不同伪节点 Cost 值为 96
        • Link Type:P2P(描述拓扑)
        • Link Type:StubNet(描述路由)
      • TransNet 的 Link ID 可以当成一个 DR 伪节点,伪节点到任何节点的 Metric 都是 0
      • Virtual Link 的 Metric 值为 1
  • Rouer LSA 的 Option 选项
    • V:表明是虚连接
    • B:表明该路由器是ABR
    • E:表明该路由器是ASBR
  • LSDB 和 Message 解析

image.pngimage.png

② Network LSA(LSA Type 2)

只有 Broadcast 和 NBMA 网络环境中才有 2类 LSA,P2P 没有 2类 LSA

  • 由 DR 产生,描述网络中本网段所连接路由器的 Router ID,附属路由信息。在所属的区域内泛洪
    • LS Type:Network
    • LS ID:DR 的接口 IP
    • Adv:DR 的 Router ID
    • Net Mask:掩码信息
    • Attached:活动邻居(所有活动邻居的 Router ID)
  • 通过 2类 LSA 的 LS ID、Net mask 和 1类 LSA 的 Metric 就可以构成一条路由信息
  • LSDB 和 Message 解析

image.pngimage.png

③ Network-Summary LSA(LSA Type 3)

  • 由 ABR 生成,描述的是路由信息(与拓扑无关)。ABR 会将其他区域内的 1/2类 LSA 的路由信息转换成 3类 LSA。在非 Totally Stub/Nssa 区域的相关区域泛洪,每经过一个 ABR,Adv 会改变
    • LS Type:Sum-Net
    • LS ID:目标网络前缀
    • Adv rtr:通告该路由的 ABR 的 Router ID,每到达一个 ABR,Router ID 会改变(离自身 ABR 最近的一个 Router ID)
    • Net mask:目标网络掩码信息
    • Metric:ABR 到达目标网络的开销值
  • 区域间的防环规则:
    • OSPF 规定不允许非骨干区域之间发布路由信息,只允许在区域内部或骨干区域与非骨干区域之间发布路由(所有非骨干区域都需要连接到骨干区域,由 ABR 将 1类和2类 LSA 转换成 3类 LSA)
    • ABR 将 1/2类 LSA 转换成 3类 LSA 后,不会再将 3类 LSA 注入回该区域「水平分割」
    • ABR 从非骨干区域收到的 3类 LSA 不能用于区域间路由的计算(只接收 LSA 不进行路由计算)「骨干区域被分割的场景,只有 True ABR 才遵守该规则」
      • True ABR:在骨干区域有活动的邻接关系
      • False ABR:在骨干区域没有活动的邻接关系。但会做 ABR 的工作,接收 LSA 也进行路由计算
  • LSDB 和 Message 解析

image.pngimage.png

④ ASBR-Summary LSA(LSA Type 4)

  • 由 ABR 生成, 描述的是 ASBR 的位置信息(ABR 到达 ASBR 的 Metric)。在非 Totally Stub 区域的相关区域泛洪(不能跨区域,但是每经过一个 ABR 会改变 Adv 进行跨区域通告)
    • LS Type:Sum-Asbr
    • LS ID:ASBR 的 Router ID
    • Adv rtr:ABR 的 Router ID(每经过一个 ABR,Adv 都会变更)
    • Metric:从本端到达 ASBR 的 Metric(不管有多少 ABR)
      • 本端(由 1/2类 LSA 计算出到 ABR 的 Metric)+ ABR(由 1/2类 LSA 计算出本端 ABR 到达下一个 ABR 的 Metric)+ ASBR(由 1/2类 LSA 计算出到达 ASBR 的 Metric)
  • LSDB 和 Message 解析

image.pngimage.png

  • Type 4 LSA 的防环(与 Type 3 LSA 防环一致)

    • 当一台OSPF路由器将外部路由引入OSPF域后,它就成为了一台ASBR,被引入的外部路由以Type-5 LSA在整个OSPF域内洪。一台路由器使用Type-5 LSA计算出路由的前提是两个,其一是要收到Type-5 LSA,其二是要知道产生这个Type-5 LSA的ASBR在哪里。与ASBR接入同一个区域的路由器能够根据该区域内泛洪的Type-1 LSA 及Type-2 LSA计算出到达该ASBR的最短路径,从而计算出外部路由。而其他区域的路由器就没有这么幸运了,因为ASBR产生的Type-1 LSA只能在其所在的区域内泛洪,所以才需要Type-4 LSA。因此其他区域的路由器在获取Type-4 LSA后便能计算出到达ASBR的最短路径,进而利用该ASBR产生的Type-5 LSA计算出外部路由。Type-5 LSA将会被泛洪到整个OSPF域,表面上看,它本身并不具有什么防环的能力,但是实际上,它并不需要,因为它可以依赖Type-1 LSA及Type-4 LSA来实现防环

      ⑤ AS-External LSA(LSA Type 5)

      OSPF 中默认从外部引入的路由采用 OE2 类型

  • 由 ASBR 生成,描述的是 ASBR 到外部路由的开销值(到目标网络的开销)。在整个 OSPF 域中泛洪(除 Nssa 和 Stub 区域),在泛洪过程中,5类 LSA 不会改变。需要 4类 LSA 做 Metric 计算

    • LS Type:External
    • LS ID:目标网络前缀
    • Adv rtr:ASBR 的 Router ID
    • Net mask:目标网络掩码信息
    • Metric:ASBR 到达目标网络的开销值
    • E Type:外部路由类型,分为 OE1 和 OE2 类型[华为默认 OE2 类型]
    • Forwarding Address:转发地址,解决次优路径问题
  • 外部路由类型「OE1 > OE2」
    • OE1:路由比较的是总 Cost 值(不分内外)
      • 将其他协议引入 OSPF 时手工修改 Type = 1,LSA 在传递过程中累计 Cost 值(会计算外部区域Cost + 内部区域Cost)
    • OE2:在 LSA 传递过程中 Cost 值不累计,只计算外部区域 Cost(ASBR 到外部目标网络的开销)
      • 将其他协议引入 OSPF 时默认类型
      • 路由先比较外部区域 Cost 值,越小越优;如果外部区域 Cost 值相等,比较内部区域 Cost 值,如果内部区域 Cost 值也相等则负载
  • LSA Type 5 转发地址(Forwarding Address,下一跳地址)
    • 五类 LSA 携带 FA 地址的必要条件
      • 到达外部路由的下一跳接口类型不能是 P2P/P2MP
      • 到达外部路由的下一跳接口不能配置为被动端口 silent-interface
      • 下一跳地址要域内(1/2类 LSA)或域间可达(3类 LSA)
    • FA 地址与 ICMP 重定向一致,用于解决次优路径的问题
      • 如果 OSPF 的 TypLSA e 5 携带了 FA 地址,计算路由时会优先考虑 FA 地址(RIB 装载 FA 地址,计算到达 FA 的开销 + 外部开销)。同时域内和域间没有环路,则 FA 地址也没有环路
      • 如果 OSPF 的 Ty LSApe 5 没有携带 FA 地址,则计算路由时会考虑 ASBR 的 IP 地址(RIB 装载 ASBR 的 IP 地址,计算到达 ASBR 的开销 + 外部开销)同时 LSA Type 4没有环路,则 FA 地址也没有环路
  • LSDB 和 Message 解析

image.pngimage.png

⑥ Nssa LSA(LSA Type 7)

外部路由类型「ON1 > ON2」

  • 是由 Nssa 区域的 ASBR 生成。描述到达 AS 外部的路由。在 Nssa 区域泛洪,当到达 Nssa 区域的 ABR 时,转化为 5类 LSA,泛洪到其他区域(除了 Nssa/Stub 区域)
    • LS Type:NSSA
    • LS ID:目标网络前缀
    • Adv rtr:ASBR 的 Router ID,下发的默认 LSA Type 7是 ABR 的 Router ID
    • Metric:ASBR 到达外部路由的 Cost
    • Forwarding Address:转发地址,用于解决次优路径
  • LSA Type 7 转发地址(Forwarding Address,下一跳地址)

    LSA Type 7 必须携带 FA 地址

    • 如果满足 LSA Type 5 的三个条件,FA 地址是 ASBR 上外部路由的下一跳地址
    • 如果不满足 LSA Type 5 的三个条件,FA 地址是 ASBR 上某个接口的 IP 地址,优选环回口 IP 地址大的
  • LSDB 和 Message 解析

image.pngimage.png

9. 特殊区域


  • Stub 区域不能引入外部路由
  • Nssa 区域可以引入外部路由
  • 在 Stub/Nssa 区域中,对不同区域而言,ABR 设备既是 ABR 也是 ASBR

    1)Stub 区域

    建议 Stub 区域只有一个 ABR

  • 标准 Stub 区域(末梢区域)

    • Stub 可以过滤LSA LSA(LSA Type 4),生成一条默认路由(Ty LSApe 3)
    • 配置 Stub 区域,需要在同区域的所有设备上配置,否则会导致邻居无法建立
  • Totally Stub区域(完全末梢区域)
    • Totally Stub 区域不但会过滤 LSA Type 5(Ty LSApe 4),也会过滤 LSA Type 3。ABR 同时会向该区域下放一条默认路由(Ty LSApe 3)
    • Totally Stub 只有在 ABR 上配置才会生效
  • Stub 和 Totally Stub 区域的限制条件

    1. 虚连接不能跨越 Stub 区域
    2. Stub 区域不能有 ASBR 设备
    3. Area 0 不能配置为 Stub 区域
    4. Stub 区域 OSPF 设备发送的 Hello 报文中 Options 选项中的 E-bit=0

      2)Nssa 区域

  • 标准 Nssa 区域(非纯末梢区域)

    • Nssa 区域可以过滤掉 LSA Type 5(LSA Type 4),将外部路由以 LSA Type 7 的形式引入该区域,然后由 ABR 下放一条默认路由(LSA Type 7)
    • ABR 上无论 RIB 表中是否存在缺省路由,都会生成 LSA Type 7 缺省路由
    • 在 Nssa 的 ASBR 上只有路由表存在缺省路由,才会生成 LSA Type 7 缺省路由
  • Totally Nssa 区域(完全非纯末梢区域)
    • Totally Stub 区域不但会过滤 LSA Type 5(LSA Type 4),也会过滤 Ty LSApe 3。ABR 同时会向该区域下放两条默认路由(LSA Type 3、LSA Type 7)
    • Totally Stub 只有在 ABR 上配置上会生效
  • Options
    1. 如果 Hello 报文中 Options 选项的 N-bit=1(N/P-bit),表明支持 Nssa 区域
    2. 如果 LSA 报文中 Options 选项的 P-bit=1(N/P-bit),表明要进行七转五
  • 七转五 LSA
    • ABR 会将 LSA Type 7 转换成 LSA Type 5
    • 如果有多个 ABR 设备,会由 Router ID 大的做七转五

      10. SPF 算法


经过 SPF 算法,同区域的 LSDB 都一致,但是路由是不一样的(因为都是以自身为根进行计算路由) 通过 SPF 计算出来的路径,就是最终的最短转发路径

1)SPF 计算原理

  • SPF 算法都是依据 Type 1/2 LSA 进行计算
    • Broadcast 和 NBMA 中 2类LSA 的 LS State ID 与 1类 LSA 的 Link ID 相同,都是 DR 接口的 IP
  • SPF 计算时,端点 ID 是标记设备的 Router ID
  • 每个路由器以自己为根计算最短路径树
    • 第一阶段:计算所有 Transit 节点,忽略 Stub 节点,生成最短路径树
      • Transnet、P2P 都属于 Transit 节点
      • Transnet 是一个传输节点(骨干节点)
    • 第二阶段:只计算 Stub节点,将 Stub 网段挂到最短路径树上去
      • 除了 Transnet 和 P2P/Virtual Link 都属于 Stub 节点(3、4、5、7 类 LSA 都属于 Stub 节点)
      • StubNet 网段表示该网段只有数据入口(例如一个 Loopback 接口就是一个 StubNet 网段)
      • Stub 节点作为叶子(N*)挂在骨干上

        2)有向图计算

        image.png

        ① 第一阶段

        如果候选列表为空时,则计算最短路径树的第一阶段结束

  1. 初始化最短路径树:RTA将自己作为根节点添加到最短路径树上
    • 最短路径树

image.png

  • 有向图

image.png

  1. 计算 RTA 的 LSA Type 1:检查自己生成的 1类 LSA,把自身 LSA 中的 Transit 节点添加到候选列表中,将最优的放入最短路径上
    • 候选列表

image.png

  • 最短路径树

image.png

  • 有向图

image.png

  1. 计算 RTB 的 LSA Type 1:查找新添加到最短路径树上的新端点 ID 的 1类 LSA,将 LSA 中的 Transit 节点添加到候选列表中(对已经放入最短路径树的端点 ID,不在进行计算,直接忽略),将最优的放入最短路径上
    • 候选列表

image.png

  • 最短路径树

image.png

  • 有向图

image.png

  1. 计算伪节点 10.3.1.0 的 T2 LSApe 3:检查新添加进最短路径数端点 ID 的 2类 LSA,将 2类 LSA 中描述链路中的所有成员加入到候选列表中(忽略最短路径树中已知的端点 ID)。从 Transit 网段所连的路由器开销为 0。在候选列表中出现两个端点 ID相同但是到根端点的凯西奥不同的端点,会删除到根端点开销大的
    • 候选列表

image.png

  • 最短路径树

image.png

  • 有向图

image.png

  1. 计算描述 RTC/RTD 的 LSA Type 1:检查新添加到最短路径树上的新端点 ID 的 1类 LSA,将 LSA 中的 Transit 节点添加到候选列表中(对已经放入最短路径树的端点 ID,不在进行计算,直接忽略),将最优的放入最短路径上
    • 最短路径树

image.png

  • 有向图

image.png

② 第二阶段

计算 Stub 节点,挂在第一阶段的有向图上

  1. 计算 RTA 所连接的 Stub 节点
    • 有向图

image.png

  1. 计算 RTB 所连接的 Stub 节点
    • 有向图

image.png

  1. 计算 RTC 所连接的 Stub 节点
    • 有向图

image.png

  1. 计算 RTD 所连接的 Stub 节点
    • 有向图

image.png

11. Virtual Link


1)特性

  • Virtual Link 本身就是 Area 0
  • Virtual Link 之间单播交互协议报文,TTL = 255
  • Virtual Link 只能配置在普通区域,不能在特殊区域配置
  • 虚链路属于按需链路,需要将 Option 字段中 DC 置位(华为不适用,因为华为是采用 P2P)
  • 正常情况下,Virtual Link 是在 ABR 之间建立
  • Virtual Link 无法跨区域建立(因为没有 1/2类 LSA,所以无法跨区域)
  • 配置 Virtual Link 需要手工指定 Router ID,否则意外重启可能导致 Router ID 变动,导致 Virtual Link 无法建立连接
    • 每个虚连接的端点都需要在同区域内计算两个最短路径树,一个是本地最短路径树(以自身为根),另一个是虚连接邻居的最短路径树(以 Vlink 邻居为根)。用来确定发送协议报文的源和目的IP地址(通过两次 SPF 算法确认目标地址和源地址)
  • Virtual Link 从 Area 0 学习到的 1类 LSA,不能转换为 3类 LSA 发送给建立 Virtual Link 的区域中,只能发送给其他区域

    2)注意事项

  1. Virtual Link 不能跨区域(需要 1/2类 LSA 中有邻居的 Router ID)
  2. Virtual Link 不能在 Stub 区域和 Nssa 区域配置
  3. Virtual Link 容易产生环路
  4. Virtual Link 针对区域0 的汇总路由不会生效(Vlink Up,汇总路由不生效;VLink Down,汇总路由生效)
    • 如果可以汇总,Vlink 区域内的设备与建立 Vlink 的设备路由条目掩码不一致,此时在 IP 转发不会出现问题;如果在 MPLS 下转发就会因为 FEC 不一致,导致建立 ISP 不连续导致丢包(在 MPLS VPN 中,因为 MPLS 依靠 LIB 来进行转发,由于 ISP 不一致,则在链路中就被 POP 掉标签)
  5. 在 ABR 上非骨干区域做 LSA 过滤后,Vlink 对端设备上也不会存在该路由(Vlink 的始发区域必须存在该路由,Vlink 的对端设备才会有该路由,这是华为的优化)

    3)应用场景

  6. Area 0 被分割(Virtual Link 在骨干区域被分割交互的是 LSA Type 1)

  7. 非骨干区域没有连接到骨干区域(Virtual Link 在非骨干区域没有连接到骨干区域交互的是 Ty LSApe 3)
  8. 没有骨干区域,可以配置 Virtual Link 作为骨干区域
  9. 保证骨干区域的稳定性,防止 Area 0 被分割
  10. 解决次优路径

    12. 汇总和过滤


原则上不能对 1/2类 LSA 进行汇总和过滤,,但华为可以对 1/2类 LSA 进行过滤

1)LSA Type 3 汇总(Summary)和过滤(Filter)

  • 汇总:只能在 ABR 的原始区域汇总(LSA 所在的区域)
  • 过滤 LSA:可以在任何 ABR 上进行 LSA 过滤,过滤掉 LSA 会影响路由的计算

    • Import:在 LSA 进入其他区域时进行过滤
    • Export:在 LSA 的原始区域进行过滤

      2)LSA Type 5 汇总和过滤

  • 只能在引入外部路由的 ASBR 上汇总

  • 可以在汇总时使用 “not-advertise” 相当于过滤

    3)过滤路由(Filter-Policy)

  • 运行完 SPF 算法,但不加入路由表,并不会过滤 LSA

    • Import:在 Normal 设备上过滤的是路由信息,如果在 ABR 上使用,不仅会过滤路由信息,也会影响其他设备的路由
    • Export:只能 ASBR 上路由引入时使用才有效

      4)接口下 LSA 的过滤

  • Filter-Lsa-Out:可以对除 Grace LSA(Type 9 LSA)的所有 LSA 进行过滤,只能是出方向

    13. 选路原则


  1. 区域内的 > 区域间的 > ASE OE1 or Nssa ON1 > ASE OE2 or Nssa ON2 > Cost
  2. ASE OE1 or Nssa ON1 进行比较,比较的是OSPF的内部和外部开销之和,即哪个开销之和小,哪条路径就好,如果开销一样,则负载分担
  3. ASE OE2 or Nssa ON2 进行比较,先比较二者的外部开销,外部开销小的路径好,如果外部开销一样,再比较内部开销,内部开销小的路径优先,如果一致,则负载分担

    14. 环路问题


OSP环路问题.pdf