BFD概述
BFD(Bidirectional Forwarding Detection,双向转发检测)提供了一个通用的、标准化的、介质无关和协议无关的快速故障检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状态。
BFD是一个简单的“Hello”协议。两个系统之间建立BFD会话通道,并周期性发送BFD检测报文,如果某个系统在规定的时间内没有收到对端的检测报文,则认为该通道的某个部分发生了故障。
由于同一个数据路径上只建立一个BFD会话,如果不同的应用使用的BFD参数不一致,则应该配置一个能满足所有应用要求的BFD参数。
BFD报文结构
BFD控制报文根据场景不同封装不同,报文结构由强制部分和可选的认证字段组成。
Ver:BFD协议版本号,目前为1。
Diag:诊断字,标明本地BFD系统最近一次会话状态发生变化的原因。
Sta:BFD本地状态。
P:参数发生改变时,发送方在BFD报文中置该标志,接收方必须立即响应该报文。
F:响应P标志置位的回应报文中必须将F标志置位。
C:转发/控制分离标志,一旦置位,控制平面的变化不影响BFD检测。
A:认证标识,置1代表会话需要进行验证。
D:查询请求,置位代表发送方期望采用查询模式对链路进行监测。
M:为BFD将来支持点对多点扩展而设的预留位。
Detect Mult:检测超时倍数,用于检测方计算检测超时时间。
Length:报文长度,单位为字节。
My Discriminator:BFD会话连接本地标识符(Local Discriminator) 。发送系统产生的一个唯一的、非0鉴别值,用来区分一个系统的多个BFD会话。
Your Discriminator:BFD会话连接远端标识符(Remote Discriminator) 。从远端系统接收到的鉴别值,这个域直接返回接收到的“My Discriminator”,如果不知道这个值就返回0。
Desired Min TX Interval:本地支持的最小BFD报文发送间隔。
Required Min RX Interval:本地支持的最小BFD报文接收间隔。
Required Min Echo RX Interval:本地支持的最小Echo报文接收间隔,单位为微秒(如果本地不支持Echo功能,则设置0)。
抓包观察
1 协议版本:1
2 诊断字:无
3 当前状态:UP
4 标志位:未配置
5 检测倍率:3(失效时间300毫秒)
6 报文长度:24字节
7 本地标识符:2
8 远端标识符:1
9 发送间隔:100毫秒
10 接收间隔:100毫秒
11 回声功能间隔:0
BFD会话建立
BFD会话的建立有两种方式,即静态建立BFD会话和动态建立BFD会话。BFD通过控制报文中的本地标识符和远端标识符区分不同的会话。静态和动态创建BFD会话的主要区别在于Local Discriminator和Remote Discriminator的配置方式不同。
静态建立BFD会话
静态建立BFD会话是指通过命令行手工配置BFD会话参数,包括配置本地标识符和远端标识符等,然后手工下发BFD会话建立请求。
动态建立BFD会话
动态建立BFD会话的本地标识符由触发创建BFD会话的系统动态分配,远端标识符从收到对端BFD消息的Local Discriminator的值学习而来。
当应用程序触发动态创建BFD会话时,系统分配属于动态会话标识符区域的值作为BFD会话的本地标识符。然后向对端发送Remote Discriminator的值为0的BFD控制报文,进行会话协商。
当BFD会话的一端收到Remote Discriminator的值为0的BFD控制报文时,判断该报文是否与本地BFD会话匹配,如果匹配,则学习接收到的BFD报文中Local Discriminator的值,获取远端标识符。
BFD会话状态
BFD会话有四种状态:Down、Init、Up和AdminDown。会话状态变化通过BFD报文的State字段传递,系统根据自己本地的会话状态和接收到的对端BFD报文驱动状态改变,BFD状态机的建立和拆除都采用三次握手机制,以确保两端系统都能知道状态的变化。
BFD会话过程中包含有三个状态:init和up两个用来建立会话,down用来断开会话。建立和断开会话都需要三次握手确保两端系统都感知到。另外还有一个特殊状态:管理down,使会话可以通过管理手段down,在状态机中管理down也是down状态。每个系统通过报文中的sta域发送本端状态,接收报文中的sta域了解对端状态,综合起来决定状态机的跳转。
Down状态说明会话down。一个会话会维持在down状态直到收到对端的报文并且该报文的sta字段标志着对端状态不是up。如果收到的是down包,状态机将从down状态跳转到init状态,如果收到的是init包,状态机将从down状态跳转到up状态,如果收到的是up包,状态机维持down状态。
Init状态说明与远端正在通信,并且本地会话期望进入up状态,但是远端还没回应。一个init状态的会话会维持init状态直到收到对端的init包或者up包,就会跳转到up状态,否则等到检测时间超时以后,便会跳转到down状态,意味着与远端的通信丢失。
Up状态说明BFD会话成功建立,并且正在确认链路的联通性,会话会一直保持在up状态直到链路故障或者管理down操作。如果收到远端的down包或者检测时间超时会话就会从up状态跳转到down状态。
管理down意味着会话是被管理操作down的,这会导致远端系统会话进入down状态,并且一直保持down状态直到本端退出管理down。管理down并不意味着转发路径的连通性问题。
BFD检测模式
BFD的检测机制:两个系统建立BFD会话,并沿它们之间的路径周期性发送BFD控制报文,如果一方在既定的时间内没有收到BFD控制报文,则认为路径上发生了故障。BFD的检测模式有异步模式和查询模式两种。
异步模式
系统之间相互周期性地发送BFD控制包,如果某个系统在检测时间内没有收到对端发来的BFD控制报文,就宣布会话为Down。
查询模式
在需要验证连接性的情况下,系统连续发送多个BFD控制包,如果在检测时间内没有收到返回的报文就宣布会话为Down。
异步模式和查询模式的本质区别:异步模式下相互监测,查询模式下本端单方面监测远端。
BFD检测时间
BFD会话检测时长由TX发送时间间隔(Desired Min TX Interval),RX接收时间间隔(Required Min RX Interval),DM监测倍数(Detect Multi、用于检测方计算检测超时时间)三个参数决定。BFD报文的实际发送时间间隔,实际接受时间间隔由BFD会话协商决定。
本地BFD报文实际发送时间间隔=MAX { 本地配置的发送时间间隔,对端配置的接收时间间隔 }
本地BFD报文实际接收时间间隔=MAX { 对端配置的发送时间间隔,本地配置的接收时间间隔 }
PS:MAX函数指选取范围中的最大值。
本地BFD报文实际检测时间:
异步模式:本地BFD报文实际接收时间间隔×对端配置的BFD检测倍数
查询模式:本地BFD报文实际接收时间间隔×本端配置的BFD检测倍数
如图:
BFD缺省时间参数
BFD报文发送间隔默认1000毫秒,接受间隔默认1000毫秒,本地检测倍数3次。
BFD会话等待恢复时间0秒,会话延迟Up时间0秒。
BFD Echo功能
BFD Echo功能也称为BFD回声功能,是由本地发送BFD Echo报文,远端系统将报文环回的一种检测机制。
在两台直接相连的设备中,其中一台设备支持BFD功能;另一台设备不支持BFD功能,只支持基本的网络层转发。为了能够快速的检测这两台设备之间的故障,可以在支持BFD功能的设备上创建单臂回声功能的BFD会话。支持BFD功能的设备主动发起回声请求功能,不支持BFD功能的设备接收到该报文后直接将其环回,从而实现转发链路的连通性检测功能。
BFD应用场景举例
单跳检测二层链路
单跳指只有1跳的链路
交换机1配置
//开启BFD
[SW1]bfd
[SW1-bfd]q
//创建BFD会话10,绑定组播地址与出接口1(当用于二层监测时用default ip组播进行绑定)
[SW1]bfd 10 bind peer-ip default-ip interface GigabitEthernet 0/0/1
//配置本地标识符为1
[SW1-bfd-session-10]discriminator local 1
//配置远端标识符为2
[SW1-bfd-session-10]discriminator remote 2
//配置BFD状态于接口联动(用于default ip)
[SW1-bfd-session-10]process-interface-status
//提交配置
[SW1-bfd-session-10]commit
交换机2配置(本地标识符和远端标识与交换机1相反)
[SW2]bfd
[SW2-bfd]q
[SW2]bfd 10 bind peer-ip default-ip interface GigabitEthernet 0/0/1
[SW2-bfd-session-10]discriminator local 2
[SW2-bfd-session-10]discriminator remote 1
[SW2-bfd-session-10]process-interface-status
[SW2-bfd-session-10]commit
查看BFD详细状态
<SW1>display bfd session all verbose
--------------------------------------------------------------------------------
Session MIndex : 256 (One Hop) State : Up Name : 10
--------------------------------------------------------------------------------
Local Discriminator : 1 Remote Discriminator : 2
Session Detect Mode : Asynchronous Mode Without Echo Function
BFD Bind Type : Interface(GigabitEthernet0/0/1)
Bind Session Type : Static
Bind Peer IP Address : 224.0.0.184
NextHop Ip Address : 224.0.0.184
Bind Interface : GigabitEthernet0/0/1
FSM Board Id : 0 TOS-EXP : 7
Min Tx Interval (ms) : 1000 Min Rx Interval (ms) : 1000
Actual Tx Interval (ms): 1000 Actual Rx Interval (ms): 1000
Local Detect Multi : 3 Detect Interval (ms) : 3000
Echo Passive : Disable Acl Number : -
Destination Port : 3784 TTL : 255
Proc Interface Status : Enable
WTR Interval (ms) : -
Active Multi : 3
Last Local Diagnostic : No Diagnostic
Bind Application : No Application Bind
Session TX TmrID : 1035 Session Detect TmrID : 1036
Session Init TmrID : - Session WTR TmrID : -
Session Echo Tx TmrID : -
---- More ----
单跳检测VLANIF接口
交换机1配置
[SW1]bfd
[SW1-bfd]q
//指定SW1的IP地址和本地的vlanid接口
[SW1]bfd 10 bind peer-ip 10.1.0.2 interface Vlanif 10
[SW1-bfd-session-10]discriminator local 1
[SW1-bfd-session-10]discriminator remote 2
[SW1-bfd-session-10]commit
//物理接口配置
#
interface GigabitEthernet0/0/1
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
交换机2配置
[SW2]bfd
[SW2-bfd]q
[SW2]bfd 10 bind peer-ip 10.1.0.1 interface Vlanif 10
[SW2-bfd-session-10]discriminator local 2
[SW2-bfd-session-10]discriminator remote 1
[SW2-bfd-session-10]commit
//物理接口配置
#
interface GigabitEthernet0/0/1
port link-type trunk
port trunk allow-pass vlan 2 to 4094
#
多跳检测
多跳检测必须指定IP地址,因此必须应用在三层链路上。
需求:R1和R3为非直连设备,通过配置静态路由互通。用户希望可以实现对设备间链路故障的快速检测。
路由器1配置
[R1]bfd
[R1-bfd]q
[R1]bfd 10 bind peer-ip 10.1.1.3
[R1-bfd-session-10]discriminator local 1
[R1-bfd-session-10]discriminator remote 2
[R1-bfd-session-10]commit
路由器3配置
[R3]bfd
[R3-bfd]q
[R3]bfd 10 bind peer-ip 10.1.0.1
[R3-bfd-session-10]discriminator local 2
[R3-bfd-session-10]discriminator remote 1
[R3-bfd-session-10]commit
VRRP监视BFD会话
路由器1配置
[R1]bfd
[R1-bfd]q
[R1]bfd 10 bind peer-ip 10.1.0.2 interface GigabitEthernet 0/0/1
[R1-bfd-session-10]discriminator local 1
[R1-bfd-session-10]discriminator remote 2
[R1-bfd-session-10]commit
[R1-GigabitEthernet0/0/1]vrrp vrid 10 virtual-ip 10.1.0.100
[R1-GigabitEthernet0/0/1]vrrp vrid 10 priority 150
//VRRP监视BFD会话1
[R1-GigabitEthernet0/0/1]vrrp vrid 10 track bfd-session 1
路由器2配置
[R2]bfd
[R2-bfd]q
[R2]bfd 10 bind peer-ip 10.1.0.1 interface GigabitEthernet 0/0/1
[R2-bfd-session-10]discriminator local 2
[R2-bfd-session-10]discriminator remote 1
[R2-bfd-session-10]commit
[R2-GigabitEthernet0/0/1]vrrp vrid 10 virtual-ip 10.1.0.100
//VRRP监视BFD会话2
[R2-GigabitEthernet0/0/1]vrrp vrid 10 track bfd-session 2
检测OSPF链路
相关命令
//在OSPF中开启bfd监测功能
[R1-ospf-1]bfd all-interfaces enable
//在接口下开启bfd监测
[R1-GigabitEthernet0/0/0]ospf bfd enable
//在接口下关闭bfd监测功能
[R1-GigabitEthernet0/0/0]ospf bfd block
其他常见配置命令
//配置动态BFD
bfd 10 bind peer-ip 10.1.0.1 source-ip 10.1.0.2 auto
//配置期望发送时间间隔(实际间隔需要协商)
[R2-bfd-session-10]min-tx-interval ?
INTEGER<10-2000> Minimum transmit interval in milliseconds, default is 1000ms
//配置期望接收时间间隔(实际间隔需要协商)
[R2-bfd-session-10]min-rx-interval ?
INTEGER<10-2000> Minimum receive interval in milliseconds, default is 1000ms
//配置监测倍速
[R2-bfd-session-10]detect-multiplier ?
INTEGER<3-50> Detect multiplier, default is 3
//配置管理down
[R2-bfd-session-10]shutdown