BFD(Bidrectional Forwarding Detection 双向转发检测)

用于快速检测系统设备之间的发送和接受两个方向的通信故障,并在出现故障时通知生成应用。BFD广泛用于链路故障检测,并能实现与接口、静态路由、动态路由等联动检测。
bfd使用的默认组播地址(默认就是224.0.0.184)

BFD是一种双向转发检测机制,可以提供毫秒级的检测,可以实现链路的快速检测,BFD通过与上层路由协议联动,可以实现路由的快速收敛,确保业务的永续性。

BFD Echo报文采用UDP封装,目的端口号为3784,源端口号在49152到65535的范围内。目的IP地址为发送接口的地址,源IP地址由配置产生(配置的源IP地址要避免产生ICMP重定向)

简介

现有的故障检测方法主要包括以下几种:

  1. 硬件检测:例如通过SDH(Synchronous Digital Hierarchy),同步数字体系)告警检测链路故障。硬件检测的优点是可以很快发现故障,但并不是所有介质都能提供硬件检测。
  2. 慢Hello机制:通常采用路由协议中的Hello报文机制。这种机制检测到故障所需时间为秒级。对于高速数据传输,例如吉比特速率级,超过1秒的检测时间将导致大量数据丢失;对于时延敏感的业务,例如语音业务,超过1秒的延迟也是不能接受的。并且,这种机制依赖于路由协议。
  3. 其他检测机制:不同的协议有时会提供专用的检测机制,但在系统间互联互通时,这样的专用检测机制通常难以部署。
  4. 双向转发检测(BFD)的新协议将帮助解决这个问题,提高故障检测与恢复速度。作为一项IETF草案标准,BFD提供一种检测链路或系统转发传输流能力的简单方法。

BFD是从基础传输技术中经过逐步发展而来的,因此它可以检测网络各层的故障。它可以用以太网、多协议标记交换(MPLS)路径、普通路由封装以及IPSec隧道在内的多种类型的传输正确性。

从本质上讲,BFD是一种高速的独立HELLO协议(类似于那些在路由协议中使用的协议,如开放最短路径优先协议(OSPF),或可以与链路、接口、隧道、路由或其他网络转发部件建立联系的中间系统到中间系统协议)。

BFD能够与相邻系统建立对等关系,然后,每个系统以协商的速率监测来自其他系统的BFD速率。监测速率能够以毫秒级增量设定。当对等系统没有接到预先设定数量的数据包时,它推断BFD保护的软件或硬件基础设施发生故障,不管基础设施是标记交换路径、其他类型的隧道还是交换以太网络。BFD部署在路由器和其他系统的控制平面上。BFD检测到的网络故障可以由转发平面恢复或由控制平面恢复.

BFD提供了一个标准化的与介质和上层协议无关的快速故障检测机制,BFD具有以下优点:

  1. 对两个网络节点之间的链路进行双向故障检测,链路可以是物理链路也可以是逻辑链路(如LSP、隧道等)
  2. 可以为不同的上层应用(如MPLS、OSPF、IS-IS等)提供故障检测的服务,并提供相同的故障检测时间。
  3. BFD的故障检测时间远小于1秒,可以更快地加速网络收敛,减少上层应用中断的时间,提高网络的可靠性和服务质量。

BFD的主要工作过程如下:

  1. BFD在两个端点之间的一条链路上先建立一个BFD会话(依靠上层协议建立,例如OSPF的邻居建立时,会将邻居信息告知BFD,BFD根据这个信息再建立BFD邻居),如果两个端点之间存在多条链路,则可以为每条链路建立一个BFD会话。
  2. BFD在建立会话的两个网络节点之间进行BFD检测。如果发现链路故障就拆除BFD邻居,并立刻通知上层协议,则上层协议会立刻进行相应的切换。

BFD的会话

  • BFD的会话建立分为4个阶段:down、Init、UP、AdminDown(每都到对端发来的一种状态报文,本地节点会话状态就会切换到下一个状态,如收到对端发来的down的bfd报文,本地设备就会将会话状态切换为init状态),并且会话的建立和拆除都是采用三次握手机制实现

BFD检测原理

  1. BFD会话流程的建立,BFD的会话建立有两种方式:静态和动态。在BFD的会话的建立过程中,会有本地标示和远程标示来表示本地和远端节点,静态需要手工配置,动态的由动态路由协议自动分配。
  2. BFD会话建立后,双方会周期性的发送BFD报文来检测链路的有效性,当规定时间内没有收到BFD报文则会认为BFD会话down,链路失效。

在BFD会话建立时,有两种建立模式:主动模式和被动模式

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

BFD在会话建立后有两种操作模式:异步模式和查询模式

  1. 异步模式:在此模式下,网络节点双方会周期性地发送BFD控制报文,如果在检测时间内没有收到对端的BFD控制报文则认为对应的链路出现故障。
  2. 查询模式:假定每个系统都有一个独立的方法,确认自己连接到其他系统。这样,只要有一个BFD会话建立,系统就停止发送BFD控制报文,除非某个系统需要显式地验证连接性。如果要显式地验证连接性,系统发送一个短系列的BFD控制包,如果在检测时间内没有收到返回的报文就宣布会话为Down;如果收到对端的回应报文,协议再次保持沉默。

在BFD中还有一个回声功能,回声功能启动后,会话的一端周期性地发送BFD回声报文,对端不对此报文进行处理,而只将此报文转发再发回给发送端。发送端根据是否能收到BFD会话报文来检测会话状态。BFD回声报文只用来检测直连网段的链路状态,而BFD控制报文还可以检测非直连网段的链路状态。

BFD库(Binary File Descriptor library)

BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件。BFD这个项目本身是binutils项目的一个子项目。BFD把目标文件抽象成一个统一的模型,比如在这个抽象的目标文件模型中,最开始有一个描述整个目标文件总体信息的"文件头",就跟我们实际的ELF文件一样,文件头后面是一系列的段,每个段都有名字、属性和段的内容,同时还抽象了符号表、定位表、字符串表等类似的概念,使得BFD库的程序只要通过这个抽象的目标文件模型就可以实现操作所有BFD支持的目标文件格式。

GCC(更具体地讲是GNU汇编器GAS,GNU Assembler)、连接器ld、调试器GDB及binutils的其他工具都通过BFD库来处理目标文件,而不是直接操作目标文件。这样做的最大的好处是将编译器和连接器本身同具体的目标文件格式隔离开来,一旦我们需要支持一种新的目标文件格式,只须要在BFD库里面添加一种格式就可以了,而不需要修改编译器和连接器。到目前为止,BFD库支持大约25种处理平台,将近50种目标文件格式。

当我们安装了BFD开发库以后(在我的ubuntu下,包括BFD开发库的软件包的名字叫binutils-dev),我们就可以在程序中使用它。

BFD现在越来越多地应用在重要网络、重要链路上,结合路由、MPLS、VPN、流量工程等技术,可以对重点服务流量提供高可靠性,从而保证服务质量。