在网络通讯中,为了能够更快更好的选择出转发路径,对相邻系统间快速侦测通讯失效的需求日益增多,而且也显得越来越重要。在没有硬件信号发送的情况下,以前的路由器采用发送hello报文的侦测机制。于是就产生了一种在双向路由引擎之间建立一条路径的检测方法--BFD。
BFD:(Bidirectional Forwarding Detection,双向转发检测)协议提供一种轻负载、快速检测两台邻接路由器/交换机之间转发路径连通状态的方法,它是一个简单的“Hello”协议,在很多方面,它与那些著名的路由协议的邻居检测部分相似。之所以被称为双向,是因为BFD协议通过三次握手机制,能提供链路来回两个方向的连通性检测。
一对系统在它们之间的所建立会话的通道上周期性的发送检测报文,如果某个系统在足够长的时间内没有收到对端的检测报文,则认为在这条到相邻系统的双向通道的某个部分发生了故障协议邻居通过该方式可以快速检测到转发路径的连通故障,加快启用备份转发路径,提升现有网络性能。BFD可用于检测任何形式的路径,包括直接相连的物理链路、虚电路、隧道、MPLS LSP乃至多跳的路由通道。甚至对于单向链路(如MPLS TE隧道),只要有回来的路径,都可以检测。
BFD 提供的检测机制与所应用的接口介质类型、封装格式、以及关联的上层协议如 OSPF、BGP、RIP 等无关。BFD 在两台路由器之间建立会话,通过快速发送检测故障消息给正在运行的路由协议,以触发路由协议重新计算路由表,大大减少整个网络的收敛时间。BFD 本身没有发现邻居的能力,需要上层协议通知与哪个邻居建立会话。
BFD报文格式
BFD发送的检测报文时UDP报文,定义两种类型的报文。
建立BFD会话时缺省采用版本1,如果收到对系统发送的是版本0的报文,将自动切换到版本0.可以他通过show bfd neighbor命令查看采用的版本。
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标志会话建立成功
BFD基础配置(静态路由备份)
实验拓扑比较容易理解,如下所示来接:一主一备两条广域网链路,连接两台PC
1)基础实验配置
R1的基础配置
R2的基础配置
2)测试现况(未使能BFD)移除HUB2和HUB3之间的链路,发现在PC间的通信中断,因为静态路由不能进行收敛
3)配置BFD功能实现静态路由的备份功能
R1配置如下
R2配置如下
检查的命令如下
4)配置路由调用BFD
R1的配置
[AR1]ip route-static 192.168.20.0 24 102.1.1.2 track bfd-session manual001
R2的配置
[AR2]ip route-static 192.168.10.0 24 102.1.1.1 track bfd-session manual001
5)测试网络备份能力在PC上发起PING包并且同时中断HUB2和HUB3之间的连线,观察PING的情况如下(只有一个丢包)
观察静态路由表发现主链路因BFD失效变成了inactive
今天的内容就讲解到这,感谢大家对编程学习网教育的大力支持。