BFD基础

BFD概述

BFD(Bidirectional Forwarding Detection,双向转发检测),一个通用的、标准化的、介质无关的、协议无关的快速故障检测机制

BFD是一个简单的“Hello”协议,两个系统之间建立BFD会话通道,并周期性发送BFD检测报文,如果一个系统在规定的时间内没有收到对端的检测报文,则认为该通道的某个部分发生了故障。

工作原理

BFD Echo功能

又称为BFD回声功能,本地发送BFD Echo报文,远端系统将报文换回的一种检测机制。 echo报文封装在UDP报文中传送,该报文IP头中的源IP和目的IP均为本端设备的IP地址,其UDP目的端口号为3785。

比如在两台直连的设备中,一台设备支持BFD功能,另一台不支持,则在支持BFD功能的设备上创建单臂回声功能的BFD会话。支持BFD的设备主动发起回声请求功能,不支持BFD的设备收到该报文后直接将其换回,从而实现链路的连通信检测。

注意
  • 缺省情况下是不会创建BFD会话的,在第一次创建BFD单跳会话时,必须绑定对端IP地址和本端响应接口,且创建后不可修改,要修改也只能删除后再创建
  • 华三BFD实现中,当BFD会话工作于echo报文方式时,仅在MPLS TE隧道的场景中支持多跳检测,其他应用的BFD会话仅支持单跳检测,两种应用均不受检测模式的控制。

控制报文格式

BFD控制报文由强制部分和可选的认证字段组成

Ver:BFD协议版本号

Diag:诊断字,标明本地BFD系统最近一次会话状态发生变化的原因

Sta:BFD本地状态

P:参数发生变化时,发送方在BFD报文中置该标志,接受方必须立即响应该报文

F:响应P标志置位的回应报文中必须将F标志置位

C:转发/控制分离标志,一旦置位,控制平面的变化不影响BFD检测

A:认证标识,置1代表会话需要验证

D:查询请求:置位代表发送方期望采用查询模式对链路进行监测

M:为BFD将来支持点到多点扩展的预留位

Detect Mult:检测超时倍数,用于检测方计算检测超时时间

Length:报文长度,单位为字节

My discriminator:BFD会话连接本地标识符。发送系统产生的唯一的、非0鉴别值,用来区分一个系统的多个BFD会话

Your discriminator:BFD会话远端标识符。从远端系统接受到的鉴别值,即远端系统的“My discriminator”

Desired Min Tx Interval:本地支持的最小BFD发送间隔

Required Min RX Interval:本地支持的最小BFD报文接收间隔

Required Min Echo RX Interval:本地支持的最小Echo报文接收间隔,单位为微秒 (如本地不支持Echo,则设置为0)

BFD会话建立

控制报文封装在UDP报文中传送,对于单跳检测其UDP目的端口号为3784,对于多跳检测其UDP目的端口号为4784。

会话建立分为静态建立和动态建立,区别主要在Local DiscriminatorRemote Discriminator的配置方式不同。(即报文格式中提到的My DiscriminatorYour Discriminator

静态建立中是手工配置BFD参数(包括本地和远端标识符),然后手动下发BFD会话建立请求;动态建立中本地标识符由本地系统分配,远端标识符通过接收对端BFD消息学习而来。

此外,BFD会话的建立分为主动建立和被动建立:

  • 主动模式:在建立会话前不管是否收到对端发来的BFD控制报文,都会主动发送BFD控制报文。
  • 被动模式:在建立会话前不会主动发送BFD控制报文,直到收到对端发送来的控制报文。
  • 通信双方至少要有一方运行在主动模式才能成功建立起BFD会话。

BFD会话状态

BFD有四种状态:DownInitUpAdminDown。会话状态通过BFD报文的State字段来传递。

而在BFD会话过程中主要包含前三个状态,Init和Up用来建立会话,Down用来断开会话。建立和断开会话都需要三次握手确保两端系统都能感知到。AdminDown是通过管理手段down,也属于donw状态。

Down状态: 表明当前会话down。当本机处于down状态时,收到了Down包,则状态机跳转到Init状态;而如果收到了Init报文,则跳转到Up报文;如果收到Up报文,则维持Down状态

Init状态: 表明与远端正在通信,并且本地会话期望进入Up状态,但是远端仍未回应。当处于Init状态时,收到了对端的InitUp包,则状态机进入Up状态,否则等到检测时间超时后,进入Down状态

Up状态: 说明BFD会话建立成功,并且正在确认链路的连通性。当处于Up状态时,发生链路故障或进行了管理down操作,或收到远端的down包或者检测时间超时,则进入down状态

BFD检测模式

两个系统建立BFD会话,并沿它们之间的路径周期性发送BFD控制报文,如果一方在既定的时间内没收到BFD控制报文,则认为路径上发生了故障。

BFD检测模式有异步模式和查询模式:

异步模式:系统之间相互发送BFD控制包,如果某个系统在检测时间内没有收到对端发来的BFD控制报文,则认为会话Down

查询模式:在需要验证的情况下,系统连续发送多个BFD控制报文,如果在检测时间内没有收到返回的报文,则认为会话Down。

  • 本端的BFD会话工作在查询模式时,本端设备会向对端发送D比特位置1的BFD控制报文,对端(缺省为异步模式)收到该报文后将停止周期性发送BFD控制报文。
  • 如果BFD会话两端都是查询模式,则双方在BFD会话建立后停止周期性发送BFD控制报文。仅当需要验证连通性的时候,设备会连续发送P比特位置1的BFD控制报文。如果在检测时间内没有收到对端回应的F比特位置1的报文,就认为会话DOWN;如果在检测时间内收到对端回应的F比特位置1的报文,就认为链路连通,停止发送报文,等待下一次触发查询。

两个模式的区别在于是否存在主动方,异步模式中两端系统都为主动方,主动发送BFD控制报文,而查询模式是由一方主动发起查询,对端被动回应。

BFD检测时间

BFD 会话检测时间由 TX,RX 和 DM 三个参数决定。

本地BFD报文实际发送时间间隔 = MAX {本地配置的发送时间间隔,对端配置的接收时间间隔}

本地BFD报文实际接收时间间隔 = MAX {对端配置的发送时间间隔,本地配置的接收时间间隔}

本地BFD报文实际检测时间: - 异步模式:本地BFD报文实际接收时间间隔×对端配置的BFD检测倍数 - 查询模式:本地BFD报文实际接收时间间隔×本端配置的BFD检测倍数

BFD缺省时间参数: 发送间隔:1000ms 接受间隔:1000ms 本地检测倍数:3

参考文章