简介
为了减小设备故障对业务的影响、提高网络的可用性,设备需要能够尽快检测到与相邻设备间的通信故障,以便能够及时采取措施,从而保证业务继续进行。 现有的故障检测方法主要包括以下几种: 1、硬件检测:例如通过SDH(Synchronous Digital Hierarchy,同步数字体系)告警检测链路故障。硬件检测的优点是可以很快发现故障,但并不是所有介质都能提供硬件检测。 2、慢Hello机制:通常采用路由协议中的Hello报文机制。这种机制检测到故障所需时间为秒级。对于高速数据传输,例如吉比特速率级,超过1秒的检测时间将导致大量数据丢失;对于时延敏感的业务,例如语音业务,超过1秒的延迟也是不能接受的。并且,这种机制依赖于路由协议。 BFD(Bidirectional Forwarding Detection,双向转发检测)就是为了解决上述检测机制的不足而产生的,它是一套全网统一的检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状况,保证邻居之间能够快速检测到通信故障,从而快速建立起备用通道恢复通信。 VPP中的BFD当前支持基于RFC 5880和RFC 5881的单跳UDP传输。
目前我们大部分都使用在多跳的场景中,但是也能正常的工作,没有发现有什么问题。我们主要是加大了bfd的检测时间在200ms*3.
VPP基本配置
BFD会话仅使用API创建。实现了使用vppctl的CLI,这些CLI调用API来配置BFD功能: 1、创建、修改、删除bfd会话
代码语言:javascript复制#创建bfd会话参数
bfd udp session add interface <interface> local-addr <address> peer-addr <address> desired-min-tx <interval> required-min-rx <interval> detect-mult <multiplier> [ conf-key-id <ID> bfd-key-id <ID> ]
#修改bfd会话的参数
bfd udp session mod interface <interface> local-addr <address> peer-addr <address> desired-min-tx <interval> required-min-rx <interval> detect-mult <multiplier>
#删除buf会话
bfd udp session del interface <interface> local-addr <address> peer-addr<address>
基本参数说明: nterface-此会话绑定到的接口 local-addr-本地地址(ipv4或ipv6) peer-addr-对等地址(ipv4或ipv6,必须与local-addr系列匹配) required-min-tx-所需的最小tx间隔(微秒) required-min-rx-所需的最小rx间隔(微秒) detect-mult-检测乘数(必须为非零) conf-key-id-本地配置密钥ID bfd-key-id-BFD密钥ID,在BFD控制帧中携带。 1、如果未指定conf-key-id和bfd-key-id,则会话未通过身份验证 2、required-min-tx控制控制帧和回显数据包的期望传输速率 3、使用interface、local-addr、peer-addr来组成key,代表一条bfd会话。
2、配置、删除bfd身份认证key
代码语言:javascript复制#配置或者修改认证key
bfd key set conf-key-id <id> type <keyed-sha1|meticulous-keyed-sha1> secret <secret>
#删除认证key
bfd key del conf-key-id <id>
参数说明: conf-key-id-本地配置密钥ID,用于唯一标识此密钥 type-键的类型 secret-共享机密(十六进制数据) 1、conf-key-id 被会话绑定后,不能删除或者修改。
3、BFD会话激活或者停用身份认证
代码语言:javascript复制#激活身份认证
bfd udp session auth activate interface <interface> local-addr <address> peer-addr <address> conf-key-id <ID> bfd-key-id <ID> [ delayed <yes|no> ]
#停用身份认证
bfd udp session auth deactivate interface <interface> local-addr <address> peer-addr <address> [ delayed <yes|no> ]
参数说明: interface-此会话绑定到的接口 local-addr-本地地址(ipv4或ipv6) peer-addr-对等地址(ipv4或ipv6,必须与local-addr系列匹配) conf-key-id-本地配置密钥ID bfd-key-id-BFD密钥ID,在BFD控制帧中携带 delayed,那么此操作将延迟到对等方执行相同的操作
为了安全起见,应该对BFD会话进行身份验证。VPP支持SHA1和精细的SHA1身份验证。首先,在VPP中配置身份验证密钥,然后,会话可以使用它们。 BFD会话范围内有两个关键ID: 1、conf-key-id是VPP内部的内部唯一密钥ID,从不与任何对等方通信,它仅用于标识密钥。 2、bfd-key-id是BFD控制帧中携带的密钥ID,用于验证认证。
开启/关闭身份验证
身份验证可以随时打开或关闭。但是,必须注意将身份验证操作与对等方的操作同步,以避免会话中断。
延迟选项:
延迟选项对于与对等方同步身份验证更改很有用。如果已指定,则不会立即执行身份验证更改。在这种情况下,VPP继续使用旧的身份验证方法(未经身份验证或使用旧的sha1密钥)传输数据包。如果收到的数据包没有通过当前的身份验证,则VPP尝试使用新方法对它进行身份验证(如果停用身份验证,则可能为无),如果通过,则使用新的身份验证方法。 建议的启用/更改/禁用会话身份验证的过程是: 1、在vpp端执行身份验证更改,将延迟选项设置为yes 2、在对等方执行身份更改(无延迟选项)
1、如果两个对等方同时使用延迟选项,则将永远不会进行更改,因为所有对等方都不会看到任何具有新身份验证的数据包,而这些数据包才能触发更改. 2、远程对等方不需要支持,甚至不知道此机制也可正常工作。
4、接口设置、取消单臂回声功能
代码语言:javascript复制bfd udp echo-source set interface <interface>
bfd udp echo-source del
BFD会话工作方式:
1、控制报文方式:链路两端会话通过控制报文交互监测链路状态。 2、Echo报文方式:链路某一端通过发送Echo报文由另一端转发回来,实现对链路的双向监测。 单臂回声功能是指通过BFD报文的环回操作检测转发链路的连通性。 在两台直接相连的设备中,其中一台设备支持BFD功能,另一台设备不支持BFD功能,只支持基本的网络层转发。为了能够快速的检测这两台设备之间的故障,可以在支持BFD功能的设备上创建单臂回声功能的BFD会话。支持BFD功能的设备主动发起回声请求功能,不支持BFD功能的设备接收到该报文后直接将其环回,从而实现转发链路的连通性检测功能。
需要注意:1、单臂回声功能只能支持单跳BFD会话中。 2、单臂回声功能,设置required-min-tx时间是1s,或者更高。
回声源地址
由于回声数据包仅由对等方环回(而不以任何方式进行处理),因此有必要设置源地址,以避免由于VPP的欺骗保护而导致数据包丢失。根据RFC,源地址不应位于发送回显数据包的接口上的子网中。同样,它不能是任何VPP本地地址,否则VPP在接收到数据包后就将其丢弃。解决方案是创建一个环回接口,并使用一个(专用)IPv4 / IPv6子网分配为回显源。然后,BFD通过翻转最后一位从子网中选择一个未使用的地址,并将其用作回显数据包中的源地址,从而满足RFC建议,同时避免了欺骗保护。 示例:如果10.10.10.3/31是子网,则10.10.10.2将用作(IPv4)回显数据包中的源地址
5、BFD 会话查询、conf-key 及单臂回声配置查询
代码语言:javascript复制show bfd [keys|sessions|echo-source]
bfd会话中只显示配置的信息和状态,有一些协商后的实际发送时间未显示。
6、bfd会话配置admindown状态
代码语言:javascript复制bfd udp session set-flags interface <interface> local-addr <address> peer-addr <address> admin <up|down>
参数说明: interface-此会话绑定到的接口 local-addr-本地地址(ipv4或ipv6) peer-addr-对等地址(ipv4或ipv6,必须与local-addr系列匹配) admin -根据所需操作向上/向下
通过配置BFD会话进入AdminDown状态,可以暂停BFD会话检测链路,但并不删除BFD会话。
如果用户要修改BFD会话的配置信息,或者要终止BFD会话检测链路,同时不影响上层应用,则可以配置BFD会话进入AdminDown状态,暂停BFD会话检测功能,待配置修改完毕,或者用户需要重启BFD检测功能时,再配置BFD会话重新开始检测。
BFD 状态机
vpp 实现bfd状态机是利用process node节点和timewheel来完成,关于时间轮的介绍可以参考以前的文章:
代码语言:javascript复制 --
| | UP, ADMIN DOWN, TIMER
| V
DOWN ------ INIT
------------| |------------
| | DOWN | |
| -------->| |<-------- |
| | ------ | |
| | | |
| | ADMIN DOWN,| |
| |ADMIN DOWN, DOWN,| |
| |TIMER TIMER| |
V | | V
------ ------
----| | | |----
DOWN| | INIT |--------------------->| UP | |INIT, UP
--->| | INIT, UP | |<---
------ ------
BFD会话建立前BFD控制报文以1秒的时间间隔周期发送以减小报文流量。在会话建立后则以协商的时间间隔发送BFD控制报文以实现快速检测。在BFD会话建立的同时,BFD控制报文发送时间间隔以及检测时间也会通过报文交互协商确定。在BFD会话有效期间,这些定时器可以随时协商修改而不影响会话状态。BFD会话不同方向的定时器协商是分别独立进行的,双向定时器时间可以不同。
BFD协议字段说明:
代码语言:javascript复制 0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|Vers | Diag |Sta|P|F|C|A|D|M| Detect Mult | Length |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| My Discriminator |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Your Discriminator |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Desired Min TX Interval |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Required Min RX Interval |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Required Min Echo RX Interval |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
An optional Authentication Section MAY be present:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| Auth Type | Auth Len | Authentication Data... |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
l Vers:协议的版本号,协议版本为1。 l Diag:本地会话最后一次从up状态转换到其他状态的原因。 l State(Sta):BFD会话当前状态,取值为:0代表AdminDown,1代表Down,2代表Init,3代表Up。 l Poll(P):设置为1,表示发送方请求进行连接确认,或者发送请求参数改变的确认;设置为0,表示发送方不请求确认。 l Final(F):设置为1,表示发送方响应一个接收到P比特为1的BFD控制报文;设置为0,表示发送方不响应一个接收到P比特为1的BFD控制报文。 l Control Plane Independent(C):设置为1,表示发送方的BFD实现不依赖于它的控制平面(即,BFD报文在转发平面传输,即使控制平面失效,BFD仍然能够起作用);设置为0,表示BFD报文在控制平面传输。 l Authentication Present(A):如果设置为1,则表示控制报文包含认证字段,并且会话是被认证的。 l Demand(D):设置为1,表示发送方希望操作在查询模式;设置为0,表示发送方不区分是否操作在查询模式,或者表示发送方不能操作在查询模式。 l Reserved(R):在发送时设置为0,在接收时忽略。 l Detect Mult:检测时间倍数。即接收方允许发送方发送报文的最大连续丢包数,用来检测链路是否正常。 l Length:BFD控制报文的长度,单位字节。 l My Discriminator:发送方产生的一个唯一的、非0鉴别值,用来区分两个协议之间的多个BFD会话。 l Your Discriminator:接收方收到的鉴别值“My Discriminator”,如果没有收到这个值就返回0。 l Desired Min Tx Interval:发送方发送BFD控制报文时想要采用的最小间隔,单位毫秒。 l Required Min Rx Interval:发送方能够支持的接收两个BFD控制报文之间的间隔,单位毫秒。 l Required Min Echo Rx Interval:发送方能够支持的接收两个BFD回声报文之间的间隔,单位毫秒。如果这个值设置为0,则发送不支持接收BFD回声报文。 l Auth Type:BFD控制报文使用的认证类型。 l Auth Len:认证字段的长度,包括认证类型与认证长度字段。
参考资料
1、VPP官方bfd文档介绍:https://docs.fd.io/vpp/21.06/de/d7a/bfd_doc.html 2、华为bfd配置手册:
https://support.huawei.com/enterprise/zh/doc/EDOC1100038905?section=j006
3、BFD Rfc 5880文档:https://tools.ietf.org/html/rfc5880 4、BFD协议的介绍:https://blog.csdn.net/fuyuande/article/details/81253672