双向转发检测BFD(Bidirectional Forwarding Detection)用于快速检测系统之间的通信故障,并在出现故障时通知上层应用。
为了减小设备故障对业务的影响、提高网络的可靠性,设备需要能够尽快检测到与相邻设备间的通信故障,以便能够及时采取措施,从而保证业务继续进行。
现有的故障检测方法主要包括以下几种:
BFD提供了一个与介质和协议无关的快速故障检测机制。具有以下优点:
设备支持的BFD特性主要包括:BFD会话建立、BFD检测模式、单跳和多跳检测、静态标识符自协商BFD、单臂回声功能、联动功能和动态改变BFD参数。
BFD通过控制报文中的本地标识符(Local Discriminator)和远端标识符(Remote Discriminator)区分不同的会话。按照本地标识符和远端标识符创建方式的差异,设备支持以下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和OSPF联动。缺省情况下,OSPF发送Hello报文的时间间隔为10秒钟,设备能感知到邻居故障的时间最小也是秒级。在高速的网络环境中,这将导致报文大量丢失。BFD联动OSPF可以更快的发现邻接方面出现的故障,并及时通知OSPF重新计算相关路由以便正确指导报文的转发。
设备支持BFD和OSPF联动、BFD和IS-IS联动、BFD和BGP联动、BFD和静态路由联动、BFD和PIM联动、BFD和EFM联动以及BFD和VRRP联动。
当直连链路中间存在传输设备时,与接口本身的链路协议故障检测机制相比,BFD能够更快地检测到链路故障。另外对于Eth-Trunk或VLANIF等逻辑接口来说,链路协议状态是由其成员接口的链路协议状态决定的。
因此,为了将BFD检测结果更快地通告到应用程序,在设备接口管理模块中,为每个接口增加了一个属性,即BFD状态,指的是与该接口绑定的BFD会话的状态,系统根据接口的链路状态、协议状态和BFD状态决定接口的状态,并将结果通告给应用程序。
BFD会话状态与接口状态联动功能是指当BFD会话的状态变化时,直接修改接口的BFD状态。
该功能针对绑定出接口且使用缺省组播地址进行检测的单跳BFD会话。
BFD控制报文封装在UDP报文中传送,对于单跳检测其UDP目的端口号为3784,对于多跳检测其UDP目的端口号为4784或3784。
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 § | 1 bit | 参数发生改变时,发送方在BFD报文中置该标志,接收方必须立即响应该报文。1:表示发送系统请求进行连接确认,或者发送请求参数改变的确认。0:表示发送系统不请求确认。 |
Final (F) | 1 bit | 响应P标志置位的回应报文中必须将F标志置位。1:表示发送系统响应一个接收到P比特为1的BFD包。0:表示发送系统不响应一个P比特为1的包。 |
Control Plane Independent © | 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)。 |
在两台交换机之间配置VLANif接口实现三层互通,配置BFD实现链路故障的快速检测。
配置文件:
<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会话配置。
#
AR1和AR3为非直连设备,通过配置静态路由互通。在AR1和RAR3上分别配置BFD会话,实现AR1到AR3间多跳路径的检测。
配置文件:
[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会话状态:
AR4支持BFD功能,而AR5不支持,所以在AR4上配置BFD单臂回声功能,实现链路故障的快速检测。
配置文件:
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 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文档