bfd
檢測兩個轉發點間故障的網路協議
BFD是Bidirectional Forwarding Detection的縮寫,它是一個用於檢測兩個轉發點之間故障的網路協議,在RFC 5880有詳細的描述。
BFD是一種雙向轉發檢測機制,可以提供毫秒級的檢測,可以實現鏈路的快速檢測,BFD通過與上層路由協議聯動,可以實現路由的快速收斂,確保業務的永續性。
BFD Echo報文採用UDP封裝,目的埠號為3784,源埠號在49152到65535的範圍內。目的IP地址為發送介面的地址,源IP地址由配置產生(配置的源IP地址要避免產生ICMP重定向)
現有的故障檢測方法主要包括以下幾種:
慢Hello機制:通常採用路由協議中的Hello報文機制。這種機制檢測到故障所需時間為秒級。對於高速數據傳輸,例如吉比特速率級,超過1秒的檢測時間將導致大量數據丟失;對於時延敏感的業務,例如語音業務,超過1秒的延遲也是不能接受的。並且,這種機制依賴於路由協議。
其他檢測機制:不同的協議有時會提供專用的檢測機制,但在系統間互聯互通時,這樣的專用檢測機制通常難以部署。
雙向轉發檢測(BFD)的新協議將幫助解決這個問題,提高故障檢測與恢復速度。作為一項IETF草案標準,BFD提供一種檢測鏈路或系統轉發傳輸流能力的簡單方法。
從本質上講,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