BFD技術背景
什麼是BFD?它的主要作用是做什麼的,這是我們學習BFD需要搞清楚的地方;
BFD是Bidirectional Forwarding Detection的縮寫,翻譯成中文就是雙向轉發檢測;該技術主要用於通訊鏈路故障檢測;我們知道傳統的鏈鋸故障檢測機制有硬體檢測,比如通過SDH(Synchronous Digital Hierarchy,同步數字體系)告警檢測鏈路故障,這種方式的優點就是很快發現故障,但不是所有介質都能提供硬體檢測;其次就是我們比較熟悉的慢HELLO機制;所謂慢hello機制就是通過採用路由協議中的hello報文機制;這種檢測機制檢測到故障都需要一定的時間,且一般都是秒級;這樣一來對於高速資料傳輸的核心鏈路,如果故障在超過1秒才檢測出來,這會導致大量的資料丟失;對於延遲敏感的業務,例如語音業務,這肯定是不能接受的,並且這種慢hello機制是嚴重依賴路由協議;除此之外不同協議有時會提供專用的檢測機制,但在系統間互聯互通時,這種專用的檢測機制通常難以部署;為了減小設別故障對業務的影響,提高網路的可用性,裝置需要能夠儘快檢測到與相鄰裝置間的通訊故障,以便能夠及時採取措施,從而保證業務繼續進行;BFD主要解決了上述檢測機制的不足,它是更通用,標準化,與介質無關,協議無關,為上層協議服務;使用BFD以後,全網統一的檢測機制,用於快速、監控網路中鏈路或路由的轉發連通狀況,保證鄰居之間能夠快速檢測到通訊故障,從而快速建立起備用通道恢復通訊;簡單講BFD就是用於快速檢測出通訊雙方通訊鏈路故障的檢測機制。它的特點就是無關介質和協議,更通用和標準,為上層協議服務;
BFD工作機制
BFD本身沒有發現機制,它主要靠上層協議通知來建立BFD會話,週期性傳送BFD控制報文進行檢測,檢測到故障後,再通知上層協議;這裡需要解釋下,雖然BFD也是通過週期性傳送控制報文來進行檢測,它和慢hello的路由協議檢測機制不同的是,BFD傳送控制報文的速度要比慢hello路由協議要快很多,當然BFD傳送報文的速度是通過雙方BFD配置協商而來,而慢hello路由協議一般都是固定不變的;BFD的控制報文可以控制在微秒級;
BFD會話建立過程
提示:上圖是以ospf為例,BFD會話建立流程;首先上層ospf協議通過自己的hello機制發現鄰居並建立連線;在ospf建立了新鄰居關係時,將鄰居的引數及檢測引數都會通告給BFD(包括目標地址和源地址等);然後BFD根據收到的引數進行計算並建立起會話;
BFD故障處理過程
提示:以ospf為例,當網路出現故障時,首先由BFD檢測到網路發生故障,然後BFD的會話會被拆除;BFD拆除會話以後會通知本地三層協議程式BFD鄰居不可達;此時本地上層協議收到BFD的通知以後會終止上層協議的鄰居關係;這樣一來就實現了本地上層協議快速發現故障(這比通過上層協議本身的hello包檢測機制要快很多);如果網路中存在備用路徑;路由器將會選擇備用路徑;
BFD狀態機制
提示:BFD狀態機的建立和拆除都採用三次握手,以確保兩端系統都能知道狀態的變化,最終目的就是可靠,類似TCP的三次握手,都是確保可靠性;
提示:BFD狀態首先由down狀態開始,即會話沒有建立起;在收到對方傳送到狀態為down的BFD控制報文以後,本端BFD的狀態會從原有的down進入到init初始化的狀態;然後本端會傳送狀態為init的BFD控制報文給對端,此時對端收到本端傳送到狀態為init的控制報文後,會從原有的down狀態轉變為init狀態;然後對端傳送狀態為init的控制報文,本端收到以後,會從原來的init狀態轉變為up狀態,然後本端傳送狀態為up的控制報文,對端收到以後會從init狀態轉變為up狀態;只有兩端的狀態都為up時,此時BFD會話才算建立;
狀態遷移規則:對端狀態變化,檢測定時器超時;比如在對端傳送狀態為init的控制報文時,由於各種原因本端沒有收到,此時如果對端等待一定時間還是沒有收到本端傳送的init狀態控制報文,對端會從原有的init狀態遷移為down狀態;對於up狀態也是一樣,如果在一定時間類沒有收到本端的up狀態的報文,對端會從up狀態遷移至down狀態;所謂對端狀態變化是指本端收到對端傳送到狀態報文後,會觸發本端的狀態變化,比如對端傳送down狀態時,如果本端收到,本端狀態會從down狀態轉變為init狀態;對端傳送init狀態,如果本端收到會觸發本端從init狀態轉變為up狀態;
BFD會話工作方式
BFD會話工作方式主要分兩種,一種是控制報文方式,所謂控制報文方式是指鏈路兩端會話通過控制報文狡猾檢測鏈路的狀態;另外一種就是echo報文方式,這種方式主要用於某一端不支援BFD的場景;鏈路某一端通過傳送echo報文由另一端轉發回來,實現鏈路雙向監測;
BFD報文格式
提示:BFD使用組播地址為224.0.0.184作為目標地址進行工作;其中控制報文的方式有兩個udp埠,分別是3784和4784;3784主要用於單跳檢測;4784主要用於多跳檢測;如果是echo報文方式,對應udp埠為3785;BFD報文除了常規欄位如版本(vers),狀態(sta),長度(length)等,重要的有delect mult 檢測倍數,my discriminator(本端的標識),your discriminator(對端的標識),desired min tx interval 期望的最小傳送間隔,required min rx interval 要求的最小接收間隔,required min echo RX interval要求echo的最小接收間隔(echo方式);下面的auth type auth len,以及authentication data 這些都是用於認證相關欄位;
BFD執行模式
會話前模式
會話建立前的模式主要分主動模式和被動模式,所謂主動模式是指主動傳送BFD控制報文,不管是否收到對端發來的BFD控制報文,都會傳送BFD報文;被動模式是指不會主動傳送BFD控制報文,直到收到對端傳送到BFD控制報文;簡單講就是主動模式會主動傳送BFD控制報文,它不管是否收到對端的控制報文,它都會發;而被動模式只有收到對端的控制報文後才開始傳送本端的控制報文;這也就意味著要想建立起BFD會話,我們至少有一端需要執行為主動模式,會話才能正常建立,如果兩端都是被動模式,BFD會話是建立不起來的;預設執行在主動模式;
會話建立後模式
會話建立後的模主要有非同步模式和查詢模式,所謂非同步模式是指週期性地傳送BFD控制報文,如果在檢測時間內沒有收到BFD控制報文則將會話down掉;查詢模式是指一旦BFD會話建立,不再週期性傳送BFD控制報文,而是通過其他機制檢測連通性,減少大量BFD會話報文所帶來的開銷;
BFD應用場景
1、檢測IP鏈路:在ip鏈路上建立BFD會話,利用BFD檢測機制快速檢測故障;BFD檢測ip鏈路支援單跳檢測和多跳檢測;
單跳檢測
提示:所謂單跳檢測就是指檢測直連繫統的ip連通性;單挑就是指ip的下一跳就只有一跳;通常單挑檢測就是直接繫結出介面即可;
多跳檢測
提示:所謂多跳檢測就是指檢測兩個系統間的任意路徑,可以跨越很多跳,也可能發生重疊;通常多跳檢測是直接繫結ip地址而不是介面;即便是直連鏈路,如果我們繫結ip地址也是屬於多跳檢測;
2、單臂回聲功能
提示:單臂回聲是指對於只有一端支援BFD的環境,通過BFD報文的換回操作檢測轉發鏈路的連通性;這裡需要注意一點單臂回聲功能只能用於單跳BFD會話中;
3、BFD與介面狀態聯動
提示:與介面狀態聯動主要用於減少非直連鏈路故障說導致的問題;如上交換機A和B執行vrrp,如果中間兩個交換機之間的鏈路down掉以後,不管誰是master,backup端只能等到超時以後才會變為master;此時由於中間鏈路斷掉,對應master會收不到其他裝置傳送到vrrp報文,當然它就會認為它是獨立的,從而導致兩個裝置都有可能成為master;如果我們配置了介面關聯,當鏈路發生故障對應介面會被標記為down,此時不管是master端還是backup端感知到對應介面為down以後,對應狀態都會轉變為init狀態;從而避免出現兩個master的情況;簡單講與介面狀態聯動就是提高介面感應鏈路故障的靈敏度;從而更早的發現故障;
4、BFD與靜態路由聯動
與動態路由協議不同,靜態路由本身沒有檢測機制,所以當網路發生故障的時候,需要管理員介入;BFD為靜態路由繫結會話,檢測鏈路故障(由up轉為down)後,BFD會將故障上報路由管理系統,有路由管理模組將這條路由設定為“非啟用”狀態(此條路由不可用,從ip路由表中刪除);
5、BFD與OSPF聯動
提示:將BFD和OSPF關聯起來,通過BFD對鏈路故障的快速感應進而通知ospf協議,從而加快ospf協議對網路拓撲變化的響應;
ospf繫結BFD和未繫結BFD會話的區別
6、BFD與BGP聯動
BGP協議通過週期性的向對等體傳送keepalived報文實現鄰居檢測機制,但這種機制檢測到故障所需時間比較長,超過1分鐘;當資料達到吉位元速率級別時,將會導致大量的資料丟失;利用BFD的快速檢測機制,迅速發現BGP鄰居間鏈路故障,並報告給BGP協議,從而實現BGP路由的快速收斂;
7、BFD與VRRP聯動
提示:將BFD應用於backup對master的檢測,VRRP通過監視BFD會話狀態實現主備快速切換,切換時間控制在50毫秒以內;VRRP通過監視BFD的會話狀態,如果有故障產生,BFD會通知VRRP,vrrp收到bfd的通知以後,會自動將backup的優先順序增加或者將master的優先順序降低從而來實現快速切換;一般建議將backup的優先順序增大,同時master端關聯介面狀態,從而避免出現兩個master的情況;
BFD配置
如上拓撲配置sw1到sw4二層埠檢測,當sw2和sw3之間鏈路斷開,關聯sw1的g0/0/1口軟down,sw4的g0/0/1口軟down
為了使實驗很方便的看到效果,建議把4個交換機的stp直接關掉,遮蔽stp對bfd的影響;
在sw1開啟bfd,並繫結g0/0/1口的埠檢測
提示:第一條命令是全域性開啟bfd檢測;第二條命令是建立g0/0/1口二層鏈路的檢測;如果建立的是三層介面檢測後面peer-ip 就直接跟對應ip地址即可;
配置本地識別符號和遠端識別符號
提示:本地識別符號在對端配置就是遠端識別符號,遠端識別符號在對端就是本地識別符號;本地識別符號和遠端識別符號不能配置成一樣;但是遠端識別符號可以配置成一樣;
提交配置
提示:bfd配置只有提交以後才會生效;
抓包檢視bfd控制報文
提示:可以看到我們能夠正常抓到sw1傳送的BFD控制報文;其中本地識別符號是我們設定的11(16進位制就是0b),遠端識別符號22(16進位制就是16);會話狀態是down;目標地址是224.0.0.184,埠為3784,這意味著我們配置的是單跳檢測;
配置sw4的bfd
驗證bfd會話
提示:可以看到現在sw1和sw4配置的bfd會話已經正常建立;
現在抓包檢視控制報文資訊
提示:現在抓包除了我們配置的標識以外,現在的會話狀態是up狀態,對應最小傳送間隔和最小接受間隔都從原來的一個隨機數字固定了下來;這是因為一開始會話沒有建立,兩者不能正常協商出一個傳送間隔和接受間隔,所以就以一個隨機的時間來;
配置sw1和sw4與介面狀態關聯
檢視BFD會話詳細資訊
提示:可以看到對應BFD已經關聯了介面狀態;
驗證:埠sw2和sw3之間的鏈路,看看對應sw1和sw4對應g0/0/1的介面是否會down呢?
提示:可以看到我們把sw2的g0/0/2口down掉以後,對應bfd會觸發sw1和sw4的g0/0/1口down;這是因為BFD會話down掉以後,觸發對應介面狀態也跟著down掉;
配置最小傳送時間和最小接收時間以及本地檢測倍數
提示:以上配置表示sw1最小傳送間隔為100毫米傳送一次,即1秒傳送10次;預設情況下最小傳送間隔為1秒,最小接收間隔也為1秒;
現在抓包看看對應sw1是否是1秒傳送10個包呢?
提示:可以看到sw1並不是1秒傳送10個包;其實原因很簡單,就是因為sw4最小接收間隔為1秒,它接受沒有那麼快,所以導致sw1傳送也不會那麼快;
配置sw4最小傳送間隔為200毫秒,接收間隔為100毫秒,看看對應發包速率是怎樣的呢?
抓包檢視發包速率
提示:可以看到在sw4上修改了最小傳送間隔和最小接收間隔以後,對應發包的速度明顯快了很多;這意味著本端發包速度和對端接收間隔有關係;同理對端發包的速度和本端的接收間隔有關係;
本地檢測倍數和最小傳送間隔、最小接收間隔之間的關係
本端檢測時間間隔=對端檢測倍數×max(對端傳送間隔,本端接收間隔)
配置BFD與vrrp聯動
刪除原有的介面關聯
在sw1上新建三層介面,並建立虛擬vip為254
在sw4上新建三層介面,並建立虛擬vip為254
驗證vrrp
提示:可以看到sw1是backup,sw4是master;
在sw1上vrrp關聯bfd並設定發生故障對應優先順序增加80
提示:這裡的配置BFD的session id要看本地識別符號;
驗證:把sw2的g0/0/2down掉,看看對應vrrp的backup是否會升級為master?
提示:可以看到當我們把sw2的g0/0/2口down掉以後,對應sw1從原來的backup變為了master;
檢視sw1的vrrp優先順序是否發生了變化?
提示:可以看到我們之前配置的優先順序為150,現在執行優先順序為230;這是因為bfd檢測到鏈路斷掉以後,對應觸發了vrrp增加80優先順序;
檢視sw4的角色是否有變化呢?
提示:可以看到sw4的角色還是master,並沒有發生變化;這是因為sw2和sw3之間的鏈路斷開以後,sw4並沒有收到比它更高優先順序的vrrp訊息,所以它認為它就是master;
配置sw4關聯介面狀態
恢復鏈路然後再斷開,看看對應sw4的角色是否會發生變化呢?
提示:可以看到配置了介面關聯以後,對應sw4的角色不再是master;
配置BFD與ospf聯動
sw1和sw4的ospf配置
在沒有關聯bfd時,當鏈路down掉以後,看看對應ospf的鄰居是否down掉?
提示:可以看到沒有關聯bfd會話時,對應鏈路down掉以後,ospf鄰居並不會馬上斷掉,需要等待很長時間才能斷掉(40秒);
opsf關聯bfd會話
驗證bfd session
提示:可以看到bfd會話多了一個;這裡說明一下bfd和ospf關聯,bfd會話會動態生成一個;
檢視bfd會話詳情
驗證:現在斷開鏈路,看看ospf鄰居是否立即斷開呢?
提示:可以看到現在我們斷開鏈路,對應ospf鄰居也隨之被斷開;這是因為bfd檢測到鏈路故障,通知了ospf;當然我們也可以在bfd裡繫結介面狀態;
配置BFD與靜態路由聯動
在sw1上配置兩條靜態路由,並設定不同優先順序
配置靜態路由關聯BFD會話
斷開鏈路前驗證路由表
斷開鏈路,然後再次驗證路由表看看有什麼變化?
提示:可以看到現在鏈路斷開以後,對應路由表裡的路由也隨之發生了變化;原來的預設路由現在變成了非活動的路由,說明bfd檢測到對應鏈路故障;