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