簡介
現有的故障檢測方法主要包括以下幾種:
硬體檢測:例如通過SDH(Synchronous Digital Hierarchy,
同步數字型系)告警檢測鏈路
故障。硬體檢測的優點是可以很快發現
故障,但並不是所有介質都能提供硬體檢測。
慢Hello機制:通常採用
路由協定中的Hello
報文機制。這種機制檢測到故障所需時間為秒級。對於高速數據傳輸,例如吉比特速率級,超過1秒的檢測時間將導致大量數據丟失;對於時延敏感的業務,例如語音業務,超過1秒的延遲也是不能接受的。並且,這種機制依賴於
路由協定。
其他檢測機制:不同的協定有時會提供專用的檢測機制,但在系統間互聯互通時,這樣的專用檢測機制通常難以部署。
雙向轉發檢測(BFD)的新協定將幫助解決這個問題,提高
故障檢測與恢復速度。作為一項IETF草案標準,BFD提供一種檢測鏈路或系統轉發傳輸流能力的簡單方法。
BFD是從基礎傳輸技術中經過逐步發展而來的,因此它可以檢測網路各層的故障。它可以用乙太網、多協定標記交換(MPLS)
路徑、普通路由
封裝以及IPSec隧道在內的多種類型的傳輸正確性。
從本質上講,BFD是一種高速的獨立HELLO協定(類似於那些在
路由協定中使用的協定,如
開放最短路徑優先協定(OSPF),或可以與鏈路、接口、隧道、路由或其他網路轉發部件建立聯繫的中間系統到中間系統協定)。
BFD能夠與相鄰系統建立對等關係,然後,每個系統以協商的速率監測來自其他系統的BFD速率。監測速率能夠以毫秒級增量設定。當對等系統沒有接到預先設定數量的
數據包時,它推斷BFD保護的
軟體或硬體基礎設施發生故障,不管基礎設施是標記交換路徑、其他類型的隧道還是交換乙太網絡。BFD部署在
路由器和其他系統的控制平面上。BFD檢測到的網路故障可以由轉發平面恢復或由控制平面恢復.
BFD提供了一個標準化的與介質和上層協定無關的快速故障檢測機制,BFD具有以下優點:
l 對兩個網路節點之間的鏈路進行雙向故障檢測,鏈路可以是物理鏈路也可以是邏輯鏈路(如LSP、隧道等)
l 可以為不同的上層套用(如MPLS、OSPF、IS-IS等)提供故障檢測的服務,並提供相同的故障檢測時間。
l BFD的故障檢測時間遠小於1秒,可以更快地加速網路收斂,減少上層套用中斷的時間,提高網路的可靠性和服務質量。
BFD的主要工作過程如下:
1. BFD在兩個端點之間的一條鏈路上先建立一個BFD會話(依靠上層協定建立,例如OSPF的鄰居建立時,會將鄰居信息告知BFD,BFD根據這個信息再建立BFD鄰居),如果兩個端點之間存在多條鏈路,則可以為每條鏈路建立一個BFD會話。
2. BFD在建立會話的兩個網路節點之間進行BFD檢測。如果發現鏈路故障就拆除BFD鄰居,並立刻通知上層協定,則上層協定會立刻進行相應的切換。
在BFD會話建立時,有兩種建立模式:主動模式和被動模式。
l 主動模式:在建立BFD會話前不管是否收到對端發來的BFD控制報文,都會主動傳送BFD控制報文。
l 被動模式:在建立對話前不會主動傳送BFD控制報文,直到收到對端傳送來的BFD控制報文。
在會話初始化過程中,通信雙方至少要有一個運行在主動模式才能成功建立起會話。
BFD在會話建立後有兩種操作模式:異步模式和查詢模式。
l 異步模式:在此模式下,網路節點雙方會周期性地傳送BFD控制報文,如果在檢測時間內沒有收到對端的BFD控制報文則認為對應的鏈路出現故障。
l 查詢模式:假定每個系統都有一個獨立的方法,確認自己連線到其他系統。這樣,只要有一個BFD會話建立,系統就停止傳送BFD控制報文,除非某個系統需要顯式地驗證連線性。如果要顯式地驗證連線性,系統傳送一個短系列的BFD控制包,如果在檢測時間內沒有收到返回的報文就宣布會話為Down;如果收到對端的回應報文,協定再次保持沉默。
在BFD中還有一個回聲功能,回聲功能啟動後,會話的一端周期性地傳送BFD回聲報文,對端不對此報文進行處理,而只將此報文轉發再發回給傳送端。傳送端根據是否能收到BFD會話報文來檢測會話狀態。BFD回聲報文只用來檢測直連網段的鏈路狀態,而BFD控制報文還可以檢測非直連網段的鏈路狀態。
BFD現在越來越多地套用在重要網路、重要鏈路上,結合路由、MPLS、VPN、流量工程等技術,可以對重點服務流量提供高可靠性,從而保證服務質量。
BFD庫(Binary File Descriptor library)
BFD庫是一個GNU項目,它的目標就是希望通過一種統一的接口來處理不同的目標檔案。BFD這個項目本身是binutils項目的一個子項目。BFD把
目標檔案抽象成一個統一的模型,比如在這個抽象的目標檔案模型中,最開始有一個描述整個目標檔案總體信息的"檔案頭",就跟我們實際的ELF檔案一樣,檔案頭後面是一系列的段,每個段都有名字、屬性和段的內容,同時還抽象了
符號表、定位表、
字元串表等類似的概念,使得BFD庫的程式只要通過這個抽象的目標檔案模型就可以實現操作所有BFD支持的目標
檔案格式。
GCC(更具體地講是GNU
彙編器GAS,GNU Assembler)、連線器ld、調試器GDB及binutils的其他工具都通過BFD庫來處理目標檔案,而不是直接操作目標檔案。這樣做的最大的好處是將
編譯器和連線器本身同具體的目標檔案格式隔離開來,一旦我們需要支持一種新的目標檔案格式,只須要在BFD庫裡面添加一種格式就可以了,而不需要修改編譯器和連線器。到目前為止,BFD庫支持大約25種處理平台,將近50種目標檔案格式。
當我們安裝了BFD開發庫以後(在我的ubuntu下,包括BFD開發庫的
軟體包的名字叫binutils-dev),我們就可以在程式中使用它。
引自:《程式設計師的自我修養---連結、裝載與庫》
使用方法
How to use BFD
在使用時,要包含bfd.h這個頭檔案
#include"bfd.h"
int main()
{
const char **t = bfd_target_list();
while(*t)
{
printf("%s\n",*t);
t++;
}
}
保存為target.c
在linux下編譯時:gcc -o target target.c -lbfd -liberty