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协议简介的更多相关文章

  1. Fiddler--一、HTTP协议简介

    在学习Fiddler之前,最好先学习一下HTTP协议. HTTP协议简介 什么是HTTP协议 超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端 ...

  2. MODBUS-RTU通讯协议简介

    MODBUS-RTU通讯协议简介   什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...

  3. JavaWeb:Web与HTTP协议简介

    JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...

  4. CC2540开发板学习笔记(九)—— BLE协议简介

    一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...

  5. HTTP 协议简介

    HTTP 协议简介 博客分类: acl开发--HTTP协议篇 网络协议http协议  一.TCP/IP 协议介绍 在介绍 HTTP 协议之前,先简单说一下TCP/IP协议的相关内容.TCP/IP协议是 ...

  6. OAUTH协议简介

    OAUTH协议简介 原文来自:http://blog.csdn.net/hereweare2009/article/details/3968582 分类: Open API2009-03-08 12: ...

  7. GRE 协议简介

    1. 协议简介    gre(generic routing encapsulation,通用路由封装)协议是对某些网络层协议(如ip 和ipx)的数据报进行封装,使这些被封装的数据报能够在另一个网络 ...

  8. HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端

    协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...

  9. Tsung MQTT协议简介及MQTT xml文档配置介绍

    MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...

随机推荐

  1. ASP.NET Core下FreeSql的仓储事务

    ASP.NET Core下FreeSql的仓储事务 第一步:配置 Startup.cs 注入 引入包 dotnet add package FreeSql dotnet add package Fre ...

  2. 如何开启MySQL远程连接

    MySql-Server 出于安全方面考虑只允许本机(localhost, 127.0.0.1)来连接访问,这对于 Web-Server 与 MySql-Server 都在同一台服务器上的网站架构来说 ...

  3. SpringBoot+Maven 多模块项目的构建、运行、打包实战

    前言 最近在做一个很复杂的会员综合线下线上商城大型项目,单模块项目无法满足多人开发和架构,很多模块都是重复的就想到了把模块提出来,做成公共模块,基于maven的多模块项目,也好分工开发,也便于后期微服 ...

  4. Bugku-web-md5 collision(NUPT_CTF)

    总结了两道MD5绕过的题目. 根据MD5的特性,有两点漏洞 1.两个开头为0的md5值相同. 2.md5不能处理数组. 3.==用法,0 == 字符串是成立的,从而可以绕过MD5检查. 根据特性,我们 ...

  5. kubernetes/k8s CRI分析-kubelet删除pod分析

    关联博客<kubernetes/k8s CRI 分析-容器运行时接口分析> <kubernetes/k8s CRI分析-kubelet创建pod分析> 之前的博文先对 CRI ...

  6. gRPC学习之三:初试GO版gRPC开发

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. Echarts 图表位置调整

    Echarts 图表的位置调整 折线图和柱状图,通过grid属性调整. grid:{ show:false, top:'20%', right:'5%', bottom:'10%', left:'10 ...

  8. 教你IO流来便利电脑磁盘所有文件,把图片放到一个文件夹里(会发现什么不可告人的密码)

    一.需求 我要把C盘下面的所有图片都拿出来,放到一个新文件夹中.今天小编一身正气,看看有没有什么意外发现!!学会看看自己的盘,悄悄的哦!!! 二.代码展示(运行时间可能有点长) import java ...

  9. C#协作试取消线程

    https://segmentfault.com/q/1010000017109927using System; using System.Collections.Generic; using Sys ...

  10. mysql优化: 内存表和临时表

    由于直接使用临时表来创建中间表,其速度不如人意,因而就有了把临时表建成内存表的想法.但内存表和临时表的区别且并不熟悉,需要查找资料了.一开始以为临时表是创建后存在,当连接断开时临时表就会被删除,即临时 ...