BFD(Bidirectional Forwarding Detection,双向转发检测)
提供了一个通用的、标准化的、介质无关和协议无关的快速故障检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状态。【每个厂家都支持的】
BFD建立的关系叫作BFD会话,会话建立后会周期性地快速发送BFD报文,如果在检测时间内没有收到BFD报文则认为该双向转发路径发生了故障,通知被服务的上层应用进行相应的处理。如果此时与OSPF进行绑定,那么将会断开相应的邻居关系。
如下图,A设备与B设备通过光纤连接,中间经过光传输设备。
如下图,AB设备上建立BFD会话与OSPF进行绑定,实现快速检测,当中间链路故障后一定时间,BFD会话断开,将会马上触发A与B设备的OSPF邻居关系中断,从而防止大量流量丢包。
扩展:邻居断开之后,OSPF需要重新计算拓扑再进行路由也需要消耗一定时间。
BFD属于应用层协议,BFD控制报文封装在UDP报文中传送,对于单跳检测其UDP目的端口号为3784,对于多跳检测其UDP目的端口号为4784或3784。
下图中,标注出下文中常见最多的一些报文字段信息:
其它字段可自行查看《IP报文格式大全.html
BFD主要是通过让两端建立起一条BFD会话,然后通过指定的检测方式进行检测对方是否存活,如果判定对方死亡,将马上中断BFD会话。
BFD会话的建立有两种方式,即静态建立BFD会话和动态建立BFD会话。
静态和动态创建BFD会话的主要区别在于本地标识符(Local Discriminator)和远端标识符(Remote Discriminator)的配置方式不同。
BFD通过控制报文中的【My Discriminator字段】和【Your Discriminator字段】区分不同的会话。
如下图:
BFD会话有四种状态:Down、Init、Up和AdminDown。
会话状态变化通过BFD报文的【Sta字段】传递,系统根据自己本地的会话状态和接收到的对端BFD报文驱动状态改变。
BFD状态机的建立和拆除都采用三次握手机制,以确保两端系统都能知道状态的变化。
下图抓包中,R2向R1发送Sta=Down,R1进入Init状态后回复Sta=Init,R2收到Init回复之后进入到Up状态并回复R1 Sta=up,后继双方定期发送Sta=Up的BFD报文进行保活。
BFD中关闭BFD会话,与删除BFD会话都会向对端发送Sta=AdminDown的BFD报文,使得对端快速断开会话。
192.168.2.1为R1/A
会话断开之后,由于R2的会话还未删除,故会定期的发送BFD给R1。
故从现象得知,Sta=AdminDown的作用是通知对方断开与自己的会话状态,而不会删除对端的会话。
而R2定期的发送BFD报文可以使得R1重新建立会话时可以快速的建立。
BFD抓包中,会看到 Info信息中有显眼的【Diag字段】,它是BFD的诊断字。
BFD诊断字,标明本地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 目前未使用到的标识
抓包举例:下图中(192.168.2.2)端最近一次断开会话是因为Neighbor Signaled Session Down(邻居会话断开,即对端手动断开会话/删除会话导致的)
两个系统建立BFD会话,并周期性发送BFD控制报文,如果一方在既定的时间内没有收到BFD控制报文,则认为路径上发生了故障,即会断开会话。
BFD的检测模式有异步模式和查询模式两种。
异步模式:周期性地向对方发送BFD报文,如果在检测时间内没有收到对端的BFD报文,则会话断开(Down)。
查询模式:在需要验证连接性的情况下,系统连续向对端发送多个BFD报文,如果在检测时间内没有收到返回的报文则会话断开(Down)。
BFD会话检测时长由TX(Desired Min TX Interval),RX(Required Min RX Interval),DM(Detect Multi)三个参数决定。
BFD报文的实际发送时间间隔,实际接受时间间隔由BFD会话协商决定,即双方间隔不一致时需要进行协商出双方都能接收的间隔。
默认情况下的参数:
Tx 发送间隔,1000毫秒
Rx 接收间隔,1000毫秒
DM 检测倍数,3倍
时间间隔协商规则:
本地BFD报文实际发送时间间隔TX=MAX {本地配置的发送时间间隔,对端配置的接收时间间隔 }
本地BFD报文实际接收时间间隔RX=MAX { 对端配置的发送时间间隔,本地配置的接收时间间隔 }
本地BFD报文实际检测时间:
- 异步模式:本地BFD报文实际检测时间=本地BFD报文实际接收时间间隔×对端配置的BFD检测倍数
- 查询模式:本地BFD报文实际检测时间 = 本地BFD报文实际接收时间间隔×本端配置的BFD检测倍数
协商案例如下:
R1协商TX = (本地TX100ms,对端RX50ms)取最大值,故TX=100ms
R1协商RX = (本地RX200ms,对端TX150ms)取最大值,故RX=200ms
R1异步模式下的检测时间 = RX200ms * 对端DM 4
R1查询模式下的检测时间 = RX200ms * 本端DM 3
由本地发送BFD Echo报文,远端系统将报文环回的一种检测机制(我发给对端,对端重新发回来给我,对端并不需要读取报文中的内容)。
主要应用于两台直接相连的设备中,其中一台设备支持BFD功能(R1);另一台设备不支持BFD功能(R2),只支持基本的网络层转发。
为了能够快速的检测这两台设备之间的故障,可以在支持BFD功能的设备上创建单臂回声功能的BFD会话。
注意:PC设备并不支持IP路由功能,故需要与PC端建立BFD Echo回声功能
常规下BFD用于设备与设备之间进行检测链路通断,而BFD多跳检测则可以跨越多个设备进行与对端进行BFD检测。
关于多跳与单跳之间的利弊简单分析:
如下图,可以很明显看出区别:
但可能会有疑问:AR3到AR8如果原先走465(上链路),如果AR6故障了,路由重新切换回475(下链路)的时候是否会出现BFD会话中断?
不会中断,因为默认情况下,对于AR4来说去往AR8走AR6、AR7都是等价的,如果AR6故障了,那么将会马上切换到AR7上进行流量转发,切换过程会非常快,并不需要重新计算。
实验拓扑:
仅有AR3、AR4路由设备,互联地址10.1.34.0/34。
实验需求:
AR3与AR4之间建立BFD会话检测保障链路故障后能够快速感知。
AR3
[AR3]bfd
[AR3-bfd]quit
[AR3]bfd 1 bind peer-ip default-ip interface g0/0/0
[AR3-bfd-session-1]discriminator local 3
[AR3-bfd-session-1]discriminator remote 4
[AR3-bfd-session-1]commit
AR4
[AR4]bfd
[AR4-bfd]quit
[AR4]bfd 1 bind peer-ip default-ip interface g0/0/0
[AR4-bfd-session-1]discriminator local 4
[AR4-bfd-session-1]discriminator remote 3
[AR4-bfd-session-1]commit
AR3
dis bfd session all
--------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
--------------------------------------------------------------------------------
3 4 224.0.0.184 Up S_IP_IF GigabitEthernet0/0/0
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0
AR4
dis bfd session all
--------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
--------------------------------------------------------------------------------
4 3 224.0.0.184 Up S_IP_IF GigabitEthernet0/0/0
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0
缺省情况下,BFD使用组播IP地址224.0.0.184作为目的地址发送BFD报文。
也可进入BFD会话中进行修改默认组播地址:
[AR3]bfd
[AR3-bfd]default-ip-address ?
IP_ADDRDefault multicast address 224.0.0.107-224.0.0.250
实验拓扑:
实验需求:
由于AR3与AR8建立起了IBGP邻居关系,为了提高链路故障之后快速感知,要求AR3与AR8建立BFD多跳检测保障设备之间存在通信故障时能够快速断开IBGP邻居防止大量数据丢包。
省略配置路由协议部分,使得AR3能够访问到AR8的环回口地址
[AR3]ping -a 3.3.3.3 8.8.8.8
PING 8.8.8.8: 56 data bytes, press CTRL_C to break
Reply from 8.8.8.8: bytes=56 Sequence=1 ttl=252 time=260 ms
Reply from 8.8.8.8: bytes=56 Sequence=2 ttl=252 time=50 ms
Reply from 8.8.8.8: bytes=56 Sequence=3 ttl=252 time=40 ms
[AR8]ping -a 8.8.8.8 3.3.3.3
PING 3.3.3.3: 56 data bytes, press CTRL_C to break
Reply from 3.3.3.3: bytes=56 Sequence=1 ttl=252 time=50 ms
Reply from 3.3.3.3: bytes=56 Sequence=2 ttl=252 time=40 ms
Reply from 3.3.3.3: bytes=56 Sequence=3 ttl=252 time=40 ms
AR3
[AR3]bfd
[AR3-bfd]quit
[AR3]bfd 1 bind peer-ip 8.8.8.8 source-ip 3.3.3.3
[AR3-bfd-session-1]discriminator local 3
[AR3-bfd-session-1]discriminator remote 8
[AR3-bfd-session-1]commit
AR8
[AR8]bfd
[AR8-bfd]quit
[AR8]bfd 1 bind peer-ip 3.3.3.3 source-ip 8.8.8.8
[AR8-bfd-session-1]discriminator local 8
[AR8-bfd-session-1]discriminator remote 3
[AR8-bfd-session-1]commit
AR3
dis bfd session all
--------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
--------------------------------------------------------------------------------
3 8 8.8.8.8 Up S_IP_PEER -
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0
AR8
dis bfd session all
--------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
--------------------------------------------------------------------------------
8 3 3.3.3.3 Up S_IP_PEER -
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0
查看BFD详细信息
[AR3]display bfd session all verbose
断开流量主用路径,观察BFD状态变化
现象:于AR4上手动关闭流量主用路径g0/0/2口之后,BFD状态无变化,BFD报文无变化。
流量及BFD报文自动切换到备份路径g0/0/1口进行转发,因为路由等价故无需重新计算路由即可快速进行切换转发。
1、BFD多跳检测的三次握手
2、BFD的源目地址及端口信息
缺省情况下,BFD默认使用UDP 3784作为多跳BFD会话报文的目的端口号,而源端口随机
也可进入BFD会话中进行修改目的端口(2选1):
[AR3]bfd
[AR3-bfd]multi-hop destination-port ?
3784 The number of destination port
4784 The number of destination port
实验拓扑:
AR5
[AR5]bfd
[AR5-bfd]quit
[AR5]bfd 1 bind peer-ip 10.1.58.8 interface g0/0/2 one-arm-echo
[AR5-bfd-session-1]discriminator local 10
[AR5-bfd-session-1]commit
疑问:诶?如果peer-ip使用default-ip组播地址的话,还能不能实现Echo回声?
不能,如果peer-ip为组播地址,那么AR5将组播包发送给AR8时,由于对端并没有加入这个组播中,故不会将该数据包重新发回给AR5。
同时也可以输入命令查看补全情况:组播作用目的并不能配置Echo回声功能
[AR5]bfd 1 bind peer-ip default-ip interface g0/0/2 ?
source-ip Set source IP address
Please press ENTER to execute command
AR5
display bfd session all
--------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
--------------------------------------------------------------------------------
10 - 10.1.58.8 Up S_IP_IF GigabitEthernet0/0/2
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0
查看BFD详细信息
[AR5]display bfd session all verbose
由于对端设备并不具备BFD功能,同时发过去的包会返回,故能够看两次三次握手的抓包信息。
需求:
由于AR3与AR4之间经过其它网络设备,为了保证设备间链路或设备故障后能够快速切换链路或中断邻居关系,请在AR3、AR4设备上配置BFD检测功能与OSPF联动。
AR3
[AR3]bfd
[AR3-bfd]quit
[AR3]ospf 1
[AR3-ospf-1]bfd all-interfaces enable
AR4
[AR4]bfd
[AR4-bfd]quit
[AR4]ospf 1
[AR4-ospf-1]bfd all-interfaces enable
默认情况下每秒发送1次BFD报文,3次未收到则超时,也可通过以下命令缩短收发间隔:
[AR3]int g0/0/0
[AR3-GigabitEthernet0/0/0]ospf bfd ?
block Disable BFD on this interface
detect-multiplier Specify the detect multiplier
enable Enable BFD
frr-binding Configure BFD binding link status for Auto FRR
min-rx-interval Specify the minimum receive interval
min-tx-interval Specify the minimum transmit interval
ospf bfd min-tx-interval 最小发送间隔(毫秒)
ospf bfd min-rx-interval 最小接收间隔(毫秒)
(1)LSW4》AR4方向的端口shutdown,观察AR3设备何时断开邻居关系
(2)当端口关闭的3秒后,AR3设备BFD会话断开,紧接着AR3与AR4设备的OSPF邻居随即断开,实现了链路故障的快速检测。
拓扑图:
需求:
AR3与AR8通过环回口建立IBGP邻居,IGP协议使用OSPF,由于中间跨越多台设备,当设备之间网络故障时可能无法及时感知,故要求AR3与AR8建立BFD会话给BGP提供保障。
AR3
[AR3]bfd
[AR3-bfd]quit
[AR3]bgp 100
[AR3-bgp]router-id 3.3.3.3
[AR3-bgp]peer 8.8.8.8 as-number 100
[AR3-bgp]peer 8.8.8.8 connect-interface LoopBack0
[AR3-bgp]peer 8.8.8.8 bfd enable
AR8
[AR3]bfd
[AR3-bfd]quit
[AR3]bgp 100
[AR3-bgp]router-id 8.8.8.8
[AR3-bgp]peer 3.3.3.3 as-number 100
[AR3-bgp]peer 3.3.3.3 connect-interface LoopBack0
[AR3-bgp]peer 3.3.3.3 bfd enable
(1)检查BGP及BFD的状态信息
dis bfd session all
--------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
--------------------------------------------------------------------------------
8193 8195 10.1.34.4 Up D_IP_IF GigabitEthernet0/0/0
8194 8192 8.8.8.8 Up D_IP_PEER -
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 2/0
dis bfd session all
--------------------------------------------------------------------------------
Local Remote PeerIpAddr State Type InterfaceName
--------------------------------------------------------------------------------
8192 8194 3.3.3.3 Up D_IP_PEER -
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0
(2)假设网络中仅剩下一条可用链路维持着BGP邻居关系,此时再断开AR4与AR6之间链路,观察AR3的BFD变化及BGP状态变化。
(3)BGP的BFD检测采用多跳检测,故只要当网络中还存在达到对端的路径就BFD会话就不会断开。直到最后一条链路断开之后,默认3秒超时才会断开BFD会话,从而相应的BGP邻居关系断开。