BFD理论基础

定义:
双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状况。 (注:可以实现快速检测并监控网络中链路或IP路由的转发连通状态,改善网络性能。相邻系统之间通过快速检测发现通信故障,可以更快地帮助用户建立起备份通道以便恢复通信,保证网络可靠性。)


BFD会话建立方式:
1、静态建立BFD会话:

静态建立BFD会话是指通过命令行手工配置BFD会话参数,包括配置本地标识符和远端标识符等,然后手工下发BFD会话建立请求。
2、动态建立BFD会话:
1)、动态分配本地标识符:
当应用程序触发动态创建BFD会话时,系统分配属于动态会话标识符区域的值作为BFD会话的本地标识符。然后向对端发送Remote Discriminator的值为0的BFD控制报文,进行会话协商。
2)、自学习远端标识符:
当BFD会话的一端收到Remote Discriminator的值为0的BFD控制报文时,判断该报文是否与本地BFD会话匹配,如果匹配,则学习接收到的BFD报文中Local Discriminator的值,获取远端标识符。


BFD会话管理:
1、 BFD会话有四种状态:Down、Init、Up和AdminDown。
2、 BFD状态机的建立和拆除都采用三次握手机制,以确保两端系统都能知道状态的变化。以BFD会话建立为例:
BFD理论基础_第1张图片
1)、SwitchA和SwitchB各自启动BFD状态机,初始状态为Down,发送状态为Down的BFD报文。对于静态配置BFD会话,报文中的Remote Discriminator的值是用户指定的;对于动态创建BFD会话,Remote Discriminator的值是0;
2)、SwitchB收到状态为Down的BFD报文后,状态切换至Init,并发送状态为Init的BFD报文;
3)、SwitchB本地BFD状态为Init后,不再处理接收到的状态为Down的报文;
4)、SwitchA的BFD状态变化同SwitchB;
5)、SwitchB收到状态为Init的BFD报文后,本地状态切换至Up;
6)、SwitchA的BFD状态变化同SwitchB。


BFD特殊应用场景:
1、BFD for Perlink:(ETH-TRUNK透传二层VLAN场景)
背景:两台设备通过Eth-Trunk链路直连,Eth-Trunk加入VLAN,如果使用BFD for IP单跳会话绑定VLANIF口检测链路故障,BFD会选择Eth-Trunk的一条成员链路作为检测路径,如果这条成员链路故障,而别的成员链路正常,BFD会话会检测Down,所以BFD for IP单跳会话检测Eth-Trunk链路可能会出现BFD误报的情况。
原理:BFD for Perlink会话绑定VLANIF口后,BFD会创建一条管理会话,同时还会基于Eth-Trunk的每个成员口创建一条单播动态BFD子会话。管理会话不进行协商和检测,只负责处理子会话上报的状态,并上报上层应用。BFD子会话独立地进行协商和检测,并将检测状态上报到管理会话。只有当所有子会话的状态是Down的时候,管理会话的状态才会Down。 (注:目前设备支持以单臂回声模式实现BFD子会话的链路检测; 单臂回声报文:以本端的VLANIF口的IP地址为目的地址,以对端vlanif所在设备的MAC为目的MAC地址,会话的本地标识符和远端标识符均动态创建。)

2、BFD for Link-bundle:(ETH-TRUNK为三层口场景)
背景及原理与BFD for Perlink一样;
BFD for Link-bundle会话由一个主会话以及多个子会话组成,•主会话负责为Eth-Trunk下每一个成员接口创建一个BFD子会话,以及汇总子会话的检测结果并对Eth-Trunk链路的状态做出最终判断;只要有一个子会话的状态为Up,主会话状态就为Up,如果BFD for Link-bundle没有子会话,则主会话状态为Down,通告给上层应用的状态为Unknown。

注:
1、V200R002C50及之后版本,配置BFD与传输设备对接时,建议配置port-status fast-detect enable命令使能芯片快速感知接口物理状态变化功能,同时BFD检测间隔建议配置为500ms4、1000ms3或者更大值。
2、缺省情况下,BFD使用组播IP地址224.0.0.184。


BFD联动功能:
1、 配置BFD与接口状态联动:(该功能针对绑定出接口且使用缺省组播地址进行检测的单跳BFD会话)
背景:当直连链路中间存在传输设备时,与接口本身的链路协议故障检测机制相比,BFD能够更快地检测到链路故障。 为了将BFD检测结果更快地通告到应用程序,在设备接口管理模块中,为每个接口增加了一个属性,即BFD状态,指的是与该接口绑定的BFD会话的状态,系统根据接口的链路状态、协议状态和BFD状态决定接口的状态,并将结果通告给应用程序。

1)、system-view,进入系统视图;
2)、bfd,使能全局BFD功能并进入BFD视图(默认未使能);
3)、(可选)default-ip-address ip-address,配置BFD缺省组播IP地址(缺省为224.0.0.184);
4)、quit,返回系统视图
5)、bfd** session-name bind peer-ip default-ip interface interface-type interface-number [ source-ip ip-address ],建立BFD会话‘
6)、
discriminator local discr-value,配置BFD会话的本地标识符;
7)、
discriminator remote discr-value,配置BFD会话的远端标识符;
8)、
process-interface-status,配置当前BFD会话与其绑定接口状态联动(缺省情况下,BFD会话不与绑定的接口状态联动,即BFD会话状态的变化不修改接口状态);
9)、
commit,提交配置。
注:当配置文件中存在
process-interface-status命令时,在整机重启后,考虑到接口的初始状态一定是Down,所以配置了process-interface-status**命令的BFD会上报一个Down状态给接口。

2、 配置BFD与接口联动(触发与BFD联动的接口物理状态变为Down):
1)、system-view,进入系统视图;
2)、oam-mgr,进入OAM管理视图;
3)、oam-bind ingress bfd-session session-name session-name trigger if-down egress interface interface-type interface-number,配置BFD会话向接口单向传递故障消息功能(当BFD会话检测到故障后,与BFD会话绑定的接口物理状态变为Down);
4)、commit,提交配置。


调整BFD参数:
1、 调整bfd检测时间:
1)、bfd session-name,进入BFD会话视图;
2)、min-tx-interval interval,配置BFD报文的发送间隔;(默认1000ms)
3)、min-rx-interval interval,配置BFD报文的接收间隔;(默认1000ms)
4)、detect-multiplier multiplier,配置本地检测倍数;(默认为3)
注:配置BFD与传输设备对接时,建议配置port-status fast-detect enable命令使能芯片快速感知接口物理状态变化功能。

2、 bfd等待恢复时间:
1)、bfd session-name,进入BFD会话视图;
2)、wtr wtr-value,配置BFD会话的等待恢复时间;(即BFD会话从状态Down变为状态Up时,BFD等待WTR超时后才将这个变化通知给上层应用;默认wtr为0)
3)、commit,提交配置。

3、 bfd会话延迟up时间:
1)、bfd,对本节点使能全局BFD功能并进入BFD视图;
2)、delay-up time,使能延迟BFD会话Up的功能;(默认为0)
3)、commit,提交配置。
注:该时间是为了弥补路由协议Up晚于接口Up的时间差,避免流量回切时查不到路由。

4、 bfd会话震荡抑制:
1)、bfd,进入BFD会话视图;
2)、dampening timer-interval maximum maximum-milliseconds initial** initial-milliseconds secondary secondary-milliseconds,配置BFD会话的震荡抑制时间(缺省已开启,时间:第一次6000ms、第二次10000ms,最大缺省值为20000ms);
3)、(可选,针对BFD for Link-bundle会话)
dampening timer-interval bundle-member maximum bundle-maximum-milliseconds initial bundle-initial-milliseconds secondary bundle-secondary-milliseconds ,配置BFD for Link-bundle的震荡抑制时间(缺省开启,时间:第一次16000ms、第二次20000ms,最大缺省值为60000ms**)