熊志明,肖萍萍
(武漢郵電科學研究院光纖通信技術和網絡國家重點實驗室,湖北 武漢430074)
網絡技術的不斷發(fā)展使得網絡傳輸的數據量急劇增加,網絡的帶寬資源顯得越來越寶貴,如何有效提高帶寬并能適應目前傳輸網絡成為討論的關鍵。解決這一問題最直接的方法就是提高網絡傳輸的鏈接能力。要增加網絡的鏈接能力,通常有兩種選擇:一是提升本地鏈接能力(即硬件升級),二是使用鏈路聚合來聚合兩個或兩個以上的低速鏈接。當然,通過硬件升級把舊網絡升級成新網絡來提高網絡帶寬無疑是最直接的解決辦法,但通過這樣的方法要花費大量的時間和金錢,對于用戶來說并不可取,同時這種方案不夠靈活。隨著每一次硬件升級都要更換新的產品,造成極大的資源浪費,這不是運營商希望看到的結果。為了更好地解決這個問題,鏈路聚合(Link Aggregation)技術應運而生,鏈路聚合是指將多個端口匯聚在一起形成一個匯聚組,以實現出/入負荷在匯聚組中各個成員端口中的負載分擔,同時也提供了更高的連接可靠性,靈活有效地提高帶寬。早期的鏈路聚合技術沒有實現標準統(tǒng)一,各個廠商有各自私有的解決方案,實現功能不盡相同,各設備間也很難相互兼容。為此,IEEE制定了鏈路聚合的標準,目前以IEEE 802.3ad為正式標準,LACP是該標準的主要內容之一,是一種實現鏈路動態(tài)匯聚和解匯聚的協議。
LACP協議聚合的兩端,即本端(Actor)和對端(Partner)通過LACPDU報文的交互來獲取雙方的各種聚合信息,從而通過鏈路匯聚控制協議數據單元(Link Aggregation Control Protocol Data Unit,LACPDU)實現動態(tài)鏈路匯聚和解匯聚。將某端口的LACP協議使能后,該端口將通過發(fā)送LACPDU協議報文通告對端自己的狀態(tài)信息,包括各種優(yōu)先級等。對端將接收到的信息與其他端口所保存的狀態(tài)信息進行對比,并按照一定的算法(一般為hash算法)對鏈路匯聚的端口進行相應的選擇,從而雙方對端口加入或退出某個動態(tài)匯聚組進行協商達成一致。由于LACPDU協議報文的交互是周期性的,即聚合的雙方每隔一段時間(由系統(tǒng)設定)便互發(fā)一次LACPDU協議報文,所以當使能端口成員鏈路因為某種原因不能工作時,鏈路會對此很快感知,并重設鏈路端口狀態(tài),置該鏈路為阻塞,流量被重分配給其他使能端口成員鏈路。這樣就實現了帶寬增加、鏈路動態(tài)備份的功能,從而提高了鏈路的可靠性。
在研的PTN智能接入終端是一個具有4個百兆口、2個千兆口的適用于PTN傳輸網的智能接入終端。本設計動態(tài)鏈路聚合基于該設備來實現。動態(tài)鏈路聚合通過事件來驅動,每個事件發(fā)生的時序都是隨機的,為了更好地控制在不同狀態(tài)產生的不同事件都能夠有正確合理的處理,有限狀態(tài)機是最為有效的方法。
鏈路聚合的實現的狀態(tài)機總體框架如圖1所示。
圖1 鏈路聚合總體框架圖
1)接收狀態(tài)機模塊(Rx狀態(tài)機)
處理從對端收到的LACP協議報文。主要包括報文解析;記錄對端聚合的相關信息;設置端口選擇狀態(tài)(選中/未選中);根據對端信息,設置鏈路聚合的相關數據;處理本端保存的對端聚合相關的數據老化。
2)周期發(fā)送狀態(tài)機(PTx狀態(tài)機)
周期發(fā)送定時機制的建立,是為了讓本端和遠端交互周期的LACPDU報文來維護鏈路的聚合,同時確定并控制這些周期性傳輸產生的頻率。本端或對端任一方的需要都會產生周期的發(fā)送。而發(fā)送的速率由對端確定,該速率與其定義信息接收的超時時間相關。
此狀態(tài)機包含4個狀態(tài):
(1)NO_PERIODIC(無周期),在此狀態(tài)不能周期性地發(fā)送。
(2)FAST_PERIODIC(快速周期),在此狀態(tài)以快速率使能周期性地發(fā)送。
(3)SLOW_PERIODIC(慢速周期),在此狀態(tài)以慢速率使能周期性地發(fā)送。
(4)PERIODIC_TX(周期發(fā)送),此狀態(tài)是一個瞬態(tài),進入周期計時終止,當插入NTT標位時就轉入快速周期或者慢速周期,慢速周期或者快速周期由對端的LACP超時設定決定。
是否發(fā)生周期性發(fā)送由本端和對端的被操作端口狀態(tài)決定。端口狀態(tài)分為LACP激勵狀態(tài)和LACP消極狀態(tài)。在兩端至少有一端端口狀態(tài)為LACP激勵狀態(tài)時就產生周期性發(fā)送,兩端同時設置為LACP消極狀態(tài)時就不會產生周期性發(fā)送事件。類似的,如果兩端的端口使能或者LACP使能變量設置為無效時,表明端口的LACP協議功能未使能,或者端口不可用,此時周期性發(fā)送事件不會發(fā)生。
如果發(fā)生了周期性發(fā)送事件,那么其發(fā)送周期速率由對端被操作的端口狀態(tài)LACP超時變量決定。如果該變量為短超時,那么周期性發(fā)送的內部時間將用快速發(fā)送周期。反之內部時間將用慢速發(fā)送周期。本設計中慢速周期發(fā)送定時器的周期設置為30 000 ms,快速周期發(fā)送定時器的周期設置為1 000 ms。
3)多路轉發(fā)狀態(tài)機(MUX狀態(tài)機)
MUX狀態(tài)機是用來根據本端和對端的選中狀態(tài),通過控制端口阻塞與否來控制接收和發(fā)送數據功能的開啟和關閉。狀態(tài)控制又可以分為獨立控制和耦合控制。獨立控制是指端口的接收和發(fā)送功能是可獨立控制,即可異步控制,一個功能開啟,另一個功能關閉,如端口使能或去使能及端口的數據幀發(fā)送。耦合控制是指端口的接收和發(fā)送只能同時開啟或關閉。本次設計中為了使事件響應更快、處理更簡化,采用耦合控制。
4)發(fā)送狀態(tài)機模塊(Tx狀態(tài)機)
它完成對LACP協議報文內容的填充,并處理協議報文的發(fā)送,當收到各種標志通知時,立即調用報文發(fā)送模塊發(fā)送報文。當周期狀態(tài)機狀態(tài)為NO_PERIODIC(無周期)時,不交互LACPDU報文,同時將標志位NTT(Need To Transmit)置為無效;當LACP使能變量有效且標志位NTT有效時,又由于LACP協議屬于慢速協議,每秒最多允許發(fā)送10個LACP協議報文,LACPDU報文的發(fā)送將嚴格遵循這一原則。為確保遵循這個要求,狀態(tài)機設置內部維護NTT標志和一個全局變量來記錄已發(fā)送協議報文的數目,每隔1 s就將這些參數清零。
5)邏輯選擇器
設置端口的選中狀態(tài),配合其他狀態(tài)機完成聚合功能。
圖1說明了這些狀態(tài)機之間的關系以及它們之間的信息交互。標記了Partner狀態(tài)信息的這組箭頭代表新Partner的信息,包含在一個傳入的LACPDU或是系統(tǒng)提供的默認值中,通過接收狀態(tài)機反饋給各個狀態(tài)機。標記了Actor狀態(tài)信息的這組箭頭代表狀態(tài)機之間更新的Actor狀態(tài)信息數據。LACPDUs的傳輸是由于周期性狀態(tài)機觸發(fā)產生一個周期性的LACPDU或需要傳達給Partner的Actor的狀態(tài)信息改變產生的。LACPDU的傳輸要通過置標志位NTT。剩下的箭頭標記代表在狀態(tài)機中描述全局變量,允許觸發(fā)一個狀態(tài)機的事件發(fā)生在另一個狀態(tài)機。
軟件實現狀態(tài)機通常有內嵌switch、狀態(tài)表、用函數指針作為狀態(tài),用函數地址代替狀態(tài)值,每個狀態(tài)對應于一個函數指針。
本次LACP狀態(tài)機的軟件實現借鑒了以上3種方法,用枚舉值表示狀態(tài),用函數指針的方式實現狀態(tài)的動作和轉換。端口對應的本端和對端的聚合相關信息保存在結構體指針全局變量lacp_info_t指向的內存中。代碼框架具體如下:
/*lacp事件狀態(tài)枚舉*/
typedef enum/*lacp_event_t*/
{
Lac_null=0,
Lac_init,/*lacp協議初始化*/
Lac_tick,/*定時器計時時間戳*/
Lac_port_enabled, Lac_port_disabled,/*端口lacp協議功能使能和去使能*/
Lac_new_info,
Lac_attach, Lac_attached,/*端口lacp添加和已添加*/
Lac_detach, Lac_detached,/*端口lacp分離和已分離*/
Lac_enable_collector, Lac_collector_on,/*邏輯選擇器使能和打開*/
Lac_disable_collector,Lac_collector_off,/*邏輯選擇器去使能和關閉*/
Lac_enable_distributor,Lac_distributor_on,/*適配器使能和打開*/
Lac_disable_distributor,Lac_distributor_off,/*適配器器去使能和關閉*/
Lac_ntt, Lac_txd,/*lacp協議報文發(fā)送標志和報文發(fā)送*/
Lac_check_moved,/*確認端口分離*/
}lacp_event_t;
/*接收狀態(tài)機函數*/
void rx_machine(lacp_port_t*port,lacp_event_t event,lacp_pdu_t*pdu)
{switch(事件)
{
如果事件=Lac_check_moved:通過判斷端口狀態(tài)是否繼續(xù)初始化;
如果事件=Lac_init:初始化接收端口;
如果事件=Lac_port_disabled:去使能接收端口;
如果事件=Lac_port_enabled:通過判斷端口使能及協議使能做相應處理;
如果事件=Lac_tick:通過時間戳判斷是否將本端加入聚合組;
如果事件=Lac_received:通過時間戳判斷是否將對端加入聚合組;
}
};
/*發(fā)送狀態(tài)機函數*/
void tx_machine(lacp_port_t*port,lacp_event_t event)
{switch(事件)
{
如果事件=Lac_init,Lac_port_disabled:停止計時;
如果事件=Lac_ntt:開啟lacp協議內部計時器;
如果事件=Lac_tick:開啟周期計時;
如果事件=Lac_txd:通過條件判斷發(fā)送協議報文或者開啟周期計時;
}
};
/*周期狀態(tài)機函數*/
void per_machine(lacp_port_t*port,lacp_event_t event)
{switch(事件)
{
如果事件=Lac_init,Lac_port_disabled:周期計時設置為停止;;
如果事件=Lac_tick:通過判斷周期是否超時,進入報文發(fā)送狀態(tài)機或停止周期計時;
}
};
/*多路轉發(fā)狀態(tài)機函數*/
void mux_control(lacp_port_t*port,lacp_event_t event);
{switch(事件)
{
如果事件=Lac_init:初始化端口lacp狀態(tài);
如果事件=Lac_tick:通過時間戳判斷是否加入聚合組;
如果事件=Lac_new_info:是否改變聚合端口;
如果事件=Lac_distributor_on:不做處理;
如果事件=Lac_distributor_off:停止分配,進入發(fā)送狀態(tài)機處理;
如果事件=Lac_collector_on:開啟邏輯選擇器,進入發(fā)送狀態(tài)機處理;
如果事件=Lac_collector_off:不做處理;
如果事件=Lac_received:通過時間戳判斷是否將對端加入聚合組;
}
};
/*邏輯選擇狀態(tài)機函數*/
void hw_control(lacp_port_t*port,lacp_event_t event);
switch(事件)
{
如果事件=Lac_init:不做處理;
如果事件=Lac_attach:將多路選擇器狀態(tài)設置為協議端口已關聯;
如果事件=Lac_detach:將多路選擇器狀態(tài)設置為協議端口未關聯;
如果事件=Lac_enable_collector:接收使能,備份端口數據,開啟接收狀態(tài)函數,開啟邏輯選擇器;
如果事件=Lac_disable_collector:接收去使能,備份端口數據,開啟接收狀態(tài)函數,關閉邏輯選擇器;
如果事件=Lac_enable_distributor:發(fā)送使能,備份端口數據,開啟發(fā)送狀態(tài)函數,開啟邏輯適配器;
如果事件=Lac_disable_distributor:發(fā)送去使能,備份端口數據,關閉發(fā)送狀態(tài)函數,關閉邏輯適配器;
}
}
PTN智能接入終端PAS是公司研發(fā)的一款承載PTN傳輸網的接入設備。本次測試設備的硬件設計具有2個GE口,4個電口,支持動態(tài)鏈路聚合。如圖2搭建測試環(huán)境,正確連接各物理鏈路,確保各相關端口的狀態(tài)為up狀態(tài)。
圖2 測試環(huán)境
測試步驟:
1)將PAS接入終端的FE1/0/1,FE1/0/2,FE1/0/3,FE1/0/4端口LACP使能;與交換機的4個端口相連并使能端口LACP。
2)以太網測試儀的千兆端口連接PAS接入終端的GE口。
3)以太網測試儀與PAS接入終端相連的端口A源MAC設置為00-00-0F-00-FF-00,與交換機相連端口B源MAC設置為00-00-0F-00-00-AA,從A發(fā)送目的MAC為00-00-0F-00-00-AA的連續(xù)報文2 000 000個。
4)用命令display interface查看端口的收包數目如表1所示。
5)人為制造鏈路故障,如將PAS接入終端的FE1/0/4端口斷纖,用display interface查看端口收包數目如表2所示。
表1 端口收包數目1
表2 端口收包數目2
結果分析:根據hash算法算出的hash值為0~7,然后根據負載分擔表將流量分配到各個端口,理論分析的結果與實際結果一致。本方案在該設備上實現了動態(tài)鏈路聚合,無需手動配置,只需使能端口的LACP協議功能,聚合接口的建立、成員接口的加入、活動接口的選擇完全由LACP協議通過協商完成鏈路的聚合操作。
[1]IEEE Std 802.3ad,Amendment to carrier sense multiple access with collision detection(CSMA/CD)access method and physical layer specifications—aggregation of multiple link segments[S].2000.
[2]鄭濤,郭裕順.基于LACP協議的鏈路聚合狀態(tài)機模塊的實現[J].計算機系統(tǒng)應用,2010,19(5):104-108.
[3]池元武.用狀態(tài)機原理進行軟件設計[EB/OL].[2011-08-20].http://www.docin.com/p-26276442.html.
[4]李澤杰.面向流媒體傳輸的鏈路聚合技術的研究與實現[D].廣州:廣東工業(yè)大學,2008.