BFD双向转发检测
https://www.ruijie.com.cn/fw/wt/36476/
BFD:(Bidirectional Forwarding Detection,双向转发检测)协议提供一种轻负载、快速检测两台邻接路由器/交换机之间转发路径连通状态的方法,它是一个简单的“Hello”协议,在很多方面,它与那些著名的路由协议的邻居检测部分相似。一对系统在它们之间的所建立会话的通道上周期性的发送检测报文,如果某个系统在足够长的时间内没有收到对端的检测报文,则认为在这条到相邻系统的双向通道的某个部分发生了故障协议邻居通过该方式可以快速检测到转发路径的连通故障,加快启用备份转发路径,提升现有网络性能。
BFD 提供的检测机制与所应用的接口介质类型、封装格式、以及关联的上层协议如 OSPF、BGP、RIP 等无关。BFD 在两台路由器之间建立会话,通过快速发送检测故障消息给正在运行的路由协议,以触发路由协议重新计算路由表,大大减少整个网络的收敛时间。BFD 本身没有发现邻居的能力,需要上层协议通知与哪个邻居建立会话。
BFD报文格式
BFD发送的检测报文是UDP报文,定义两种类型的报文
建立BFD会话时缺省采用版本1,如果收到对端系统发送的是版本0的报文,将自动切换到版本0。可以通过show bfd neighbors命令查看采用的版本。
1)控制报文
其格式如下:
Vers:BFD协议版本号,目前为1
Diag:诊断字,标明本地BFD系统最近一次会话状态发生变化的原因
Sta:BFD本地状态
P:参数发生改变时,发送方在BFD报文中置该标志,接收方必须立即响应该报文
F:响应P标志置位的回应报文中必须将F标志置位
C:转发/控制分离标志,一旦置位,控制平面的变化不影响BFD检测,如:控制平面为ISIS,当ISIS重启/GR时,BFD可以继续监测链路状态
A:认证标识,置位代表会话需要进行验证
D:查询请求,置位代表发送方期望采用查询模式对链路进行监测
R:预留位
Detect Mult:检测超时倍数,用于检测方计算检测超时时间
Length:报文长度
My Discreaminator:BFD会话连接本地标识符
Your Discreaminator:BFD会话连接远端标识符
Desired Min Tx Interval:本地支持的最小BFD报文发送间隔
Required Min RX Interval:本地支持的最小BFD接收间隔
Required Min Echo RX Interval:本地支持的最小Echo报文接收间隔(如果本地不支持Echo功能,则设置0)
Auth Type:认证类型,目前协议提供有
Simple Password
Keyed MD5
Meticulous Keyed MD5
Keyed SHA1
Meticulous Keyed SHA1
Auth Length:认证数据长度
Authentication Data:认证数据区
其中认证部分为可选部分,可以在报文中选择使用,其中认证方式可以有:Simple Password、Keyed MD5、Meticulous Keyed MD5、Keyed SHA1、Meticulous Keyed SHA1。协议定义了控制报文所使用的UDP目的端口号为3784。
2)回声报文(ECHO)
BFD协议并未定义回声报文的格式,但是对于回声报文,其格式只是与本地相关,远端只需把此报文在反向通道上返回,回声报文的源目的IP相同。
会话建立
BFD在检测前,需要在通道两端建立对等会话,会话建立以后以协商后的速率各自向对端发送BFD的控制报文来实现故障检测。其会话检测的路径可以是标记交换路径,也可以是其它类型的隧道或是可交换以太网。
1)会话初始化过程
对于BFD会话建立过程中的初始化阶段,两端是主动角色还是被动角色是由应用来决定的,但是至少有一端为主动角色。
2)会话建立过程
会话建立过程是一个三次握手的过程,经过此过程后两端的会话变为Up状态,在此过程中同时协商好相应的参数,以后的状态变化就是根据缺陷的检测结果来进行,并做相应的处理。其状态机迁移如下:
以BFD会话连接建立过程为例,简要介绍状态机迁移过程:
A、B两站启动BFD,各自初始状态为“down”,发送BFD报文携带状态为“down”
B站收到状态为“down”的BFD报文,本地状态切换至“init”,发送BFD报文携带状态为“init”
B站本地BFD状态为“init”后,再接收到状态为“down”的报文不做处理
A站BFD状态变化过程同上
B站收到状态为“init”的BFD报文,本地状态切换至“up”
A站BFD状态变化过程同上
A、B两站在发生“down => init”变化后,会启动一个超时定时器,该定时器的作用是防止本地状态阻塞在“init”(有可能AB连接此时断连,会话不能正常建立),如果在规定的时间内仍未收到状态为“init/up”的BFD报文,则状态自动切换回“down”
本地状态UP标志会话建立成功
https://info.support.huawei.com/info-finder/encyclopedia/zh/BFD.html
什么是BFD?
BFD(Bidirectional Forwarding Detection,双向转发检测)是一种基于RFC 5880标准的高速故障检测机制,两个系统建立BFD会话后,在它们之间的通道上周期性地发送BFD报文,如果一方在协商的检测时间内没有接收到BFD报文,则认为这条双向通道上发生了故障。上层协议通过BFD感知到链路故障后可以及时采取措施,进行故障恢复。
为什么要用BFD?
为了减小设备故障对业务的影响,提高网络的可靠性,网络设备需要能够尽快检测到与相邻设备间的通信故障,以便及时采取措施,保证业务继续进行。
在现有网络中,有些链路通过硬件检测信号检测链路故障,如SDH(Synchronous Digital Hierarchy,同步数字体系)告警,但并不是所有的介质都能提供硬件检测。此时,应用就要依靠上层协议自身的Hello报文机制来进行故障检测。上层协议的检测时间通常在秒级,当数据传输速率达到GB级时,秒级检测时间内,大量数据将会丢失。在三层网络中,Hello报文检测机制无法针对所有路由来检测故障,如静态路由。这对系统间互联互通定位故障造成困难。
BFD协议就是在这种背景下产生的,BFD提供了一个通用的标准化的介质无关和协议无关的快速故障检测机制,它具有以下优点:
- 提供轻负荷、短周期的故障检测,故障检测时间可达到毫秒级,可靠性更高。
- 支持多种故障检测,如接口故障、数据链路故障、转发引擎本身故障等。
- 不依赖硬件,能够对任何介质、任何协议层进行实时检测。
BFD典型应用场景
通常,BFD不能独立运行,而是作为辅助与接口状态或与路由协议(如静态路由、OSPF、IS-IS、BGP等)联动使用,此处介绍两种典型应用,其他应用场景请参见BFD应用场景。
BFD与接口状态联动
BFD与接口状态联动提供一种简单的机制,使得BFD检测行为可以关联接口状态,提高了接口感应链路故障的灵敏度,减少了非直连链路故障导致的问题。BFD检测到链路故障会立即上报Down消息到相应接口,使接口进入一种特殊的Down状态:BFD Down状态。该状态等效于链路协议Down状态,在该状态下只有BFD的报文可以正常处理,从而使接口也可以快速感知链路故障。
BFD与接口状态联动
如图所示,链路中间存在其他设备,虽然三层仍是直连,但由于实际物理线路分段,一旦链路故障,两端设备需要比较长的时间才能检测到,导致直连路由收敛慢,网络中断时间长。在SwitchA和SwitchB上配置BFD会话,配置接口联动后,当BFD检测到链路出现故障,立即上报Down消息到相应接口,使接口进入BFD Down状态。
BFD与OSPF联动
网络上的链路故障或拓扑变化都会导致路由重新计算,要提高网络可用性,缩短路由协议收敛时间非常重要。由于链路故障无法完全避免,因此,加快故障感知速度并将故障快速通告给路由协议是一种可行的方案。
BFD与OSPF联动就是将BFD和OSPF协议关联起来,通过BFD对链路故障的快速感应进而通知OSPF协议,从而加快OSPF协议对于网络拓扑变化的响应。下图显示了OSPF协议是否绑定BFD时收敛速度的数据。
OSPF协议收敛速度
BFD与OSPF联动
如上图所示,SwitchA分别与SwitchC和SwitchD建立OSPF邻居关系,SwitchA到SwitchB的路由出接口为Interface 1,经过SwitchC到达SwitchB。邻居状态到达FULL状态时通知BFD建立BFD会话。
当SwitchA和SwitchC之间链路出现故障,BFD首先感知到并通知SwitchA。SwitchA处理邻居Down事件,重新计算路由,新的路由出接口为Interface 2,经过SwitchD到达SwitchB。
BFD是如何工作的?
BFD的检测机制是两个系统建立BFD会话,并沿它们之间的路径周期性发送BFD报文,如果一方在既定的时间内没有收到BFD报文,BFD会话状态变为Down,则认为路径上发生了故障。
下面从BFD故障检测机制、BFD会话建立流程、BFD会话建立方式三个方面介绍BFD是如何工作的。
BFD故障检测机制
BFD在两台网络设备上建立会话,用来检测网络设备间的双向转发路径,为上层应用服务。BFD本身并没有邻居发现机制,而是靠被服务的上层应用通知其邻居信息以建立会话。会话建立后会周期性地快速发送BFD报文,如果设备在检测时间内没有收到BFD报文则认为该双向转发路径发生了故障,通知被服务的上层应用进行相应的处理。
下面以OSPF与BFD联动为例,简单介绍会话工作流程。
BFD会话建立流程图
上图所示是一个简单的网络组网,两台设备上同时配置了OSPF与BFD,BFD会话建立过程如下所示:
-
OSPF通过自己的Hello机制发现邻居并建立连接。
-
OSPF在建立了新的邻居关系后,将邻居信息(包括目的地址和源地址等)通告给BFD。
-
BFD根据收到的邻居信息建立会话。
-
会话建立以后,BFD开始检测链路故障,并做出快速反应。
BFD故障发现处理流程图
如上图所示:
-
被检测链路出现故障。
-
BFD快速检测到链路故障,BFD会话状态变为Down。
-
BFD通知本地OSPF进程BFD邻居不可达。
-
本地OSPF进程中断OSPF邻居关系。
BFD会话建立流程
BFD会话有以下四种状态,会话状态变化通过BFD报文的State字段传递,系统根据本地会话状态和接收到对端BFD报文驱动状态改变。
- Down:会话处于Down或刚刚创建状态。
- Init:已经能够与对端系统通信,本端希望使会话进入Up状态。
- Up:会话已经建立成功。
- AdminDown:会话处于管理性Down状态。
BFD状态机的建立和拆除都采用三次握手机制,以确保两端系统都能知道状态的变化。以BFD会话建立为例,简单介绍状态机的迁移过程。
BFD会话建立流程图
-
SwitchA和SwitchB各自启动BFD状态机,初始状态为Down,发送状态为Down的BFD报文。对于静态配置BFD会话,报文中Remote Discriminator的值是用户指定的;对于动态创建BFD会话,Remote Discriminator的值是0。
-
SwitchB收到状态为Down的BFD报文后,状态切换至Init,并发送状态为Init的BFD报文。
-
SwitchB本地BFD状态为Init后,不再处理接收到的状态为Down的报文。
-
SwitchA的BFD状态变化同SwitchB。
-
SwitchB收到状态为Init的BFD报文后,本地状态切换至Up。
-
SwitchA的BFD状态变化同SwitchB。
BFD会话建立方式
BFD有两种会话建立方式,即静态方式和动态方式。静态和动态创建BFD会话的主要区别在于本地标识符(Local Discriminator)和远端标识符(Remote Discriminator)的配置方式不同。BFD通过控制报文中的Local Discriminator和Remote Discriminator区分不同的会话。
-
静态建立BFD会话
静态建立BFD会话是指通过命令行手工配置BFD会话参数,包括配置本地标识符和远端标识符等,然后手工下发BFD会话建立请求。
-
动态建立BFD会话
动态建立BFD会话时,系统对本地标识符和远端标识符的处理方式如下:
-
动态分配本地标识符
当应用程序触发动态创建BFD会话时,系统分配属于动态会话标识符区域的值作为BFD会话的本地标识符。然后向对端发送Remote Discriminator的值为0的BFD报文,进行会话协商。
-
自学习远端标识符
当BFD会话的一端收到Remote Discriminator的值为0的BFD报文时,判断该报文是否与本地BFD会话匹配,如果匹配,则学习接收到的BFD报文中Local Discriminator的值,获取远端标识符。
-
BFD单臂回声功能
BFD除了与其他协议联动使用,还有一种特殊场景,即BFD单臂回声功能。
单臂回声功能是指通过BFD报文的环回操作检测转发链路的连通性。在两台直连设备中,其中一台设备支持BFD功能,另一台设备不支持BFD功能,只支持基本的网络层转发,此时可以使用BFD单臂回声功能来检测链路。
为了能够快速检测两台设备之间的故障,可以在支持BFD功能设备上创建单臂回声功能的BFD会话,支持BFD功能的设备主动发起回声请求报文,不支持BFD功能的设备接收到该报文后直接将其环回,从而实现转发链路的连通性检测功能。单臂回声功能只适用于单跳BFD会话。
BFD单臂回声功能
如上图所示,SwitchA支持BFD功能,SwitchB不支持BFD功能。在SwitchA上配置单臂回声功能的BFD会话,检测SwitchA到SwitchB之间的单跳路径。SwitchB接收到SwitchA发送的BFD报文后,直接在网络层将该报文环回,从而快速检测SwitchA和SwitchB之间的直连链路的连通性。
BFD双向转发检测
https://blog.csdn.net/qq_42342531/article/details/113882930
定义:
双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状况。
BFD:原理简介
BFD在两台网络设备上建立会话,用来检测网络设备间的双向转发路径,为上层应用服务。BFD本身并没有邻居发现机制,而是靠被服务的上层应用通知其邻居信息以建立会话。会话建立后会周期性地快速发送BFD报文,如果在检测时间内没有收到BFD报文则认为该双向转发路径发生了故障,通知被服务的上层应用进行相应的处理。下面以OSPF与BFD联动为例,简单介绍会话工作流程。
图1 BFD会话建立流程图:
上图所示是一个简单的网络组网,两台设备上同时配置了OSPF与BFD,BFD会话建立过程如下所示:
OSPF通过自己的Hello机制发现邻居并建立连接。
OSPF在建立了新的邻居关系后,将邻居信息(包括目的地址和源地址等)通告给BFD。
BFD根据收到的邻居信息建立会话。
会话建立以后,BFD开始检测链路故障,并做出快速反应。
图2 BFD故障发现处理流程图:
如上图所示:
被检测链路出现故障。
BFD快速检测到链路故障,BFD会话状态变为Down。
BFD通知本地OSPF进程BFD邻居不可达。
本地OSPF进程中断OSPF邻居关系。
BFD会话建立方式:
BFD会话的建立有两种方式,即静态建立BFD会话和动态建立BFD会话。静态和动态创建BFD会话的主要区别在于本地标识符(Local Discriminator)和远端标识符(Remote Discriminator)的配置方式不同。BFD通过控制报文中的Local Discriminator和Remote Discriminator区分不同的会话。
静态建立BFD会话
静态建立BFD会话是指通过命令行手工配置BFD会话参数,包括配置本地标识符和远端标识符等,然后手工下发BFD会话建立请求。
动态建立BFD会话
动态建立BFD会话时,系统对本地标识符和远端标识符的处理方式如下:
动态分配本地标识符
当应用程序触发动态创建BFD会话时,系统分配属于动态会话标识符区域的值作为BFD会话的本地标识符。然后向对端发送Remote Discriminator的值为0的BFD控制报文,进行会话协商。
自学习远端标识符
当BFD会话的一端收到Remote Discriminator的值为0的BFD控制报文时,判断该报文是否与本地BFD会话匹配,如果匹配,则学习接收到的BFD报文中Local Discriminator的值,获取远端标识符。
BFD检测机制:
BFD的检测机制是两个系统建立BFD会话,并沿它们之间的路径周期性发送BFD控制报文,如果一方在既定的时间内没有收到BFD控制报文,则认为路径上发生了故障。
BFD提供异步检测模式。在这种模式下,系统之间相互周期性地发送BFD控制报文,如果某个系统连续几个报文都没有接收到,就认为此BFD会话的状态是Down。
BFD会话管理:
BFD会话有四种状态:Down、Init、Up和AdminDown。会话状态变化通过BFD报文的State字段传递,系统根据自己本地的会话状态和接收到的对端BFD报文驱动状态改变。BFD状态机的建立和拆除都采用三次握手机制,以确保两端系统都能知道状态的变化。以BFD会话建立为例,简单介绍状态机的迁移过程。
图3 BFD会话建立流程图:
RouterA和RouterB各自启动BFD状态机,初始状态为Down,发送状态为Down的BFD报文。对于静态配置BFD会话,报文中的Remote Discriminator的值是用户指定的;对于动态创建BFD会话,Remote Discriminator的值是0。
RouterB收到状态为Down的BFD报文后,状态切换至Init,并发送状态为Init的BFD报文。
RouterB本地BFD状态为Init后,不再处理接收到的状态为Down的报文。
RouterA的BFD状态变化同RouterB。
RouterB收到状态为Init的BFD报文后,本地状态切换至Up。
RouterA的BFD状态变化同RouterB。
BFD缺省配置:
配置单臂回声功能示例:
组网需求
如图1所示,RouterA和RouterB通过直连链路连通,RouterA支持BFD功能,RouterB不支持BFD功能。用户希望实现对链路故障的快速检测。
图1 配置单臂回声功能组网图:
配置思路
采用如下思路配置链路单跳检测:
在RouterA上配置单臂回声功能BFD会话,检测RouterA到RouterB的直连链路。
操作步骤
配置RouterA和RouterB的直连接口IP地址
# 配置RouterA的接口IP地址。
<Huawei> system-view
[Huawei] sysname RouterA
[RouterA] interface gigabitethernet 1/0/0
[RouterA-GigabitEthernet1/0/0] ip address 10.1.1.1 24
[RouterA-GigabitEthernet1/0/0] quit
# 配置RouterB的接口IP地址。
<Huawei> system-view
[Huawei] sysname RouterB
[RouterB] interface gigabitethernet 1/0/0
[RouterB-GigabitEthernet1/0/0] ip address 10.1.1.2 24
[RouterB-GigabitEthernet1/0/0] quit
配置单臂ECHO功能的BFD会话
# 配置RouerA。
[RouterA] bfd
[RouterA-bfd] quit
[RouterA] bfd atob bind peer-ip 10.1.1.2 interface gigabitEthernet1/0/0 one-arm-echo
[RouterA-bfd-session-atob] discriminator local 1
[RouterA-bfd-session-atob] min-echo-rx-interval 100
[RouterA-bfd-session-atob] commit
[RouterA-bfd-session-atob] quit
验证配置结果
# 配置完成后,在RouterA上执行display bfd session all verbose命令,可以看到建立了一个单跳(one hop)的BFD会话,且状态为Up。
<RouterA> display bfd session all verbose
--------------------------------------------------------------------------------
Session MIndex : 256 (One Hop) State : Up Name : atob
--------------------------------------------------------------------------------
Local Discriminator : 1 Remote Discriminator : -
Session Detect Mode : Asynchronous One-arm-echo Mode
BFD Bind Type : Interface(GigabitEthernet1/0/0)
Bind Session Type : Static
Bind Peer IP Address : 10.1.1.2
NextHop Ip Address : 10.1.1.2
Bind Interface : GigabitEthernet1/0/0
FSM Board Id : 0 TOS-EXP : 7
Echo Rx Interval (ms) : 100
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 : Disable Process PST : Disable
WTR Interval (ms) : -
Active Multi : 3 Echo Rx Interval(ms) : 10
Last Local Diagnostic : No Diagnostic
Bind Application : No Application Bind
Session TX TmrID : 87 Session Detect TmrID : 88
Session Init TmrID : - Session WTR TmrID : -
Session Echo Tx TmrID : -
PDT Index : FSM-0 | RCV-0 | IF-0 | TOKEN-0
Session Description : -
--------------------------------------------------------------------------------
Total UP/DOWN Session Number : 1/0
常见配置错误举例:
BFD会话无法UP:
常见原因
本故障的常见原因主要包括:
BFD会话检测的链路存在故障,导致BFD报文无法进行交互。
BFD会话频繁震荡。
操作步骤
执行display current-configuration configuration bfd命令查看BFD会话两端的本地标识符和远端标识符是否匹配。
如果会话两端的discriminator local字段和discriminator remote字段匹配,则转到步骤2。
如果会话两端的discriminator local字段和discriminator remote字段不匹配,则使用discriminator命令配置BFD会话的本地标识符和远端标识符,然后使用display bfd session all命令查看BFD会话是否Up。
如果State字段的值为Up,则表明BFD会话已经建立。
如果State字段的值为非Up,则请转到步骤2。
使用display current-configuration configuration bfd命令,查看BFD会话的min-tx-interval和min-rx-interval信息,检查BFD会话的检测时间是否大于链路的延迟时间。
检测时间 = 接收到的远端Detect Multi × max(本地的RMRI,接收到的DMTI),其中,Detect Mult(Detect time multiplier)是检测倍数,通过detect-multiplier命令配置;RMRI(Required Min Rx Interval)是本端能够支持的最短BFD报文接收间隔,通过min-rx-interval命令配置;DMTI(Desired Min Tx Interval)是本端想要采用的最短BFD报文的发送间隔,通过min-tx-interval命令配置。
链路的延迟时间是指链路的时延,可通过ping或者tracert的方式获取链路的时延。
如果BFD会话的检测时间小于链路的延迟时间,则在BFD会话视图下执行detect-multiplier命令、min-rx-interval命令和min-tx-interval命令调整BFD会话的检测时间,使之大于链路的延迟时间。
BFD会话检测Down影响接口转发:
常见原因
本故障常见的原因主要为配置了BFD会话与接口联动功能。
操作步骤
执行display interface interface-type interface-number命令查看BFD会话绑定的接口的状态。
如果Line protocol current state字段的值为UP,表明当前接口的状态受BFD会话的影响,BFD会话检测到链路故障后,会将此接口的状态置为BFD status down,则转到步骤2。
如果Line protocol current state字段的值为UP,但是接口不可转发,排除转发模块的故障。
执行display bfd session all命令,查看BFD会话的状态。
如果BFD会话的状态为Down,则转到步骤3。
执行display current-configuration configuration bfd-session查看BFD会话的配置信息,检查是否配置了process-interface-status命令。
如果配置了process-interface-status命令,表明此接口的状态是因为BFD会话检测Down,接口被置为DOWN(BFD status down)状态,导致接口不可转发。
修改BFD检测参数不生效:
常见原因
本类故障原因主要为修改BFD会话后,没有提交会话的配置信息。
说明:
请保存以下步骤的执行结果,以便在故障无法解决时快速收集和反馈信息。
操作步骤
执行display current-configuration configuration bfd-session查看BFD会话的配置信息,检查是否配置了commit命令。
如果配置了commit命令,表明修改BFD会话的检测参数后已经提交。
如果没有配置commit命令,表明修改BFD会话的检测参数后未提交,用户需要执行commit命令提交配置。
============= End