关于BFD(双向转发检测)开发的总结
? ? ? ?前一陣子因?yàn)闃I(yè)務(wù)需要,需要設(shè)備提供高可靠性(HA), ? ? ?高可靠性指的是設(shè)備出故障的時(shí)候能夠不影響業(yè)務(wù)的運(yùn)行,我們部門產(chǎn)品的高可靠性的實(shí)現(xiàn)方案是雙機(jī)備份,就是一臺(tái)機(jī)器出故障的時(shí)候另一臺(tái)設(shè)備能夠接替出故障的設(shè)備繼續(xù)運(yùn)行,雙機(jī)之間是主備模式。正常情況下,主設(shè)備上線運(yùn)行,備設(shè)備監(jiān)測主設(shè)備狀態(tài),一旦檢測到主設(shè)備出故障,就立即切換狀態(tài)。這里就用到了BFD。
? ? ? ? ?BFD(Bidirectional Forwarding Detection,[RFC5880])全稱雙向轉(zhuǎn)發(fā)檢測協(xié)議。提供了一種鏈路之間聯(lián)通性檢測的方式,優(yōu)勢是檢測速度快、另一點(diǎn)就是因?yàn)槭菢?biāo)準(zhǔn)協(xié)議,各家的方案對(duì)接起來不會(huì)太難。如果不用BFD的話,設(shè)備之間檢測時(shí)間級(jí)別是秒級(jí),也就是主機(jī)器出故障到備機(jī)上線運(yùn)行,中間有幾秒時(shí)間業(yè)務(wù)是中斷的,舉個(gè)栗子,當(dāng)你和女友通電話的時(shí)候, 天空正在下雨,一個(gè)雷擊,正好擊中了附近的電信基站,這時(shí)信號(hào)中斷,等到你重新接通電話的時(shí)候,等待的時(shí)間就是切換時(shí)間。對(duì)于某些情況,損失幾秒不是太大的問題,最多就是再來一次。但是對(duì)于一些重要行業(yè)的關(guān)鍵應(yīng)用,業(yè)務(wù)停擺帶來的損失巨大,比如說金融業(yè),證券系統(tǒng)。BFD的好處就是它檢測的時(shí)間精度很高,一般來說都支持毫秒級(jí),雖然協(xié)議的標(biāo)準(zhǔn)是微妙,但是對(duì)于常見的嵌入式設(shè)備,微秒的精度會(huì)給系統(tǒng)cpu帶來很大的壓力,所以毫秒更常見一些。
? ? ? ?BFD的協(xié)議雖然很簡單,但是對(duì)于沒有網(wǎng)絡(luò)協(xié)議棧實(shí)現(xiàn)經(jīng)驗(yàn)的人來說,還是有點(diǎn)困難的。比如我這種..
首先就是去看協(xié)議,標(biāo)準(zhǔn)的協(xié)議,反復(fù)的看。看過多遍之后就去閱讀已有的實(shí)現(xiàn)方案,可以在github、SourceForge?等網(wǎng)站找到一些。借鑒現(xiàn)有的實(shí)現(xiàn)來實(shí)現(xiàn)自己的BFD。最初看到一個(gè)實(shí)現(xiàn)是kbfd,它是在內(nèi)核態(tài)實(shí)現(xiàn)的,并且內(nèi)核版本有點(diǎn)老,2.6.x。我們的系統(tǒng)版本基于openwrt,內(nèi)核3.4.39。所以就決定移植出來,中間涉及到的知識(shí)包括內(nèi)核態(tài)套接字編程、內(nèi)核高精度定時(shí)器hrtimer的使用、工作隊(duì)列以及延遲工作隊(duì)列等。移植不是重點(diǎn),重點(diǎn)在于對(duì)協(xié)議棧、狀態(tài)機(jī)的實(shí)現(xiàn)。雖然BFD的狀態(tài)機(jī)簡單,只有三個(gè)狀態(tài)Down, Init, Up。但是狀態(tài)機(jī)的變遷管理還是很痛疼的。
? ? ? ? 但是,這樣開發(fā)出來的功能有風(fēng)險(xiǎn)。不能使用。風(fēng)險(xiǎn)?在哪。
? ? ? ?相較于用戶層層面開發(fā),內(nèi)核態(tài)的一個(gè)好處就是效率高,不用頻繁在內(nèi)核態(tài)和用戶態(tài)之間通信。但是風(fēng)險(xiǎn)也大,稍微一個(gè)kernel panic,整個(gè)系統(tǒng)就掛了,所以決定將整個(gè)BFD在用戶層實(shí)現(xiàn)。這中間涉及到了Linux用戶態(tài)編程的相關(guān)知識(shí),包括多線程、消息隊(duì)列、網(wǎng)絡(luò)套接字和異步通信等。這部分代碼是c完成的。產(chǎn)品的業(yè)務(wù)層代碼是用go寫的,因?yàn)橐推渌K交互通信,所以學(xué)習(xí)了Go語言(順便夸一下Go語言,并發(fā)編程真的好棒!)。最終的實(shí)現(xiàn)就是BFD的核心功能以c庫的形式提供,Go實(shí)現(xiàn)封裝調(diào)用。
? ? ? ? BFD核心功能的實(shí)現(xiàn)框架大概是這樣一個(gè)樣子,每個(gè)會(huì)話由一個(gè)獨(dú)立線程控制,另外有一個(gè)獨(dú)立線程進(jìn)行消息分發(fā)?。總體架構(gòu)大概是如下這幅圖:
監(jiān)聽線程的實(shí)現(xiàn)采用的是epoll監(jiān)聽,包括定時(shí)器超時(shí)事件、套接字收發(fā)等。有消息的話就發(fā)送到對(duì)應(yīng)的會(huì)話線程里的消息隊(duì)列中。而BFD會(huì)話線程的任務(wù)就是監(jiān)聽自身的消息隊(duì)列,循環(huán)處理。沒有消息的話就等待。消息隊(duì)列的實(shí)現(xiàn)有兩種,一種是linux提供的Posix消息隊(duì)列,另一種是自定義的消息隊(duì)列,系統(tǒng)提供的消息隊(duì)列限制太多,例如一個(gè)進(jìn)程創(chuàng)建的消息隊(duì)列個(gè)數(shù)有限,其次就是消息隊(duì)列的長度。所以這里采用了自定義的消息隊(duì)列,利用條件變量與互斥鎖來實(shí)現(xiàn)。
? ? ? ? ?關(guān)于BFD協(xié)議的開發(fā)基本上就是這個(gè)樣子,期間經(jīng)歷了三次大的更改。一次是內(nèi)核態(tài)實(shí)現(xiàn)、一次是用戶態(tài)實(shí)現(xiàn)最后就是CGo的方式實(shí)現(xiàn)。各項(xiàng)功能運(yùn)行良好。還有就是并沒有完全實(shí)現(xiàn)協(xié)議里面定義的各項(xiàng)功能,例如加密、查詢模式、ECHO模式等。這一部分在下個(gè)版本更新中再考慮。
? ? ? ?通信協(xié)議的實(shí)現(xiàn)很重要的一點(diǎn)就是讀協(xié)議,掌握了協(xié)議內(nèi)容才能夠開發(fā)。最好讀原版,大部分通信的協(xié)議RFC都是英文版。
? ? ? ?またね!
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的关于BFD(双向转发检测)开发的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IPv6扩展头部 (一) 扩展头部格式、
- 下一篇: 钱站上征信吗(钱站上征信)