BFD协议简介
1. 背景
双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测、监控网络中链路或者IP路由的转发连通状况。
为了保护关键应用,网络中会设计有一定的冗余备份链路,网络发生故障时就要求网络设备能够快速检测出故障并将流量切换至备份链路以加快网络收敛速度。目前有些链路具备硬件检测机制来快速故障检测,但某些链路(如以太网链路)不具备这样的检测功能。这种情况下就需要上层协议自身的机制来进行故障检测。但大部分协议如OSPF,BGP等检测链路故障的速度都很慢,最快也需要1s的时间,而且这些功能只针对本协议有效,无法为其他的协议或者应用提供快速检测机制。这对于某些实时性较高的上层应用如音频,视频等是不能接受的。
BFD就是在这种背景下产生的,它提供了一个通用的标准化的介质无关和协议无关的检测机制。
2. 工作原理
BFD在两台网络设备上建立会话,用来检测网络设备间的双向转发路径,为上层应用服务。会话建立后会周期性地快速发送BFD报文,如果在检测时间内没有收到BFD报文则认为该双向转发路径发生了故障,通知被服务的上层应用进行相应的处理。
BFD协议本身没有邻居发现机制,BFD邻居的创建依赖于上层的应用。根据BFD会话建立过程可以将其分为动态BFD和静态BFD。
动态BFD:是通过上层应用(例如OSPF)的邻居发现机制,有上层应用将邻居信息发送到BFD模块,BFD则根据接收到的邻居信息创建会话并建立自己的邻居。
静态BFD:是通过静态配置手动添加对端的邻居信息来创建会话,静态BFD配置完后,会定时发送BFD控制报文。只有对端接口也开启BFD的情况下并对本端的BFD报文做出正确应答后,双方建立邻居信息。
3. BFD报文结构
3.1BFD控制报文
BFD控制报文包括两部分:强制部分和可选认证部分。
强制部分的报文格式是固定的,如下图所示:

可选认证部分根据认证的类型的不同而异,如下图所示:

BFD控制协议各字段代表的意义如下:




3.2BFD Echo报文
BFD
Echo报文提供了一种不依赖于BFD控制报文的故障检测方法。本端发送本端接收,远端不对报文进行处理,而只是将此此报文在反向通道上返回。因此BFD协议并没有对BFD
Echo报文的格式进行定义,唯一的要求是发送方能够通过报文内容区分会话。BFD
Echo报文采用UDP封装,目的端口号为3785,目的IP地址为发送接口的地址,源IP地址由配置产生(配置的源IP地址要避免产生ICMP重定向)。
4 BFD会话建立过程
BFD共有4种类型的控制报文维持BFD状态,分别为:
#define BSM_AdminDown 0
#define BSM_Down 1
#define BSM_Init 2
#define BSM_Up 3
BFD控制报文交互及其状态切换图如下所示: 
5. BFD系统架构
这个系统架构包括有四部分组成(实际使用过程中,而不是纯BFD协议)。架构图如下:
…[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4tZcBd5-1600689737899)(.https://img-blog.csdnimg.cn/20191019004058806.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3MyNjAzODk4MjYw,size_16,color_FFFFFF,t_70#pic_center)]
6.应用层bfdd数据结构
…[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kwb3Ubvk-1600689759907)(.https://img-blog.csdnimg.cn/20191019004340145.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3MyNjAzODk4MjYw,size_16,color_FFFFFF,t_70#pic_center)]
7.内核态kbfd数据结构
kbfd是开源代码,因此内核框架部分是通用的

kbfd维护两个哈希表的原因:
1)down状态:发送BFD报文无法知道对端鉴别值,只知道对端的IP,因此只能根据IP进行查表;
2)其他状态:已经进行了初步交互,既有对端的IP也有对端鉴别值,对端可以根据发来的鉴别值进行查表
实际是同一个哈希表,只是有两种查找方式。
8.内核态kbfd处理流程

内核态处理使用到的知识:
1)netlink套接字通信: 用来和应用层进行通信;
2)工作队列和工作这线程:用来定时发送报文,一个用来超时检测;
3)状态机:用来维护不同BFD会话的工作状态。
4)哈希表存储会话信息。
kbfd开源源码中的状态机代码实现个人感觉比较经典,属于常用的那种,我是在这里才正式接触到状态机的,并更新了一篇《C语言实现状态机》的博客。
8.内核态kbfd状态机流程图



9. BFD联动ospf动态路由
9.1 BFD会话建立过程

上图所示是一个简单的网络组网,两台设备上同时配置了OSPF与BFD,BFD会话建立过程如下所示:
- 动态配置流程:
(1) OSPF通过自己的Hello机制发现邻居并建立连接。
(2) OSPF在建立了新的邻居关系后,将邻居信息(包括目的地址和源地址等)通告给BFD。
(3) BFD根据收到的邻居信息建立会话。
(4) 会话建立以后,BFD开始快速发送bfd控制报文,检测链路故障,并做出快速反应。 - 静态配置流程:
(1) 通过手动配置,直接将邻居信息(包括目的地址和源地址)通告给BFD
(2) BFD根据收到的邻居信息建立会话。
(3) 会话建立以后,BFD开始快速发送bfd控制报文,检测链路故障,并做出快速反应。
目前与HA的联动采用的是静态配置方式。
9.2 BFD故障发现过程

(1) 被检测链路出现故障。
(2) BFD快速检测到链路故障,BFD拆除邻居会话,会话状态变为Down。
(3) BFD通知本地OSPF进程BFD邻居不可达。
(4) 本地OSPF进程中断OSPF邻居关系并根据需求切换到备用链路。
BFD协议简介的更多相关文章
- Fiddler--一、HTTP协议简介
在学习Fiddler之前,最好先学习一下HTTP协议. HTTP协议简介 什么是HTTP协议 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...
- MODBUS-RTU通讯协议简介
MODBUS-RTU通讯协议简介 什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...
- JavaWeb:Web与HTTP协议简介
JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...
- CC2540开发板学习笔记(九)—— BLE协议简介
一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...
- HTTP 协议简介
HTTP 协议简介 博客分类: acl开发--HTTP协议篇 网络协议http协议 一.TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容.TCP/IP协议是 ...
- OAUTH协议简介
OAUTH协议简介 原文来自:http://blog.csdn.net/hereweare2009/article/details/3968582 分类: Open API2009-03-08 12: ...
- GRE 协议简介
1. 协议简介 gre(generic routing encapsulation,通用路由封装)协议是对某些网络层协议(如ip 和ipx)的数据报进行封装,使这些被封装的数据报能够在另一个网络 ...
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...
- Tsung MQTT协议简介及MQTT xml文档配置介绍
MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...
随机推荐
- pycharm配置selenium碰到的问题
Inherit global site-packages: 导入本地包 Make available to all projects : 使所有项目都可用 chromedriver的版本一定要与Chr ...
- Nature | 多层次蛋白质组学综合分析冠状病毒侵染宿主细胞的分子机制
冠状病毒是一种自然界普遍存在的单股正链RNA病毒,电镜下呈日冕状或皇冠状,故命名为冠状病毒.在本世纪初短短20年中,共爆发了三次冠状病毒疫情,即2003年SARS-CoV.2012年MERS-CoV和 ...
- RocketMQ原理分析&场景问题
硬核干货分享,欢迎关注[Java补习课]成长的路上,我们一起前行 ! <高可用系列文章> 已收录在专栏,欢迎关注! 一.RocketMQ的基本原理 RocketMQ基本架构图如下 从这个架 ...
- 【LeetCode】796. 旋转字符串
796. 旋转字符串 知识点:字符串:KMP算法: 题目描述 给定两个字符串, A 和 B. A 的旋转操作就是将 A 最左边的字符移动到最右边. 例如, 若 A = 'abcde',在移动一次之后结 ...
- RPM包方式安装Oracle21c的方法
RPM包方式安装Oracle21c的方法 前言 北京时间2021.8.14 Oracle发布了最新的数据库版本Oracle21c, Oracle规划不再发布Oracle20c和Oracle22c, 直 ...
- CVE-2020-2883漏洞复现&&流量分析
CVE-2020-2883漏洞复现&&流量分析 写在前面 网上大佬说CVE-2020-2883是CVE-2020-2555的绕过,下面就复现了抓包看看吧. 一.准备环境 靶机:win7 ...
- Java中Lambda表达式基础及使用详解
概述 Lambda 是JDK 8 的重要新特性.它允许把函数作为一个方法的参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变的更加简洁紧凑,使Java代码更加优雅. 标准格式 三 ...
- NOIP 模拟 $27\; \rm 牛半仙的妹子Tree$
题解 \(by\;zj\varphi\) 很妙的虚树题. 考虑若没有操作 \(2\),那么直接记录一下扩散到它的最短时间和询问时间相比即可,可以当作一个树上最短路. 有 \(2\) 操作怎么办,将操作 ...
- dubbo-admin管理控制台安装
拉项目切换分支到master git clone https://github.com/apache/dubbo-admin.git /var/tmp/dubbo-admin 打开项目修改配置 dub ...
- easyexcel-导入
package com.meeno.framework.util.easyexcel.entity; import cn.afterturn.easypoi.excel.annotation.Exce ...