双向转发检测-BFD

BFD简介

双向转发检测BFD(Bidirectional Forwarding Detection)用于快速检测系统之间的通信故障,并在出现故障时通知上层应用。

为了减小设备故障对业务的影响、提高网络的可靠性,设备需要能够尽快检测到与相邻设备间的通信故障,以便能够及时采取措施,从而保证业务继续进行。

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

  • 硬件检测:硬件检测的优点是可以很快发现故障,但并不是所有介质都能提供硬件检测。
  • 慢Hello机制:通常采用路由协议中的Hello报文机制。这种机制检测到故障所需时间为秒级。对于高速数据传输,超过1秒的检测时间将导致大量数据丢失。并且,这种机制依赖于路由协议,在小型三层网络中,如果没有部署路由协议,则无法使用路由协议的Hello报文机制来检测故障。
  • 其他检测机制:不同的协议有时会提供专用的检测机制,但在特性间互联互通时,这样的专用检测机制通常难以应用于多个特性。

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

  • 对网络设备间任意类型的双向转发路径提供快速、轻负荷的故障检测。
  • 用单一的机制对任何介质、任何协议层进行实时检测,并支持不同的检测时间与开销。

设备支持的BFD特性:

设备支持的BFD特性主要包括:BFD会话建立、BFD检测模式、单跳和多跳检测、静态标识符自协商BFD、单臂回声功能、联动功能和动态改变BFD参数。

BFD会话建立:

BFD通过控制报文中的本地标识符(Local Discriminator)和远端标识符(Remote Discriminator)区分不同的会话。按照本地标识符和远端标识符创建方式的差异,设备支持以下BFD会话类型:

  • 手工指定标识符的静态BFD会话

    必须手工指定BFD会话的本地标识符和远端标识符。如果本端采用手工指定标识符,则对端也必须手工指定标识符。

  • 标识符自协商的静态BFD会话

    如果对端设备采用动态BFD,而本端设备既要与之互通,又要能够实现BFD检测静态路由,必须配置静态标识符自协商BFD,此时无需指定本地标识符和远端标识符。如果本端采用静态标识符自协商,则对端既可以配置静态标识符自协商,也可以配置动态BFD。

  • 协议触发的动态BFD会话

    动态分配本端标识符和自学习远端标识符,无需指定本地标识符和远端标识符。

BFD检测模式:

设备采用BFD异步检测模式。

各设备间按照协商好的周期发送BFD控制报文,如果某个设备在检测时间内没有收到对端发来的报文,则将BFD会话的状态置为Down。

单跳检测和多跳检测:

单跳检测指检测两台三层直连设备间转发链路的连通性。

多跳检测指检测两台三层非直连设备间任意路径的连通性,这些路径可能跨越很多跳,也可能在某些部分重叠。

静态标识符自协商BFD:

如果对端设备采用动态BFD,而本端设备既要与之互通,又要能够实现BFD检测静态路由,必须配置静态标识符自协商BFD。

单臂回声功能:

在两台直接相连的设备中,其中一台设备支持BFD功能,另一台设备不支持BFD功能。为了能够快速的检测这两台设备之间的故障,可以在支持BFD功能的设备上创建单臂回声功能的BFD会话。支持BFD功能的设备主动发起回声请求功能,不支持BFD功能的设备接收到该报文后直接将其环回,从而实现转发链路的连通性检测功能。

注:单臂回声功能只适用于单跳BFD会话中。

联动功能:

在实际组网中,BFD通常会和其他的协议联合使用,服务于上层应用,比如:BFD和OSPF联动。缺省情况下,OSPF发送Hello报文的时间间隔为10秒钟,设备能感知到邻居故障的时间最小也是秒级。在高速的网络环境中,这将导致报文大量丢失。BFD联动OSPF可以更快的发现邻接方面出现的故障,并及时通知OSPF重新计算相关路由以便正确指导报文的转发。

设备支持BFD和OSPF联动、BFD和IS-IS联动、BFD和BGP联动、BFD和静态路由联动、BFD和PIM联动、BFD和EFM联动以及BFD和VRRP联动。

BFD与接口状态联动:

当直连链路中间存在传输设备时,与接口本身的链路协议故障检测机制相比,BFD能够更快地检测到链路故障。另外对于Eth-Trunk或VLANIF等逻辑接口来说,链路协议状态是由其成员接口的链路协议状态决定的。

因此,为了将BFD检测结果更快地通告到应用程序,在设备接口管理模块中,为每个接口增加了一个属性,即BFD状态,指的是与该接口绑定的BFD会话的状态,系统根据接口的链路状态、协议状态和BFD状态决定接口的状态,并将结果通告给应用程序。

BFD会话状态与接口状态联动功能是指当BFD会话的状态变化时,直接修改接口的BFD状态。

  • 当BFD会话状态变为Down时,与其绑定的接口的BFD状态变为Down,然后将接口状态通告给接口上的应用。
  • 当BFD会话的状态变为Up时,与其绑定的接口的BFD状态变为Up。

该功能针对绑定出接口且使用缺省组播地址进行检测的单跳BFD会话。

BFD报文格式

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

BFD控制报文根据场景不同封装不同。BFD控制报文包括两部分:强制部分和可选的认证字段。不同的认证类型,认证字段的格式不同。

BFD控制报文强制部分的格式如下:

BFD报文格式

图:BFD报文格式

字段解释:

字段 长度 含义
Version (Vers) 3 bits BFD协议版本号,目前为1。
Diagnostic (Diag) 5 bits 诊断字,标明本地BFD系统最近一次会话状态发生变化的原因,取值及含义: 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
State (Sta) 2 bits BFD本地状态。0 – AdminDown; 1 – Down; 2 – Init; 3 – Up
Poll (P) 1 bit 参数发生改变时,发送方在BFD报文中置该标志,接收方必须立即响应该报文。1:表示发送系统请求进行连接确认,或者发送请求参数改变的确认。0:表示发送系统不请求确认。
Final (F) 1 bit 响应P标志置位的回应报文中必须将F标志置位。1:表示发送系统响应一个接收到P比特为1的BFD包。0:表示发送系统不响应一个P比特为1的包。
Control Plane Independent (C) 1 bit 转发/控制分离标志,一旦置位,控制平面的变化不影响BFD检测,如:控制平面为IS-IS,当IS-IS重启/GR时,BFD可以继续监测链路状态。1:表示发送系统的BFD实现不依赖于它的控制平面。即,BFD报文在转发平面传输,即使控制平面失效,BFD仍然能够起作用。0:表示BFD报文在控制平面传输。
Authentication Present (A) 1 bit 认证标识,置1代表会话需要进行验证。
Demand (D) 1 bit 查询请求,置位代表发送方期望采用查询模式对链路进行监测。1:表示发送系统希望工作在查询模式。0:表示发送系统不希望、或不能工作在查询模式。
Multipoint (M) 1 bit 为BFD将来支持点对多点扩展而设的预留位。
Detect Mult 8 bits 检测超时倍数,用于检测方计算检测超时时间。查询模式:采用本地检测倍数。异步模式:采用对端检测倍数。
Length 8 bits 报文长度,单位为字节。
My Discriminator 32 bits BFD会话连接本地标识符。发送系统产生的一个唯一的、非0鉴别值,用来区分一个系统的多个BFD会话。
Your Discriminator 32 bits BFD会话连接远端标识符。从远端系统接收到的鉴别值,这个域直接返回接收到的“My Discriminator”,如果不知道这个值就返回0。
Desired Min TX Interval 32 bits 本地支持的最小BFD报文发送间隔,单位为微秒。
Required Min RX Interval 32 bits 本地支持的最小BFD报文接收间隔,单位为微秒。
Required Min Echo RX Interval 32 bits 本地支持的最小Echo报文接收间隔,单位为微秒(如果本地不支持Echo功能,则设置0)。

BFD报文抓包示例:

BFD报文抓包

图:BFD报文抓包示例

配置BFD

配置VLANIF接口BFD单跳检测:

在两台交换机之间配置VLANif接口实现三层互通,配置BFD实现链路故障的快速检测。

配置vlanif接口BFD单跳检测

图:配置VALNIF接口BFD单跳检测

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<SW1>dis current-configuration 
#
sysname SW1
#
interface Vlanif1 //配置VALNIF接口
ip address 12.1.1.1 255.255.255.0
#
bfd 1 bind peer-ip 12.1.1.2 interface Vlanif1 source-ip 12.1.1.1
//创建BFD会话绑定信息
discriminator local 1 //配置BFD会话的本地标识符。
discriminator remote 2 //配置BFD会话的远端标识符。
commit //用来提交BFD会话配置。
#

配置BFD多跳检测:

AR1和AR3为非直连设备,通过配置静态路由互通。在AR1和RAR3上分别配置BFD会话,实现AR1到AR3间多跳路径的检测。

BFD多跳检测

图:配置BFD多跳检测

配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[AR1]dis current-configuration 
#
sysname AR1
#
interface GigabitEthernet0/0/0
ip address 12.1.1.1 255.255.255.0
#
bfd 1 bind peer-ip 23.1.1.3
//配置BFD绑定远端IP地址
discriminator local 2
discriminator remote 1
description duotainjiance
//配置BFD会话的描述信息。
min-tx-interval 1200
//配置BFD报文的发送间隔。
min-rx-interval 1200
//配置BFD报文的接收间隔。
wtr 3
//配置BFD会话的等待恢复时间。 缺省情况下,WTR为0,即不等待。
commit
//提交BFD配置
#
ip route-static 23.1.1.0 255.255.255.0 12.1.1.2
#

BFD会话状态:

BFD会话信息

图:BFD会话信息

配置BFD单臂回声功能:

AR4支持BFD功能,而AR5不支持,所以在AR4上配置BFD单臂回声功能,实现链路故障的快速检测。

配置BFD单臂检测功能

图:配置BFD单臂检测功能

配置文件:

1
2
3
4
5
6
7
interface GigabitEthernet0/0/0
ip address 12.1.1.1 255.255.255.0
#
bfd 1 bind peer-ip 12.1.1.2 interface GigabitEthernet0/0/0 one-arm-echo
discriminator local 1
commit
#

其他常用BFD配置命令行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
bfd bind peer-ip source-ip auto
//用来创建静态标识符自协商BFD会话。
bfd one-arm-echo
//配置单臂回声功能的BFD会话。
default-ip-address
//配置BFD缺省组播地址。缺省情况下,组播缺省地址为224.0.0.184。
delay-up
//用来使能延迟BFD会话Up的功能。
detect-multiplier
//配置BFD会话的本地检测倍数。缺省情况下,BFD会话本地检测倍数为3。
discriminator//(鉴别器)
//用来配置静态BFD会话的本地标识符和远端标识符。
min-echo-rx-interval
//配置单臂回声功能的BFD报文的最小接收间隔。
multi-hop destination-port { 3784 | 4784 }
//用来配置多跳BFD会话的目的端口号。
//缺省情况下,使用3784作为多跳BFD会话报文的目的端口号。
peer-ip ttl
//配置BFD报文的生存时间。
/*缺省情况下,不配置BFD报文的生存时间,采用默认值。对于静态配置的BFD会话,单跳BFD报文的生存时间为255,多跳BFD报文的生存时间为254;对于动态建立的BFD会话,单跳BFD报文的生存时间为255,多跳BFD报文的生存时间为253。*/
process-interface-status
//用来配置当前BFD会话与绑定的接口进行状态联动。
snmp-agent bfd trap-interval
//用来设置发送Trap消息定时器的时间间隔。
//缺省情况下,发送Trap消息定时器的时间间隔是120秒。
snmp-agent trap enable feature-name bfd
//用来打开BFD模块的告警开关。
tos-exp
//用来设置BFD报文的优先级。缺省情况下,BFD报文的优先级是7。
track bfd session-name
//用来把BFD会话加入BFD组。
unlimited-negotiate
//用来使能组播BFD会话无条件协商功能。

参考资料:华为HedEx文档


坚持原创技术分享,您的支持将鼓励我继续创作!