BFD,Bidirectional Forwarding Detection,双向转发检测,是一种快速故障检测机制,主要用于加快检测发现网络中的故障,从而可以尽快解决故障,恢复网络的正常业务转发。
那么,第一个问题?为什么需要BFD,网络中就没有其它协议可以检测故障的吗?
答案是否定的,某些协议是可以通过Keepalive机制来检测网络中的连接是否还正常的,比如OSPF,它就可以通过周期性的发送Hello报文来发现链路中的故障从而自动切换链路,但提到这里,就不得不提OSPF发现故障的检测时间,首先OSPF的周期性发送是每隔10S发送一次Hello报文,然后要等到4倍HelloTime,也就是40S移动大流量卡,一直没有收到邻居路由器发送的Hello报文后,才会认为网络中发生了故障,再开始切换报文转发路径。所以,在这40S的时间里,本路由器发送的报文永远是无法到达邻居路由器,也就无法通信。而这个40S的时间太长了,所以我们需要一个机制来更快的发现故障,这个机制就是BFD,所以,BFD的主要作用不是检测故障,而是加快检测。
BFD检测的大概过程就是在两个系统之间建立BFD会话通道,然后周期性发送BFD检测报文,当某方系统在规定时间内没有收到对方的检测报文,就认为链路故障了。和OSPF的Hello检测机制比较类似,实质上,BFD就是一个简单的Hello协议,不过它检测故障的用时更短而已。
那么接下来,我们就移动大流量卡认识一下BFD究竟是怎么工作的?
不过在这之前,我们有一点不得不提及了,因为BFD是一个与协议无关的检测机制,所以它是不能独立运行的,一般是作为辅助与其它路由协议联动使用,比如静态路由、OSPF、ISIS、BGP等,本章中主要讲述静态路由和OSPF。
前面提过BFD是需要建立BFD会话通道的,那么BFD建立会话主要有两种方式:
一是静态建立BFD会话,静态建立就是由管理员手工配置本地标识符和远端标识符来建立BFD会话,适用于没有Hello机制的协议当中,比如静态路由。
本地标识符和远端标识符就是系统间用来建立和区分不同的BFD会话的。本地标识符是标识本地路由器上某个会话的,而远端标识符是标识远端路由器移动大流量卡的某个会话的,路由器之间只有在发现本地标识符和远端标识符匹配无误之后,才可以建立起BFD会话。
接下来我们通过以下拓扑看看BFD怎么静态建立BFD会话:
这里是BFD与静态路由联动,PC1—AR1—HUB1—AR2—PC2这条路径上运行静态路由来实现PC1与PC2之间的通信。
因为静态路由自身是无法检测链路故障的,所以需要BFD辅助。
首先,分别在AR1和AR2上配置静态路由:
[AR1]ip route-static 192.168.3.0 24 192.168.2.2
[AR2]ip route-static 192.168.1.0 24 192.168.2.1
接着先全局开启BFD,再静态建立BFD会移动大流量卡话:
[AR1]bfd
[AR1-bfd]q
[AR1]bfd StaticBFD bind peer-ip 192.168.2.2 source-ip 192.168.2.1
创建名为StaticBFD的会话,对端和本路由器建立会话的接口地址为192.168.2.2,本地路由器用于和对端建立会话的接口地址为192.168.2.1
[AR1-bfd-session-staticbfd]discriminator local 10
本地标识符,标识为10
[AR1-bfd-session-staticbfd]discriminator remote 20
远端标识符,标识为20
[AR1-bfd-session-移动大流量卡staticbfd]commit 提交
这里只是建立了会话,但还没有和静态路由联动,所以还需要把该会话和静态路由进行绑定:
[AR1]ip route-static 192.168.3.0 24 192.168.2.2 track bfd-session StaticBFD
至此,AR1上静态路由和BFD的联动配置完成,
配置完成后,抓AR1的G0/0/1接口报文:
可可以发现,AR1开始不断发送BFD检测报文,但因为此时AR2还没有运行BFD,所以会话通道还没有建立,链路中只存在AR1报文,并且该报文会提示警报消息。
那么接下来完成AR2的配置:
再次抓AR1的G0/0/1接口报文:
这时候,AR1和AR2移动大流量卡都会发送BFD检测报文来检测链路是否故障,当把HUB1和AR2之间的线路连接删除:
再抓包:
可以看到BFD快速发现会话被关闭,同时在AR1和AR2上也出现了警告消息:
至此,AR1就快速检测出了链路故障,这就是BFD与静态路由的联动。
二是动态建立BFD会话,动态分配本地和远端标识符,适用IGP协议,也就是内部网关路由协议。主要是BFD作为动态路由协议的辅助协议来帮助动态路由快速发现故障。
BFD与动态路由协议的联动配置较为简单,因为本地和远端标识符都不再需要管理员手动配置。
这里以同一拓扑演示OSPF与BFD的联动:
拓扑中,AR1、AR2和AR3上不再运行静态路由协议,而是运行OSPF路由协议来自动发移动大流量卡现和学习路由,同时修改AR1到AR3的OSPF路径开销为10,让PC1去往PC2优选经过HUB1的路径。
配置OSPF后,查看AR1路由表:
此时,AR1路径优选下一跳为AR2的路径,即经过HUB1。
现在开始配置BFD:
AR1:
同样先全局开启BFD:
[AR1]bfd
[AR1-bfd]q
然后再进入到OSPF中,使能接口的BFD功能:
[AR1]ospf
[AR1-ospf-1]bfd all-interfaces enable
至此,AR1配置完成,再抓AR1的G0/0/1报文:
AR1接口开始发送BFD控制报文,因为AR2还未配置,所以会话未建立。
现在完成AR2的配置后,再看AR1的抓包:
可以看到,AR1移动大流量卡和AR2都往链路中发送BFD控制报文,并且发送的时间间隔远远小于Hello报文的时间间隔,从而可以更快的发现链路故障。
当把HUB1和AR2之间的线路连接删除:
再抓包:
AR1就已经快速检测到会话被更关闭了。
再看AR1:
先是BFD检测到会话被关闭,接着告知OSPF邻居关闭,再继而切换邻居状态为down。
所以BFD辅助了OSPF发现邻居状态的改变。
再看路由表:
AR1前往192.168.3.0网段的路由下一跳也被快速切换为优选经过AR3的路由。
这就是BFD与OSPF的联动。
以上就是BFD创建会话的两种方式。
接下来是BFD的状态机:
BFD具有四种状态:
Down:BFD的初始状态,如果路由器在这个状态中收移动大流量卡到了状态为down的BFD报文,就会进入到init状态
Init:BFD的初始化状态,如果路由器在这个状态中收到了状态为Init的BFD报文,那么就进入到UP状态;同时发送状态为Init的BFD报文;
UP:BFD的建立状态,标志BFD会话已经建立完毕,如果定时器超时(在一定时间内没有收到对方回应的BFD报文)后,那么就会进入到down状态或者admin down状态。
Admin down:由管理员手工配置的down状态,如果会话是被管理员down掉的话,就处于该状态中。
BFD同时还具有两种检测模式,用于检测判断链路是否发生故障:
异步模式:系统之间相互周期性地发送BFD控制报文,如果某个系统在检测移动大流量卡时间内没有收到对端发来的BFD控制报文,就宣布会话为Down。
查询模式:在需要验证连接性的情况下,系统连续发送多个BFD控制包,如果在检测时间内没有收到返回的报文就宣布会话为Down。(更多的是应用在两台设备之间,然后其中一台设备可以运行BFD,另一台设备无法运行BFD的场景中)
以上是BFD的检测判断,那么接下来是BFD的检测时间。
BFD的检测时间具有固定的公式,不过我们首先要理解三个参数的含义——TX,RX和DM:
BFD会话检测时长由TX(Desired Min TX Interval),RX(Required Min RX Interval),DM(Detect Multi)三个参数决定:移动大流量卡
TX:最小发送报文的时间间隔;
RX:最小接收报文的时间间隔;
DM:检测超时倍数,用于检测方计算检测超时时间。默认情况下,该值为3;
BFD报文的实际发送时间间隔,实际接受时间间隔由BFD会话协商决定。
本地BFD报文实际发送时间间隔=MAX { 本地配置的发送时间间隔,对端配置的接收时间间隔 }
本地BFD报文实际接收时间间隔=MAX { 对端配置的发送时间间隔,本地配置的接收时间间隔 }
MAX{a,b},就代表取a,b中的最大值。
所以,本地BFD报文实际检测时间:
异步模式:本地BFD报文实际检测时间=本地BFD报文实际接收时间间隔×对端配置的BFD检测倍数;
查询模式:本地BFD报文实际检测时间 =移动大流量卡 本地BFD报文实际接收时间间隔×本端配置的BFD检测倍数。
以上就是BFD的主要功能,但除此之外,BFD还有一个特殊的单臂回声功能,也叫做BFD ECHO,这是由本地发送BFD Echo报文,远端系统将报文环回的一种检测机制。该功能主要适用于对端的路由器不支持BFD协议的场景当中。
该功能中,运行了BFD协议的路由器发送源IP和目的IP都是自己的BFD报文,该BFD控制报文在链路正常的情况下是可以被“弹”回来的,也就是路由器可以收到“弹”回来的自己发送的BFD控制报文,但如果链路异常,发生了故障,网络不通了,那么该报文就无法“弹”回来,BFD路由器在一定时间内都没有收到该BFD控制报文,就认为对移动大流量卡端失效,链路故障了。
接下来,就是该BFD ECHO的配置:
采用同一张拓扑:
但该拓扑中,只有AR1运行BFD,AR2不运行BFD。
那么在AR1上:
先确保邻居之间是路由可达,也就是AR1和AR2之间是可以正常通信,这里因为AR1和AR2之间的链路正常,所以这一步没问题。
接着全局开启BFD
[AR1]bfd
[AR1-bfd]q
然后就是配置单臂回声
[AR1]bfd EchoBFD bind peer-ip 192.168.2.2 interface g0/0/1 one-arm-echo
interface g0/0/1:本地路由器的出接口
[AR1-bfd-session-echobfd]discrimi移动大流量卡nator local 10 本地标识符,因为邻居不运行BFD,所以不需要配置远端标识符
[AR1-bfd-session-echobfd]commit
至此,配置完成。
现在再抓AR1的G0/0/1接口报文:
可以看到,AR1不断发送源和目的IP都是自己的BFD控制报文,并且会话状态为UP状态。
当把HUB1和AR2之间的线路连接删除:
再抓包:
可以看到,BFD比OSPF更快检测到故障。
并且也快速提示BFD会话被关闭。
以上,就是本章BFD的所有内容。
友情提醒: 请添加客服微信进行免费领取流量卡!
QQ交流群:226333560 站长微信:qgzmt2
原创文章,作者:sunyaqun,如若转载,请注明出处:https://www.dallk.cn/46541.html