路由失效的前提是下一跳不可达,所以路由经过迭代后,最终的依据是直连路由的状态,而只要端口是 up 的,直连路由即存在,但端口 up 并不意味着三层通讯状态正常。
一. 概述
BFD 是一个简单的 Hello 协议,两个系统间建立 BFD 会话通道,通过周期性的检测报文,检测系统间三层通讯的状态:
- BFD 提供了一种通用的、标准化的、介质无关和协议无关的三层故障快速检测机制;
- BFD 常用于加速上层协议的故障收敛,或为无检测机制的协议提供检测支持,比如静态路由;
- 通常在同一条三层链路上,只能建立一个 BFD 会话,但这个会话可以由多个上层协议同时调用。
二. 原理
2.1 包的组成
- sta:BFD 的本地状态 down/init/up;
- Detect Mult: 检测超时倍数;
- My discriminator: 本地标识符,用于区分一个系统的多个 BFD 会话;
- Your discriminator: 远端标识符,用于一个 BFD 进程确定远端 BFD 进程是否合法,可动态或静态配置;
- Desired Min TX interval: 期望的发送间隔 ms;
- Required Min RX interval: 支持的最小接收间隔 ms;
- Required Min Echo RX Interval: 支持的最小的 echo 请求报文的接收间隔 ms,为 0 则表示不支持查询模式;
2.2 工作过程
2.2.1 会话建立
- 静态方式: 手工指定 BFD 会话参数,主要是本地和远端标识符,也可以指定时间相关的参数;
- 动态方式: 本地动态生成本地标识符,从远端学习远端标识符;
2.2.2 超时时间
超时时间 = Detect Mult * 周期
超时时间的计算依据检测机制的不同,共分为三种:
- 异步模式 - 本端按照一定周期发送报文,检测位置在对端:
周期协商: (思路: 要综合两端的发送能力和接收能力,选个下限,即更大的间隔)
本端发送周期: 从本端的 Desired Min TX interval 和远端的 Required Min RX interval 中选个大的;
本端接收周期: 从本端的 Required Min RX interval 和远端的 Desired Min TX interval 中选个大的;
Detect Mult 选择: (思路: 谁触发的会话用谁)
流(本端发送-对端接收): 用本端的 Detect Mult;
流(本端接收-对端发送): 用对端的 Detect Mult;
- 查询模式(很少使用,可能不在被支持) - 本端按照一定周期发送报文,对端收到报文后直接回复,检测位置在本端:
周期协商: (思路: 要综合两端的发送能力和接收能力,选个下限,即更大的间隔)
本端发送周期: 从本端的 Desired Min TX interval 和远端的 Required Min Echo RX Interval 中选个大的;
Detect Mult 选择: (思路: 谁触发的会话用谁)
本端单侧查询模式: 用本端的 Detect Mult;
- 单臂模式 - 本端按照一定周期发送源目IP/discriminator 均为自身的BFD报文,对端不起 BFD 进程,直接将该包发回;
周期协商: (思路: 要综合两端的发送能力和接收能力,选个下限,即更大的间隔)
本端发送周期: 从本端的 Desired Min TX interval 和本端的 Required Min RX interval中选个大的;
Detect Mult 选择: (思路: 谁触发的会话用谁)
本端单臂模式: 用本端的 Detect Mult;
2.2.3 状态迁移
- down 时: 会话未建立,BFD 处于异常状态
- 收到对端 sta = down 报文进入 init 状态,并发送 sta = init 报文;
- 收到对端 sta = init 报文进入 up 状态,并发送 sta = up 报文;
- 收到对端 sta = up 报文时保持 down 状态不变。
- init 时: 会话正在建立,BFD 处于异常状态
- 收到对端 sta = init/up 报文进入 up 状态, 否则超时时间到了后进入 down 状态;
- up 状态: 会话稳定态, BFD 处于正常状态
- 收到对端 sta = down 报文或超时时间内未收到报文,进入 down 状态;
还有一个状态机: 管理 down 状态 - 手工 shutdown 了 bfd 会话,就会处于这个状态。
三. 使用
3.1 配置
# 创建会话并进入视图
bfd session-name bind peer-ip ip-address [ vpn-instance vpn-name ] interface interface-type interface-number [ source-ip ip-address ][auto]
# 是否为单臂模式
one-arm-echo
# 配置本地和远端标识符
discriminator local/remote discr-value
# 查看命令
display bfd session all verbose
3.2 应用
- BFD 与 track 模块联动: …
- BFD 与 静态路由联动:…
- BFD 与 OSPF 联动:…