BFD基本原理
BFD基本原理
BFD(双向转发检测)用于检测转发引擎之间的通信故障。具体来说,BFD对系统间的、同一路径上的一种数据协议的连通性进行检测,这条路径可以是物理链路或逻辑链路,包括隧道。可以把BFD看作是系统提供的一种服务:
- 上层应用向BFD提供检测地址、检测时间等参数。
- BFD根据这些信息创建、删除或修改BFD会话,并把会话状态通告给上层应用。
下面从BFD检测机制、检测的链路类型、会话建立方式以及会话管理来介绍BFD的基本原理。
BFD检测机制
BFD的检测机制是在两个系统之间建立BFD会话,并沿它们之间的路径周期性发送BFD控制报文,如果一方在既定的时间内没有收到BFD控制报文,则认为路径上发生了故障。
BFD控制报文(包括BFD协商报文和BFD检测报文)封装在UDP报文中传送。会话开始阶段,双方系统通过控制报文中携带的参数(会话标识符、期望的收发报文最小时间间隔、本端BFD会话状态等)进行协商。协商成功后,双方以协商的报文收发时间在彼此之间的路径上定时发送BFD控制报文。
当BFD叠加到不同业务上时,BFD协商报文发送路径跟随业务指定的路径进行转发,BFD检测报文发送路径跟随业务的转发路径进行转发。
BFD提供的主要检测模式为异步模式。在这种模式下,系统之间相互周期性地发送BFD控制报文,如果某个系统连续几个报文都没有接收到,就认为此BFD会话的状态是Down。
这种模式的一个辅助功能是Echo功能。当Echo功能激活时,一个BFD控制报文按照如下方式发送:本地发送一个BFD控制报文,远端系统通过它的转发通道将它们环回回来。如果连续几个Echo报文都没有接收到,会话状态就被宣布为Down。
BFD检测的链路类型
表1 BFD检测的链路类型
BFD检测链路类型 | 具体链路类型 | 说明 |
---|---|---|
IP链路 | 三层物理接口以太子接口(包括Eth-Trunk子接口) | 对于一个物理以太网接口有多个子接口的情况,BFD会话可以独立建立在各个子接口上和此物理以太网接口上。 |
Eth-Trunk | 二层Eth-Trunk链路二层Eth-Trunk成员链路三层Eth-Trunk链路三层Eth-Trunk成员链路 | 检测Trunk成员口与检测Trunk口的BFD会话互相独立,可同时检测。 |
VLANIF | VLAN以太成员链路VLANIF接口 | 检测VLANIF与检测VLAN成员口的BFD会话相互独立,可同时检测。 |
MPLS LSP | 静态配置方式下,BFD能够检测的LSP类型有:LDP LSPTE:Tunnel隧道、与Tunnel绑定的静态CR-LSP和RSVP CR-LSP。动态配置方式下,BFD检测的LSP类型有:LDP LSPTE:与Tunnel绑定的RSVP CR-LSP。 | 检测MPLS LSP的连通性时,BFD会话协商有两种方式:静态配置BFD:通过手工配置BFD的本地标识符和远端标识符,由BFD本身的协商机制建立会话。动态创建BFD会话:通过在LSP Ping报文中携带BFD Discriminator TLV进行会话协商。BFD能够检测信令协议为CR-Static和RSVP-TE的TE隧道,并且能够检测与TE隧道绑定的主用LSP。 |
Segment Routing | BFD for SR-MPLS BE隧道BFD for SR-MPLS TE LSPBFD for SR-MPLS TE隧道SBFD for SR-MPLS TE PolicySBFD for SRv6 TE Policy | BFD检测Locator路由可以应用于SRv6 BE。 |
PW | 单段PW多段PW | BFD检测PW支持静态方式(手工配置标识符)和动态方式。 |
BFD会话建立方式
BFD会话的建立有两种方式,即静态建立BFD会话和动态建立BFD会话。BFD通过控制报文中的My Discriminator和Your Discriminator区分不同的会话。静态和动态创建BFD会话的主要区别在于My Discriminator和Your Discriminator的配置方式不同。
表2 BFD会话建立方式
BFD会话建立方式 | 描述 |
---|---|
静态配置BFD会话 | 静态配置BFD会话是指通过命令行手工配置BFD会话参数,包括了配置本地标识符和远端标识符等,然后手工下发BFD会话建立请求。说明:在配置静态BFD会话时,需要在网络中精确规划BFD的描述符,避免出现配置错误的BFD会话对正常BFD会话发生攻击,从而导致会话震荡。 |
动态建立BFD会话 | 动态BFD会话是指由路由协议动态触发BFD会话建立。动态BFD中,本地标识符是动态分配的,远端标识符从对端的BFD报文中获取。路由协议在建立了新的邻居关系时,将对应的参数及检测参数(包括目的地址、源地址等)通告给BFD,BFD根据收到的参数建立起会话。当发生链路故障时,联动了BFD的路由协议可以快速感知到BFD会话状态变为Down,从而实现将流量快速切换到备份路径,避免了数据大量丢失。动态BFD具有较高的灵活性,适用于全网都对可靠性要求较高的网络。动态建立BFD会话时,系统对本地标识符和远端标识符的处理方式如下:动态分配本地标识符:当应用程序触发动态创建BFD会话时,系统分配属于动态会话标识符区域的值作为BFD会话的本地标识符。然后向对端发送Your Discriminator的值为0的BFD控制报文,进行会话协商。自学习远端标识符:当BFD会话的一端收到Your Discriminator的值为0的BFD控制报文时,通过比较收到报文中My Discriminator的值与本端Your Discriminator的值判断该报文是否与本地BFD会话匹配,如果匹配,则学习接收到的BFD报文中My Discriminator的值,获取远端标识符。 |
BFD会话管理
BFD会话有四种状态:Down、Init、Up和AdminDown。
- Down:会话处于Down状态或刚刚创建。
- Init:已经能够与对端系统通信,本端希望使会话进入Up状态。
- Up:会话已经建立成功。
- AdminDown:会话处于管理性Down状态。
会话状态变化通过BFD报文的State字段传递,系统根据自己本地的会话状态和接收到的对端BFD报文驱动状态改变。BFD状态机的建立和拆除都采用三次握手机制,以确保两端系统都能知道状态的变化。以BFD会话建立为例,简单介绍状态机的迁移过程。
图1 BFD会话连接建立
- DeviceA和DeviceB各自启动BFD状态机,初始状态为Down,发送状态为Down的BFD报文。对于静态配置BFD会话,报文中的Your Discriminator的值是用户指定的;对于动态创建BFD会话,Your Discriminator的值是0。
- DeviceB收到状态为Down的BFD报文且已学习到Your Discriminator的值时,状态会切换至Init,并发送状态为Init的BFD报文。DeviceB本地BFD状态为Init后,不再处理接收到的状态为Down的报文。
- DeviceA的BFD状态变化同DeviceB,DeviceA收到状态为Down的BFD报文且已学习到Your Discriminator的值时,会向DeviceB发送状态为Init的报文。
- DeviceB收到状态为Init的BFD报文后,本地状态切换至Up。
- DeviceA的BFD状态变化同DeviceB。
BFD协议报文
BFD协议报文的格式如图2所示。
图2 BFD协议报文的格式
字段 | 长度 | 含义 |
---|---|---|
Vers (Version) | 3 bits | BFD协议版本号,目前为1。 |
Diag (Diagnostic) | 5 bits | 诊断字,标明本地BFD系统最近一次会话状态发生变化的原因。0:表示无诊断信息。1:表示检测时间超时。2:表示Echo功能失效。3:表示邻居会话Down。4:表示转发面复位。5:表示路径Down。6:表示级联路径Down。7:表示AdminDown。8:表示反向级联路径Down。9-31:表示预留后续使用。 |
Sta (State) | 2 bits | BFD本地状态:0:表示管理状态Down。1:表示运行状态Down。2:表示初始状态。3:表示正常UP状态。 |
P (Poll) | 1 bit | 参数发生改变时,发送方在BFD报文中置位该标志,接收方必须立即响应该报文。0:表示发送系统不请求确认。1:表示发送系统请求进行连接确认,或者发送请求参数改变的确认。 |
F (Final) | 1 bit | 是否发送响应P标志置位的回应报文由F标志的置位状态决定。0:表示发送系统不响应一个P比特为1的包。1:表示发送系统响应一个接收到P比特为1的BFD包。 |
C (Control Plane Independent) | 1 bit | 转发/控制分离标志,一旦置1,控制平面的业务状态变化不影响BFD检测,如:控制平面为IS-IS,当IS-IS平滑重启(GR)时,BFD可以继续监测链路状态。0:对比本端与对端的C bit位,二者不都为1时,表示BFD报文在控制平面传输。这种情况下,GR期间BFD检测往往会误down,其结果是不可信的,业务不需要进行响应。1:对比本端与对端的C bit位,二者都为1时,表示发送系统的BFD实现不依赖于控制平面,BFD报文在转发平面传输,即使控制平面失效,BFD仍然能够起作用。这种情况下,GR期间BFD检测down是可信的,业务将响应down消息并改变拓扑和路由,避免流量丢失。 |
A (Authentication Present) | 1 bit | 认证标识。0:表示会话不需要进行验证。1:表示会话需要进行验证。 |
D (Demand) | 1 bit | 查询请求,置位代表发送方期望采用查询模式对链路进行监测。0:表示发送系统不希望、或不能工作在查询模式。1:表示发送系统希望工作在查询模式。 |
M (Multipoint) | 1 bit | 为BFD将来支持点对多点扩展而设的预留位。 |
Detect Mult | 8 bits | 检测超时倍数,用于检测方计算检测超时时间。查询模式:采用本地检测倍数。异步模式:采用对端检测倍数。 |
Length | 8 bits | 报文长度,单位为字节。 |
My Discriminator | 32 bits | BFD会话连接本地标识符。发送系统产生的一个唯一的、非0鉴别值,用来区分一个系统的多个BFD会话。 |
Your Discriminator | 32 bits | BFD会话连接远端标识符。0:未知。Non-0:从远端系统接收到的鉴别值,这个域直接返回接收到的“My Discriminator”。 |
Desired Min TX Interval | 32 bits | 本地支持的最小BFD报文发送间隔,单位为毫秒。 |
Required Min RX Interval | 32 bits | 本地支持的最小BFD报文接收间隔,单位为毫秒。 |
Required Min Echo RX Interval | 32 bits | 本地支持的最小Echo报文接收间隔,单位为毫秒(如果本地不支持Echo功能,则设置0)。 |
本文原文来自华为官网