HCIP-ICT实战进阶10-BFD原理与配置
0 引言
之前学习的比如链路聚合、STP、RSTP、MSTP以及一些路由协议, 所有的协议都可以实现一种能力:冗余备份
网络中如果真的发生了设备的故障或者是链路故障, 则以上的各种协议需要检测到故障,然后进行网络的链路切换.
生成树协议发生故障
生成树协议是通过配置BPDU是否能持续接收到, 即当设备/链路/单向通信三者任一出现故障时, 都无法持续收到BPDU.
OSPF发生故障
OSPF最基本的检测故障方式就是靠Hello报文, Hello报文发送周期为10s, 如果40s内没收到邻居的Hello报文, 则认为邻居发送故障, 邻接关系断开.
ISIS发生故障
ISIS是通过IIH报文, IIH报文发送周期为10s, 超时为30s, DIS设备的发送周期为3.333s, 超时为10s.
直连链路发生故障
直连链路发生故障时, 不需要任何报文, 设备会直接感知到接口down, 然后进行网络的链路切换.
注: 以上协议都需要网络中的设备先进行冗余备份,然后再配置协议实现主备冗余
总结
- 就目前学习过的协议而言, 基本都会存在一个报文老化的概念, 如果设备不能通过直连链路直接感知到设备故障, 则通过报文老化时间感知故障, 这需要一定的检测故障时间;
- 如果是直连的链路或直连的设备故障, 几乎不需要等待检测时间, 可以立即感知到故障.
但在网络链路中, 直连链路或设备出现故障的机会是远远小于其他链路或设备的故障的, 因此发生故障时大概率需要等待漫长的秒级检测时间, 这样会导致网络质量严重下降.
注: 秒级并不是一个好的描述,而是指网络的故障检测速度比较慢.
1 BFD原理
1.1 BFD定义
BFD(Bidirectional Forwarding Detection,双向转发检测)是一种基于RFC 5880标准的高速故障检测机制,两个系统建立BFD会话后,在它们之间的通道上周期性地发送BFD报文,如果一方在协商的检测时间内没有接收到BFD报文,则认为这条双向通道上发生了故障。上层协议通过BFD感知到链路故障后可以及时采取措施,进行故障恢复。
说人话就是该技术就是用于快速检测和监控网络中链路或者IP路由的转发连通状况, BFD拥有以下的优点:
- 提供轻负荷、短周期的故障检测,故障检测时间可达到毫秒级,可靠性更高。
- 支持多种故障检测,如接口故障、数据链路故障、转发引擎本身故障等。
- 不依赖硬件,能够对任何介质、任何协议层进行实时检测。
可以总结为: 轻量快速检测、通用标准化、介质协议无关
1.2 BFD报文
BFD本身是一种应用层协议, 基于传输层的UDP协议, 其报文类型分为控制报文和回声报文.
报文类型 | 源端口 | 目的端口 | 备注 |
---|---|---|---|
控制报文 | 任意端口 | 3784(用于单跳BFD检测)、4784(用于多条BFD检测) | 在建立BFD会话和会话之间检测连通性时使用 |
回声报文 | 任意端口 | 3785 | 在使用BFD Echo功能检测链路连通性时使用 |
1.2.1 BFD报文结构
-
Ver: BFD版本号, 目前为1
-
Diag: 诊断字, 用于表示本地BFD最近一次会话状态发生变化的原因:
2: 回声的参数错误
5: 链路故障
-
Sta: State, 表示发送该BFD报文设备的状态:
0: admindown
1: down
2: init
3: up
-
P: 参数发生变化的时候, 报文中携带该字段, 用于告知对方设备BFD参数发生变化, 需要更新并确认
-
F: 响应P置位
-
C: 转控分离(协议需要使用优雅重启,则会用到该部分内容)
-
A:表示认证
-
D: 查询请求。主要是表示希望通过查询模式进行链路检测
1: 表示希望是查询模式
0: 表示不希望是查询模式 -
M: 是BFD为了将来点到多点BFD检测预留的bit位
-
Detect Mult: 表示检测超时倍数, 用于检测方计算检测超时的时间, 默认是3
查询模式:采用对方检测的倍数
异步模式:采用本地检测的倍数 -
length: 报文长度
-
My Dis: BFD为了标识每一条设备每一个会话, 设备会对自己的每一个会话产生不一样的标识符, 该标识符通过非0的数值表示
比如本地的第一个会话标识是100, 第二个会话标识是200, 当前的这个字段,My Dis是表示本地对会话的标识
-
Your Dis: 表示对方的标识符, 通过本地的会话标识符和对方的标识符, 可以明确当前是哪一个会话正在做BFD检测
-
Min TX Interval: 表示本地最小的BFD报文发送间隔
-
Min RX Interval: 表示本地最小BFD报文接收间隔
-
Min Echo RX Interval: 表示本地最小Echo报文接收间隔, 如果本地不支持echo功能, 此字段为0
注: 标识符就是用于百世一台设备的一个会话使用.
1.3 BFD会话
BFD会话建立分为静态建立BFD会话和动态建立BFD会话, 一台设备可以建立多个会话.
两种主要的确保就是本地标识符(Local Discriminator)和远端标识符(Remote Discriminator)的配置方式不同, 举个例子:
A设备和B设备之间在做BFD检测, A设备的本地标识符可以是100, B设备的本地标识符可以是200
-
A设备认为本地是100, B设备是200;
-
B设备认为本地是200, A设备是100
此时B设备需要和C设备进行BFD会话, 这是B设备就不能再使用200标识自己, 比如采用300, 然后C设备标识符采用400.
1.3.1 静态BFD会话
全程通过命令行手工配置的方式指定BFD的会话参数, 本地标识符和远端标识符都是手工写入
1.3.2 动态BFD会话
本地标识符是通过本地运行BFD会话, 和其他协议联动, 自动产生一个本地标识符, 之后会向远端发送BFD报文进行会话协商, 在第一次协商时, 远端标识符为0.
协商的时候, 则两台设备之间就会获取到对方自动生成的本地标识符, 比如A自己生成100, B自己生成200, A和B在交互BFD报文后学习到了对方的标识符信息.
1.3.3 BFD会话状态
BFD会话状态 | 备注 |
---|---|
admindown | 管理员手动关闭BFD会话, admindown不会影响联动的协议 |
down | BFD协议未开始建立, 没有收到init状态的BFD报文 |
init | BFD协议开始建立 |
up | BFD检测正常, 没有故障 |
这四种状态会随着报文一起发送给对端。
1.3.4 BFD会话建立过程
BFD的会话建立过程, 采用三次握手机制建立, 报文全是控制报文:
- 双方设备启动BFD协议, 刚开始的初始会话状态时down状态, 然后互相发送BFD报文(此时报文携带设备状态为down):
- 如果是静态会话, 报文中携带本地标识符和远端标识符;
- 如果是动态会话, 报文中携带本地标识符, 远端标识符为0.
- 任意一方接收到设备状态为down的BFD报文, 本地状态会切换到init, 并回复一个设备会话状态为init的报文(严格来说双方是同步进行的)
- 收到对方发送的init状态的BFD报文之后, 设备会切换到up状态, 并且再次互相回复一个会话状态为up的BFD报文, 此时BFD会话已然建立.
注:
- 如果设备已经是init状态, 收到down状态报文不进行接收处理, init状态说白了就是确定双方没有在交互过程中出现故障, 保证可靠性.
- down状态的设备收到up状态的报文不会进行处理.
- 网络发送故障后, 会话状态会切换到down状态, 并告知联动的协议, 当前网络出现问题, 需要进行切换.
1.4 BFD检测机制
BFD的检测机制: 两个系统建立BFD会话, 并沿他们之间的路径周期性发送BFD控制报文, 如果一方在既定的时间内没有收到BFD控制报文, 则认为路径上发生了故障. BFD的检测模式分为查询模式和异步模式两种.
1.4.1 查询模式
查询模式也称为同步检测机制, 采用本地检测倍数进行BFD会话检测
在需要验证连接性的情况下, 系统连续发送多个BFD控制报文, 如果在检测时间内没有收到返回的报文(需要回复), 就宣布会话Down.
1.4.2 异步模式
系统之间相互周期性的发送BFD控制包(不需要回复, 只是双方单纯发送), 如果某个系统在检测时间内没有收到对端发来的控制报文, 就宣布会话down.
注: 华为设备默认采用异步模式, 且无法通过命令行进行修改.
1.5 BFD检测时间
会话时长由报文中的字段: TX(Desired Min Interval, 本地最小BFD报文发送间隔)、RX(Request Desired Min Interval, 本地最小BFD报文接收间隔), DM(Detect Multi, 检测超时倍数)决定.
BFD报文实际发送时间间隔, 实际接收时间间隔由BFD会话协商决定.
- 本地BFD报文实际发送时间间隔=MAX
- 本地BFD报文实际接收时间间隔=MAX
- 本地BFD报文实际检测时间:
- 查询模式: 本地BFD报文实际检测时间=本地BFD报文实际接收时间间隔x本端配置的BFD检测倍数;
- 异步模式: 本地BFD报文时间检测时间=本地BFD报文实际接收时间间隔x对端配置的BFD检测倍数
注: TX&RX默认时间为1000ms, DM默认为3倍.
光是文字表达可能理解起来会比较慢, 这里还是举个例子:
设备参数如下:
设备 | TX | RX | DM |
---|---|---|---|
R1 | 100ms | 200ms | 3 |
R2 | 150ms | 50ms | 4 |
就R1而言:
- 本地BFD报文实际发送时间为: MAX{100ms, 50ms}=100ms
- 本地BFD报文实际接收时间为: MAX{200ms, 150ms}=200ms
- 本地BFD报文实际检测时间:
- 查询模式: 200ms x 3 = 600ms
- 异步模式: 200ms x 4 = 800ms
就R2而言:
- 本地BFD报文实际发送时间为: MAX{150ms, 200ms}=200ms
- 本地BFD报文实际接收时间为: MAX{50ms, 100ms}=100ms
- 本地BFD报文实际检测时间:
- 查询模式: 100ms x 4 = 400ms
- 异步模式: 100ms x 3 = 300ms
1.6 BFD Echo功能
BFD Echo(BFD回声功能)是由本地发送BFD Echo报文, 远端系统将报文环回的一种检测机制.
在两台直接相连的设备中, R1支持BFD功能, R2不支持, 为了能够快速的检测这两台设之间的故障, 可以在支持BFD功能的设备上创建单臂回声功能的BFD会话, R1向R2发送目的ip地址为R1自己的BFD回声报文.
支持BFD功能的设备主动发起回声请求功能, 不支持BFD功能的设备接收到该报文之后将其环回, 从而实现转发链路的连通性检测功能.
如果连续几个BFD报文都没有转发回来, 则会话变为Down, 需要处理网络切换.
2 BFD联动
2.1 BFD联动原理
开头提到BFD的优点之一就是联动功能, 这也是BFD技术的核心, BFD联动功能由检测模块、Track和应用模块三部分组成:
BFD大部分情况下, 通过路由器的track模块和应用模块中的各类协议进行联动, 应用模块通过track模块调佣检测模块BFD.
2.2 静态路由与BFD联动
静态路由自身没有检测机制, 如果静态路由存在冗余路径, 通过静态路由与BFD联动, 当主路径故障时, 实现静态路由的快速切换.
静态路由与BFD联动应用广泛, 如下图中R1值园区网的出口路由器, R1通过两条链路分别连接ISP1和ISP2, 正常情况下默认路由经过的链路为指向ISP1的链路, 当通往ISP1的链路出现故障的时候, BFD会话能够快速感知, 并通知路由器将流量切换到指向ISP2的链路.
2.3 OSPF与BFD联动
OSPF在未绑定BFD的情况下, 链路故障检测时间由OSPF协议的Hello机制决定, 这个检测时间通常是秒级, 但通过与BFD联动后OSPF能实现毫秒级故障检测.
BFD与OSPF联动就是将BFD和OSPF协议关联起来, BFD将链路故障的快速检测结果告知OSPF协议.
BFD会话建立后会周期性快速发送BFD报文, 如果在检测时间内未收到BFD报文则认为该双向转发链路发生故障, 通知被服务的上层应用进行相应的处理.
来看下图举例:
- OSPF通过自己的Hello机制发现邻居并建立连接;
- OSPF在建立了新的邻居关系后, 将邻居信息(包括源/目的地址)通告给BFD;
- BFD根据收到的邻居信息建立会话, 会话建立后开始检测链路故障, 此时OSPF邻居关系为full状态, BFD会话为up状态;
- 正常情况下, R1根据OSPF路径开销大小选择经过R2后到达R4;
- 当R1和R2之间链路出现故障, BFD首先快速检测到链路故障, BFD会话状态变为Down并通知R1;
- R1处理邻居Down事件, 通知本地OSPF进程邻居不可达, 邻接关系切换到down状态, 重新进行路由计算, 选择通过R3到达R4.
注: 如果采用default-ip的默认组播地址进行检测, 则组播地址是用的是224.0.0.184.
3 BFD基本配置
3.1 配置命令
-
创建BFD会话绑定信息, 并进入BFD会话视图:
[Huawei]bfd session-name bind peer-ip ip-address interface interface-number [source-ip ip-address]
缺省情况下, 未创建BFD会话. 在第一次创建单跳BFD会话时, 必须绑定对端ip地址和本端相应接口, 且创建后不可修改. 如若需要修改, 只能删除后重新创建.
-
创建使用组播地址作为BFD会话, 并进入BFD会话视图:
[Huawei]bfd session-name bind peer-ip default-ip interface interface-type interface-namber [source-ip ip-address]
-
创建BFD for IPv6的绑定信息, 并进入BFD会话视图:
[Huawei]bfd session-name bind peer-ipv6 ip-address interface interface-type interface-number [source-ipv6 ip-address]
在第一次创建单跳BFD会话时, 必须绑定对端IPv6地址和本端相应接口, 且创建后不可修改.
-
创建静态标识符自动协商BFD会话:
[Huawei]bfd session-name bind peer-ip ip-address interface interface-type interface-number [source-ip ip-address] auto
-
创建单臂Echo功能的BFD会话:
[Huawei]bfd session-name bind peer-ip ip-address interface interface-type interface-number [source-ip ip-address] one-arm-echo
-
配置BFD会话的本地标识符:
[Huawei-bfd-session-test]discriminator local discr-value
会话名为test.
-
配置BFD会话的远端标识符:
[Huawei-bfd-session-test]discriminator remote discr-value
配置标识符时, 本地标识符必须与远端设备上配置的远端标识符相同, 否则会导致BFD会话无法正确建立. 并且, 本地标识符和远端标识符配置成功后都无法修改, 只能删除会话重新创建并重新配置标识符.
3.2 配置举例
3.2.1 静态路由与BFD联动
配置要求
- 如上图组网所示, 在R1配置到达R4的Loopback0: 4.4.4.4/32网段的浮动静态路由, 正常情况下通过R2访问R4, 当R2故障时, 自动选路通过R3访问R4的Loopback0;
- 在R1和R2之间建立BFD会话, 并与静态路由绑定, 实现故障快速检测和路径快速收敛.
配置脚本
R1:
[R1]bfd
[R1]bfd 12 bind peer 10.0.12.2 interface g0/0/1
[R1-bfd-session-12]discriminator local 10
[R1-bfd-session-12]discriminator remote 20
[R1-bfd-session-12]commit
[R1]ip route-static 4.4.4.4 32 10.0.12.2 track bfd-session 12
[R1]ip route-static 4.4.4.4 32 10.0.12.2 perference 100
- 创建BFD会话12并进入
- 绑定远端ip地址和自己的接口
- 设置本地标识符和远端标识符
- 确定配置
- 配置R1到R4的静态路由并绑定BFD会话12
- 设置静态路由优先级
R2:
[R2]bfd
[R2]bfd 21 bind peer 10.0.12.1 interface g0/0/1
[R2-bfd-session-21]discriminator local 20
[R2-bfd-session-21]discriminator remote 10
[R2-bfd-session-21]commit
- 创建BFD会话21并进入
- 绑定远端ip地址和自己的接口
- 设置本地标识符和远端标识符
- 确定配置
会话配置验证
[R1]display bfd session all verbose
命令输出结果如下:
这里放的是PPT的截图, 实际的输出参考我应该会在bfd实验博客中展示
3.2.2 OSPF与BFD联动配置
配置要求
- R1、R2、R3运行OSPF协议, 且都输入area0;
- 配置OSPF与BFD联动, 通过设置所有OSPF接口的BFD会话参数进一步提高链路状态变化时OSPF的收敛速度;
- 将BFD会话的最大发送时间间隔和最大接收时间间隔都设置为100ms, 检测次数默认不变.
配置脚本
R1:
[R1]bfd
[R1]int g0/0/1
[R1-g0/0/1]ip address 10.0.12.1 30
[R1-g0/0/1]quit
[R1]ospf 1
[R1-ospf-1]area 0
[R1-ospf-1-area-0.0.0.0]network 10.0.12.1 0.0.0.0
[R1-ospf-1-area-0.0.0.0]quit
[R1-ospf-1]bfd all-interfaces enable
[R1-ospf-1]bfd all-interfaces min-tx-interval 100 min-rx-interval 100 detect-multiplier 3
R2:
[R2]bfd
[R2]int g0/0/2
[R2-g0/0/1]ip address 10.0.12.2 30
[R2]int g0/0/1
[R2-g0/0/1]ip address 10.0.23.2 30
[R2-g0/0/1]quit
[R2]ospf 1
[R2-ospf-1]area 0
[R2-ospf-1-area-0.0.0.0]network 10.0.12.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]network 10.0.23.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0]quit
[R2-ospf-1]bfd all-interfaces enable
[R2-ospf-1]bfd all-interfaces min-tx-interval 100 min-rx-interval 100 detect-multiplier 3
R3:
[R3]bfd
[R3]int g0/0/1
[R3-g0/0/1]ip address 10.0.23.3 30
[R3-g0/0/1]quit
[R3]ospf 1
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]network 10.0.23.3 0.0.0.0
[R3-ospf-1-area-0.0.0.0]quit
[R3-ospf-1]bfd all-interfaces enable
[R3-ospf-1]bfd all-interfaces min-tx-interval 100 min-rx-interval 100 detect-multiplier 3
配置验证
3.2.3 BFD单臂回声配置
这里简单配置举例一下, 具体的请移步我的bfd实验博客
配置脚本
RA:
[RA]bfd
[RA-bfd]quit
[RA]bfd atob bind peer-ip 10.1.1.2 int g1/0/1 one-arm-echo
[RA-bfd-session-atob]discriminator local 1
[RA-bfd-session-atob]min-echo-rx-interval 100
[RA-bfd-session-atob]commit
[RA-bfd-session-atob]qu
4 疑问
1 BFD回声模式会建立BFD会话吗? 如果能的话, 支持BFD的设备发送的BFD控制报文中本地标识符和远端标识符该如何设置?
BFD回声模式会建立单臂回声功能的BFD会话. 因为不支持BFD的设备无法建立BFD会话, 只能是支持BFD的设备自己和自己建立会话, 因此就没有远端设备, 所以只需要配置本地标识符即可.
5 写在后面
看完这篇博客, 你应该了解到了BFD的工作原理, 包括BFD的会话建立过程、BFD故障检测模式、BFD检测实际时间计算以及BFD的检测流程.
这几天打MHR有点上头, 本来是计划慢慢把博客补上的, 但是昨天去围观了学校组织的IT专场双选会, 近50个公司只有三个有网工的需求, 再加上看到大四学长被面的情况, 又开始焦虑了, 回来直接向国科要了ie的课程资源来提前学习一下, 只能说作为网工没ie确实底气还是不太够的.
MHR真好玩.
标签:10,进阶,bfd,报文,BFD,会话,标识符,R1 From: https://www.cnblogs.com/konjac-wjh/p/17274236.html