BFD 原理
BFD 原理
BFD 简介
Bidirectional Forwarding Detection(BFD)是一种可用于快速检测对端网络硬件/软件故障的协议。运行 BFD 的两台路由设备以协商的速率相互发送 BFD 数据包。如果来自启用 BFD 的对端路由器的 BFD 包未能到达,则对端路由器将被本端认为故障。 BFD 将此信息传递给关联的路由协议(如静态路由/OSPF/BGP 等)并更新对应的路由信息。它有助于检测单向设备故障并用于路由协议的快速收敛。
BFD 优点
上层协议(如 BGP、OSPF)的检测时间都在 1s 以上,这样的故障检测时间对某些应用来说是不能容忍的。一般动态路由协议检测时间最小只能达到 1 秒的精度,且无法为其它路由协议提供快速故障检测。
- 可以为不同的上层应用服务(如 OSPF、BGP、静态路由等),提供一致的快速故障检测时间。
- 提供小于 1 秒的检测时间,从而加快网络收敛速度,减少应用中断时间。
- 可以对设备间多种类型的双向转发路径进行故障检测,包括直连物理链路、VPN 隧道、多跳路径(FortiOS 7.2.0 开始支持)等。
BFD 缺点
- BFD 进行链路故障的检测依赖于 BFD 会话能够正常协商完成。
- 当创建 BFD 会话过程中链路存在问题时,即 BFD 会话无法通过三次握手状态切换为 UP 时,BFD 无法检测链路状态,此时当上层应用不存在自身保活时,就无法感知链路故障,导致上层应用无法进行相应的处理。
- 由于对网络质量非常敏感,只适用于链路状态较好的环境下,如专线、直连环境。链路质量较差的环境下 BFD 可能会产生误报行为导致线路波动,所以不建议在诸如 Internet 上的 VPN 线路上使用该功能。
- 与动态路由的 Graceful Restart(GR)功能冲突,不建议同时使用。GR 用于 FortiGate 通知邻居自己的路由进程将重启,并且邻居从 FortiGate 学到的路由应在重启期间保留。但 BFD 检测到故障时会将动态路由邻居重置。这种操作上的差异使得在 GR 的同时使用 BFD 会导致功能上的冲突,可能导致 GR 期间流量中断。业界通用的做法是在使用 GR 时关闭 BFD。
BFD 报文格式

| 字段 | 含义 |
|---|---|
| Vers | BFD 协议版本号,目前版本号为 1 |
| Diag | 诊断码,表明发送方最近一次会话 Down 的原因: 0:No Diagnostic 1:Control Detection Time Expired 2:Echo Function Failed 3:Neighbor Signaled Session Down 4:Forwarding Plane Reset 5:Path Down 6:Concatenated Path Down 7:Administratively Down 8:Reverse Concatenated Path Down 9~31:Reserved for future use For Fortinet: 0x01: Local inactive timer expired 0x03: Remote peer indicates it's down 0x23: Remote peer indicates restarting |
| Sta | 发送方 BFD 会话当前状态,取值为: 0:AdminDown 1:Down 2:Init 3:Up |
| P | 会话参数变化时置位,参数发生改变时,发送方在 BFD 报文中置该标志,接收方必须立即响应该报文: 1:表示发送系统请求进行连接确认,或者发送请求参数改变的确认 0:表示发送系统不请求确认 |
| F | 如果收到的 BFD 控制报文 P 字段置位,则将下一个发送的 BFD 控制报文的 F 字段置位作为应答: 1:表示发送系统响应一个接收到 P 比特为 1 的 BFD 包 0:表示发送系统不响应一个 P 比特为 1 的包 |
| C | 转发/控制分离标志,一旦置位,控制平面的变化不影响 BFD 检测,如:控制平面为 IS - IS,当 IS - IS 重启/GR 时,BFD 可以继续监测链路状态: 1:表示发送系统的 BFD 实现不依赖于它的控制平面。即,BFD 报文在转发平面传输,即使控制平面失效,BFD 仍然能够起作用 0:表示 BFD 报文在控制平面传输 |
| A | 该字段置位表明报文包含认证部分,会话需要进行认证 |
| D | 该字段置位表明发送方希望以查询模式运行,不置位表明不希望以查询模式运行或不支持查询模式 |
| R | 保留位,发送时设为 0,接收时忽略该字段 |
| Detect Mult | 检测时间倍数,用于检测方计算检测超时时间 |
| Length | BFD 控制报文长度,单位为字节 |
| My Discriminator | BFD 会话连接本地标识符。发送系统产生的一个唯一的、非 0 鉴别值,用来区分一个系统的多个 BFD 会话 |
| Your Discriminator | BFD 会话连接远端标识符。从远端系统接收到的鉴别值,这个域直接返回接收到的“My Discriminator”,如果不知道这个值就返回 0 |
| Desired Min TX Interval | 本地支持的最小 BFD 报文接收间隔,单位为毫秒 |
| Required Min RX Interval | 发送方支持的最小 BFD 控制报文接收时间间隔,单位为毫秒 |
| Required Min Echo RX Interval | 本地支持的最小 Echo 报文接收间隔,单位为微秒 (如果本地不支持 Echo 功能,则设置 0) |
| Auth Type | 认证类型 |
| Auth Len | 可选认证部分长度,包括 Auth Type 和 Auth Len 字段,单位为字节 |
BFD 会话建立

BFD 使用三路握手的机制来建立会话,发送方在发送 BFD 控制报文时会在 Sta 字段填入本地当前的会话状态,接收方根据收到的 BFD 控制报文的 Sta 字段以及本地当前会话状态来进行状态机的迁移,建立会话。Router A 和 Router B 的 BFD 收到上层应用的通知后,发送状态为 DOWN 的 BFD 控制报文。Router B 的 BFD 状态变化同 Router A。
- Router B 收到对端状态为 DOWN 的 BFD 控制报文后,本地会话状态由 DOWN 迁移到 INIT,随后发送的 BFD 控制报文中将 Sta 字段填为 2 表明会话状态为 INIT。Router A 的 BFD 状态变化同 Router B。
- Router A 收到对端状态为 INIT 的 BFD 控制报文后,本地会话状态由 INIT 迁移到 UP,随后发送的 BFD 控制报文中将 Sta 字段填为 3 表明会话状态为 UP。Router B 的 BFD 状态变化同 Router A。
- BFD 双方状态都为 UP,会话成功建立并开始检测链路状态。
BFD 定时器协商
FortiGate BFD 会话建立前 BFD 控制报文以 5s 的时间间隔周期发送以减小报文流量。在 BFD 会话建立后则以协商到的时间间隔发送 BFD 控制报文以实现快速检测的目的。在 BFD 会话建立的同时,BFD 控制报文发送时间间隔以及检测超时时间也会通过报文交互协商确定。在 BFD 会话有效期间,这些定时器可以随时协商修改而不影响会话状态。
BFD 会话不同方向的定时器协商是分别独立进行的,两端定时器时间可以不同。BFD 控制报文发送时间间隔为本端 Desired Min TX Interval 与对端 Required Min RX Interval 之中的最大值,也就是说比较慢的一方决定了发送频率。
- 检测超时时间为对端 BFD 控制报文中的 Detect Mult 乘以经过协商的对端 BFD 控制报文发送时间间隔。
- 如果加大本端 Desired Min TX Interval,那么本端实际发送 BFD 控制报文的时间间隔必须要等收到对端 F 字段置位的报文后才能改变,这是为了确保在本端加大 BFD 控制报文发送时间间隔前对端已经加大了检测时间,否则可能导致对端检测定时器错误超时。
- 如果减小本端 Required Min RX Interval,那么本端检测超时时间必须要等收到对端 F 字段置位的报文后才能改变,这是为了确保在本端减小检测超时时间前对端已经减小了 BFD 控制报文发送间隔时间,否则可能导致本端检测定时器错误超时。
- 如果减小本端 Desired Min TX Interval,本端 BFD 控制报文发送时间间隔将会立即减小;加大 Required Min RX Interval,本端检测超时时间将会立即加大。
BFD 协商举例

- Router A 与 Router B 创建 BFD 配置,双方的 Desired Min TX Interval 和 Required Min RX Interval 都为 100ms,Detect Mult 都为 3。根据上面介绍的 BFD 定时器协商规则,Router A 的发送时间间隔为 Router A 的 TX 与 Router B 的 RX 中的最大值:100ms,Router B 的发送时间间隔也是 100ms,双方的检测超时时间都为 100ms * Detect Mult (3) = 300ms。
- 此时将 Router A 的 TX 和 RX 加大到 150ms。
- Router A 比较本端的 RX(150ms)和 Router B 的 TX(100ms),从而将本端检测时间改为 450ms。同时向对端发送 P 字段置位的 BFD 控制报文(TX 和 RX 均为 150ms)。
- Router B 收到报文后,给 Router A 回复 F 字段置位的 BFD 控制报文(TX 和 RX 均为 100ms)。同时将收到报文中的 RX 与本端的 TX 进行比较,由于对端 Router A TX 较大,故 Router B 的发送间隔改为 150ms。经过比较本端 RX 和对端的 TX,从而将检测超时时间也增大到 450ms。
- Router A 收到对端发来 F 字段置位的控制报文。根据报文中的 RX 与本端的 TX 进行比较计算出新的时间间隔为 150ms。
- 定时器协商完成,双方的发送间隔和检测超时时间分别为 150ms 和 450ms。