前一阵子因为业务需要,需要设备提供高可靠性(HA),      高可靠性指的是设备出故障的时候能够不影响业务的运行,我们部门产品的高可靠性的实现方案是双机备份,就是一台机器出故障的时候另一台设备能够接替出故障的设备继续运行,双机之间是主备模式。正常情况下,主设备上线运行,备设备监测主设备状态,一旦检测到主设备出故障,就立即切换状态。这里就用到了BFD。

BFD(Bidirectional Forwarding Detection,[RFC5880])全称双向转发检测协议。提供了一种链路之间联通性检测的方式,优势是检测速度快、另一点就是因为是标准协议,各家的方案对接起来不会太难。如果不用BFD的话,设备之间检测时间级别是秒级,也就是主机器出故障到备机上线运行,中间有几秒时间业务是中断的,举个栗子,当你和女友通电话的时候, 天空正在下雨,一个雷击,正好击中了附近的电信基站,这时信号中断,等到你重新接通电话的时候,等待的时间就是切换时间。对于某些情况,损失几秒不是太大的问题,最多就是再来一次。但是对于一些重要行业的关键应用,业务停摆带来的损失巨大,比如说金融业,证券系统。BFD的好处就是它检测的时间精度很高,一般来说都支持毫秒级,虽然协议的标准是微妙,但是对于常见的嵌入式设备,微秒的精度会给系统cpu带来很大的压力,所以毫秒更常见一些。

BFD的协议虽然很简单,但是对于没有网络协议栈实现经验的人来说,还是有点困难的。比如我这种..

首先就是去看协议,标准的协议,反复的看。看过多遍之后就去阅读已有的实现方案,可以在github、SourceForge 等网站找到一些。借鉴现有的实现来实现自己的BFD。最初看到一个实现是kbfd,它是在内核态实现的,并且内核版本有点老,2.6.x。我们的系统版本基于openwrt,内核3.4.39。所以就决定移植出来,中间涉及到的知识包括内核态套接字编程、内核高精度定时器hrtimer的使用、工作队列以及延迟工作队列等。移植不是重点,重点在于对协议栈、状态机的实现。虽然BFD的状态机简单,只有三个状态Down, Init, Up。但是状态机的变迁管理还是很痛疼的。

但是,这样开发出来的功能有风险。不能使用。风险?在哪。

相较于用户层层面开发,内核态的一个好处就是效率高,不用频繁在内核态和用户态之间通信。但是风险也大,稍微一个kernel panic,整个系统就挂了,所以决定将整个BFD在用户层实现。这中间涉及到了Linux用户态编程的相关知识,包括多线程、消息队列、网络套接字和异步通信等。这部分代码是c完成的。产品的业务层代码是用go写的,因为要和其它模块交互通信,所以学习了Go语言(顺便夸一下Go语言,并发编程真的好棒!)。最终的实现就是BFD的核心功能以c库的形式提供,Go实现封装调用。

BFD核心功能的实现框架大概是这样一个样子,每个会话由一个独立线程控制,另外有一个独立线程进行消息分发 。总体架构大概是如下这幅图:

监听线程的实现采用的是epoll监听,包括定时器超时事件、套接字收发等。有消息的话就发送到对应的会话线程里的消息队列中。而BFD会话线程的任务就是监听自身的消息队列,循环处理。没有消息的话就等待。消息队列的实现有两种,一种是linux提供的Posix消息队列,另一种是自定义的消息队列,系统提供的消息队列限制太多,例如一个进程创建的消息队列个数有限,其次就是消息队列的长度。所以这里采用了自定义的消息队列,利用条件变量与互斥锁来实现。

关于BFD协议的开发基本上就是这个样子,期间经历了三次大的更改。一次是内核态实现、一次是用户态实现最后就是CGo的方式实现。各项功能运行良好。还有就是并没有完全实现协议里面定义的各项功能,例如加密、查询模式、ECHO模式等。这一部分在下个版本更新中再考虑。

通信协议的实现很重要的一点就是读协议,掌握了协议内容才能够开发。最好读原版,大部分通信的协议RFC都是英文版。

またね!

关于BFD(双向转发检测)开发的总结相关推荐

  1. Cisco BFD双向转发检测技术部署案例

    Technorati 标签: Cisco,BFD,SLA Cisco BFD是一种双向转发检测机制,可以提供毫秒级的检测,可以实现链路的快速检测,BFD通过与上层路由协议联动,可以实现路由的快速收敛, ...

  2. BFD (双向转发检测) 协议简介与开发

    之前开发的BFD协议,正好有空介绍一下协议基础内容以及开发时候的注意事项.内容分为如下 1. BFD背景简介 2. BFD特点 3. BFD报文格式 4. BFD 状态机处理 5. 开发注意事项 一. ...

  3. 华为设备BFD实战,双向转发检测BFD详解,理论+实战+抓包分析

    一.BFD 双向转发检测BFD(Bidirectional Forwarding Detection)是一种全网统一的检测机制,用于快速检测.监控网络中链路或者IP路由的转发连通状况.[毫秒级] 二. ...

  4. BFD(双向转发检测)

    BFD:用于快速检测,监控网络中的通信故障. 默认报文发送间隔(200ms~1000ms,默认400ms) 1.原理简介: BFD在两台网络设备建立会话,用来检测网络设备间的双向转发路程,为上层应用服 ...

  5. Vue Angular 双向绑定检测不到对象属性的添加和删除

    由于ES5的限制 Vue  && Angular 双向绑定检测不到对象属性的添加和删除  还有数组增加索引.这些改变不会触发change事件.Vue是因为实例化的时候已经把各个属性都s ...

  6. YOLODet最新算法的目标检测开发套件,优化到部署

    向AI转型的程序员都关注了这个号???????????? 人工智能大数据与深度学习  公众号:datayx YOLODet-PyTorch是端到端基于pytorch框架复现yolo最新算法的目标检测开 ...

  7. 锐捷交换机配置vsu及BFD双主机检测

    vsu Ruijie(config)#switch virtual domain domain _ id 配置域ID,domain_id 范围为1-255 Ruijie(config-vs-domai ...

  8. Rockland检测开发丨Rockland 免疫分析开发方案

    艾美捷 Rockland定制免疫分析包括开发.鉴定.验证和实施基于蛋白质印迹和 ELISA 的分析--包括细胞内西方和基于细胞的 ELISA--支持从发现研究和临床前研究到生物过程监控和批放行测试等. ...

  9. 环境搭建、标注、训练、推断,超详细的目标检测开发流程

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自飞桨PaddlePaddle.基于PaddleDetection,详细描述了一个完整目标检测项目流程,非常值得收藏. [飞桨开发者说]:余志良 ...

最新文章

  1. 菲尔兹奖数学家丘成桐:人工智能中的数学理论尚无很大突破
  2. linux centos 丢失 grub.conf 启动系统
  3. CompletableFuture计算完成时回调方法
  4. 安徽计算机应用基础高考试题,安徽省对口高考试题(计算机应用基础部分)
  5. python网络编程能做什么_python网络编程——什么是socket?
  6. python数据统计代码_Python 数据的累加与统计的示例代码
  7. 企业级应用与互联网应用的区别
  8. linux中如何改IP
  9. python软件测试面试题及答案_软件测试面试 | 一道大厂算法面试真题,你能答上来吗?(附答案)...
  10. Cesium:修改点击显示的infoBox内容
  11. wechat微信模板消息推送demo
  12. docker使用阿里云Docker镜像库加速
  13. reg型变量怎么赋值_FPGA的wire和reg类型变量
  14. BI与SaaS碰撞,让数据处理更加轻松(下)
  15. 计算机二级相关快捷键,计算机二级考试Word+Excel必备快捷键!
  16. 超图平台倾斜摄影发布流程
  17. 知云文献翻译打不开_英文PDF文献翻译神器-知云文献翻译
  18. 快递单证智能OCR识别,助力物流行业数字化升级
  19. ps更换证件照的背景色
  20. 使用tkinter实现一个类似手表的电子时钟软件,该电子时钟可进行计时、日历等功能

热门文章

  1. poj3252 组合数学
  2. Js选择框脚本 移动操作select 标签中的 option 项的操作事项
  3. 张家口以太坊智能合约开发实战pdf_以太坊的再次腾飞,你看得懂么?
  4. 神经网络为什么可以实现分类?---三分类网络0,1,2与弹性振子力学系统
  5. 协方差、协方差矩阵的解释意义
  6. java list 查找_java面试之容器
  7. lmbs PHP,PHP的GD2函数创建折线图源码示例
  8. 【控制】《多无人机协同控制技术》周伟老师-第3章-面向协同控制的无人机单机控制
  9. 【数理知识】《矩阵论》方保镕老师-第7章-几类特殊矩阵与特殊积
  10. 1.7 总结-深度学习-Stanford吴恩达教授