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 以外的所有区域
-
2)路由器类型
内部路由器:所有接口都属于同一个区域
- 骨干路由器:至少有一个接口属于骨干区域
- 区域边界路由器(ABR):同时属于两个以上的区域,但必须有一个是骨干区域。将普通区域和骨干区域连接在一起
- AS边界路由器(ASBR):与其他路由协议交换路由信息的设备(引入了外部路由的信息)
3)路由器角色
- 在同一个网络中,只有一个 DR 和 BDR
- DR 和 BDR 只有在 Broadcast 和 NBMA 网络中才有作用,在 P2P 和 P2MP 中可以没有 DR 和 BDR
① 指定路由器(DR)
- 用于同步数据库,保证数据库的一致性和完整性
-
② 备份指定路由器(BDR)
-
③ 成员路由器(DR Other)
-
4)DR 和 BDR 的选举规则
- DR 要在选举期内(2-Way 状态,40s 的 Waiting Timer)进行选举,否则不进行选举[DR/BDR 不具备抢占性]
- 同一广播域如果因为配置错误导致的双 DR/BDR 时,广播域合并时,双 DR/BDR 进行比较,未被选举上的成为 DR Other
① DR 和 BDR 选举规则
- 首先比较优先级,越大越优先(默认为 1,优先级范围 0~255,优先级为 0 不参与选举)
-
② DR 和 BDR 选举流程
首先查看 Hello 报文中 DR 和 BDR 字段是否为空
- 如果都为空,会先选举出 BDR
- 如果 DR 字段为空,BDR 字段不为空。BDR 提升为 DR,重新选举 BDR
- 如果 DR 字段不为空,BDR 字段为空。重新选举 BDR
5)Router ID
- 用于标识区域内的唯一路由器(IPv4 格式),不可冲突(必须唯一);否则无法建立邻居关系
- 如果二次修改了 Router ID,需要重启 OSPF 进程或者重启设备
- 不同区域之间可以冲突,但是如果该设备变为了 ASBR 就不可冲突
Router ID 的生成方式
如果一个设备配置了区域认证和接口认证,接口认证优于区域认证
- Header 头部中的认证没有区分区域和接口,所以只要认证方式和密码相同就可以认证成功
- 认证类型
- 报文中Auth type=0:不认证
- 报文中Auth type=1:简单认证
- 报文中Auth type=2:MD5认证
认证方式
建议把参考带宽修改为整网最大链路带宽的 2 倍(所有设备都需要修改)
- Mertic 值:108bit/接口带宽 = 100Mbit/接口带宽
常用的链路开销
禁止接口接收和发送 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
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」发送一次
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 位 “ 以外都无法手工控制
4)DD Message
用来同步交互 LSA 的摘要信息,主要是交互「LS Type、Link state ID、Advertising」
① DD Message
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 摘要信息,选举主从的目的是为了隐式确认
-
③ 确认机制
所有需要达到 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
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信息)
LSU Message 格式解析
LSAck Message 格式解析
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
- 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)建立邻居关系和邻接关系的过程
① 邻居关系的建立
OR1 没有从运行 OSPF 的接口接收到任何 Hello 报文时,但会向外发送 Hello 报文,用于探测[此时状态为 Down]
- OR2 收到 OR1 发出的 Hello 报文,查看该报文中的 Active Neighbor 字段,发现没有携带自己的 Router ID。OR2 将 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 的确认,确保传输的可靠性
- 当邻接关系变为 Loading 后,开始发送 LS Request 报文请求在 DD 中发现自身 LSDB 中缺少的 LSA(激活重传列表)
- 当重传列表为空时[此时的状态变迁为 Full]
3)影响邻居建立的条件
- Hello 和 Dead timer 不一致
- 认证不匹配
- 区域不匹配
- Router ID 冲突
- 掩码长度不匹配(只在 MA 和 NBMA 中影响;P2P、P2MP、VLink 不影响)
- Option 选项不匹配(N/P 和 E-bit 不匹配)
- 不在同一网段(只在 MA 和 NBMA 中影响;P2P、P2MP、VLink 不影响;也就是说 OSPF 有源检查机制)
- 网络类型不匹配
- 版本不匹配
- 存在 IP、协议号的过滤
7. 接口状态机
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)
- 如果等于则最优
- 如果不等于则比较两个报文的 Age 差值,>900s(15min)越小越优
- 如果不等于则比较两个报文的 Age 差值,<900s(15min)会认为是同一条 LSA,忽略后收到的 LSA
- 比较 LSA Sequence,越大越优
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 校验和
-
3)常用 LSA 类型解析
① 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
- P2P 会生成 2 条 LSA,既包含拓扑描述也包含路由描述。P2P 如果处于同一网段,两端设备都会把该网段当成一个伪节点,在 1类 LSA 中 Metric 为 48,在路由表中会因为是直连 Cost 值为 0。P2P 如果处于不同网段,两端设备会把自身的网段分别当作伪节点,在 1类 LSA 中 Metric 为 48,在路由表中会因为是不同伪节点 Cost 值为 96
- Rouer LSA 的 Option 选项
- V:表明是虚连接
- B:表明该路由器是ABR
- E:表明该路由器是ASBR
- LSDB 和 Message 解析
② 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 解析
③ 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 解析
④ 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 解析
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 类型
- 当一台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来实现防环
由 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 值也相等则负载
- OE1:路由比较的是总 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 地址也没有环路
- 五类 LSA 携带 FA 地址的必要条件
- LSDB 和 Message 解析
⑥ 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 解析
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 区域的限制条件
标准 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
- 如果 Hello 报文中 Options 选项的 N-bit=1(N/P-bit),表明支持 Nssa 区域
- 如果 LSA 报文中 Options 选项的 P-bit=1(N/P-bit),表明要进行七转五
- 七转五 LSA
经过 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 网段挂到最短路径树上去
- 第一阶段:计算所有 Transit 节点,忽略 Stub 节点,生成最短路径树
- 初始化最短路径树:RTA将自己作为根节点添加到最短路径树上
- 最短路径树
- 有向图
- 计算 RTA 的 LSA Type 1:检查自己生成的 1类 LSA,把自身 LSA 中的 Transit 节点添加到候选列表中,将最优的放入最短路径上
- 候选列表
- 最短路径树
- 有向图
- 计算 RTB 的 LSA Type 1:查找新添加到最短路径树上的新端点 ID 的 1类 LSA,将 LSA 中的 Transit 节点添加到候选列表中(对已经放入最短路径树的端点 ID,不在进行计算,直接忽略),将最优的放入最短路径上
- 候选列表
- 最短路径树
- 有向图
- 计算伪节点 10.3.1.0 的 T2 LSApe 3:检查新添加进最短路径数端点 ID 的 2类 LSA,将 2类 LSA 中描述链路中的所有成员加入到候选列表中(忽略最短路径树中已知的端点 ID)。从 Transit 网段所连的路由器开销为 0。在候选列表中出现两个端点 ID相同但是到根端点的凯西奥不同的端点,会删除到根端点开销大的
- 候选列表
- 最短路径树
- 有向图
- 计算描述 RTC/RTD 的 LSA Type 1:检查新添加到最短路径树上的新端点 ID 的 1类 LSA,将 LSA 中的 Transit 节点添加到候选列表中(对已经放入最短路径树的端点 ID,不在进行计算,直接忽略),将最优的放入最短路径上
- 最短路径树
- 有向图
② 第二阶段
计算 Stub 节点,挂在第一阶段的有向图上
- 计算 RTA 所连接的 Stub 节点
- 有向图
- 计算 RTB 所连接的 Stub 节点
- 有向图
- 计算 RTC 所连接的 Stub 节点
- 有向图
- 计算 RTD 所连接的 Stub 节点
- 有向图
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)注意事项
- Virtual Link 不能跨区域(需要 1/2类 LSA 中有邻居的 Router ID)
- Virtual Link 不能在 Stub 区域和 Nssa 区域配置
- Virtual Link 容易产生环路
- Virtual Link 针对区域0 的汇总路由不会生效(Vlink Up,汇总路由不生效;VLink Down,汇总路由生效)
- 如果可以汇总,Vlink 区域内的设备与建立 Vlink 的设备路由条目掩码不一致,此时在 IP 转发不会出现问题;如果在 MPLS 下转发就会因为 FEC 不一致,导致建立 ISP 不连续导致丢包(在 MPLS VPN 中,因为 MPLS 依靠 LIB 来进行转发,由于 ISP 不一致,则在链路中就被 POP 掉标签)
在 ABR 上非骨干区域做 LSA 过滤后,Vlink 对端设备上也不会存在该路由(Vlink 的始发区域必须存在该路由,Vlink 的对端设备才会有该路由,这是华为的优化)
3)应用场景
Area 0 被分割(Virtual Link 在骨干区域被分割交互的是 LSA Type 1)
- 非骨干区域没有连接到骨干区域(Virtual Link 在非骨干区域没有连接到骨干区域交互的是 Ty LSApe 3)
- 没有骨干区域,可以配置 Virtual Link 作为骨干区域
- 保证骨干区域的稳定性,防止 Area 0 被分割
- 解决次优路径
12. 汇总和过滤
原则上不能对 1/2类 LSA 进行汇总和过滤,,但华为可以对 1/2类 LSA 进行过滤
1)LSA Type 3 汇总(Summary)和过滤(Filter)
- 汇总:只能在 ABR 的原始区域汇总(LSA 所在的区域)
过滤 LSA:可以在任何 ABR 上进行 LSA 过滤,过滤掉 LSA 会影响路由的计算
只能在引入外部路由的 ASBR 上汇总
可以在汇总时使用 “not-advertise” 相当于过滤
3)过滤路由(Filter-Policy)
运行完 SPF 算法,但不加入路由表,并不会过滤 LSA
Filter-Lsa-Out:可以对除 Grace LSA(Type 9 LSA)的所有 LSA 进行过滤,只能是出方向
13. 选路原则
- 区域内的 > 区域间的 > ASE OE1 or Nssa ON1 > ASE OE2 or Nssa ON2 > Cost
- ASE OE1 or Nssa ON1 进行比较,比较的是OSPF的内部和外部开销之和,即哪个开销之和小,哪条路径就好,如果开销一样,则负载分担
- ASE OE2 or Nssa ON2 进行比较,先比较二者的外部开销,外部开销小的路径好,如果外部开销一样,再比较内部开销,内部开销小的路径优先,如果一致,则负载分担
14. 环路问题