楊曉,劉琦
(西華大學(xué)計算機與軟件工程學(xué)院,成都 610039)
人類社會已經(jīng)進入網(wǎng)絡(luò)無所不在的信息時代,截至2017年3月,全球互聯(lián)網(wǎng)用戶突破37.4億,全球每人平均每月的網(wǎng)絡(luò)流量也將于2021年達到61GB(從2016年的24GB)?;ヂ?lián)網(wǎng)能夠快速發(fā)展主要得益于它優(yōu)良的體系結(jié)構(gòu)和網(wǎng)絡(luò)技術(shù),然而伴隨著推廣的深入和網(wǎng)絡(luò)規(guī)模的不斷擴大,爆炸式的增長使其自身結(jié)構(gòu)的僵化問題越來越明顯,互聯(lián)網(wǎng)原有的結(jié)構(gòu)反而成為阻礙它進一步發(fā)展的最大障礙。
SDN(軟件定義網(wǎng)絡(luò))是一種新式的網(wǎng)絡(luò)架構(gòu),這種方式給了可以破除當(dāng)前網(wǎng)絡(luò)架構(gòu)存在的瓶頸的希望。在傳統(tǒng)的網(wǎng)絡(luò)結(jié)構(gòu)中,控制平面和數(shù)據(jù)平面是整合在同一個網(wǎng)絡(luò)設(shè)備中,而SDN的一個核心點就是通過打破垂直整合,將網(wǎng)絡(luò)的控制邏輯從底層的路由器和交換機中分離出來,促進網(wǎng)絡(luò)控制(邏輯)中心化,引入對網(wǎng)絡(luò)可編程的能力[1]。網(wǎng)絡(luò)策略的制定、交換硬件中的執(zhí)行以及流量的轉(zhuǎn)發(fā)之間的分離,這是我們所期望靈活性的關(guān)鍵之處。通過將網(wǎng)絡(luò)控制問題分離成一些易于解決的小部分,SDN使得在網(wǎng)絡(luò)中易于創(chuàng)造和引入新的抽象,這樣簡化了網(wǎng)絡(luò)管理,有利于網(wǎng)絡(luò)革新和發(fā)展。另外,在傳中的IP網(wǎng)絡(luò)中所有的轉(zhuǎn)發(fā)行為都是基于單一的IP地址進行轉(zhuǎn)發(fā),而在SDN中,所有轉(zhuǎn)發(fā)都是基于流(一套基于數(shù)據(jù)包頭域的規(guī)則)進行轉(zhuǎn)發(fā),這種細粒度的方式更加方便于策略的實現(xiàn)[2]。
IEEE 802.3ax標(biāo)準(zhǔn)的 LACP(Link Aggregation Con?trol Protocol,鏈路聚合控制協(xié)議)是一個關(guān)于動態(tài)鏈路聚合的協(xié)議,它通過協(xié)議報文LACPDU(Link Aggrega?tion Control Protocol Data Unit,鏈路聚合控制協(xié)議數(shù)據(jù)單元)和相連的設(shè)備交互信息[3]。當(dāng)端口啟用LACP協(xié)議后,端口通過發(fā)送LACPDU來通告自己的系統(tǒng)優(yōu)先級、系統(tǒng)MAC、端口的優(yōu)先級、端口號和操作key等[4]。相連設(shè)備收到該報文后,根據(jù)所存儲的其他端口的信息,選擇端口進行相應(yīng)的聚合操作,從而可以使雙方在端口退出或者加入聚合組上達到一致。在傳統(tǒng)網(wǎng)絡(luò)中的交換設(shè)備,一般存在多個以太網(wǎng)口,同時在大型網(wǎng)絡(luò)中也可能會存在單點鏈路帶寬瓶頸,例如Web服務(wù)器,同一時間可能會有上千萬的訪問量,單個接口無法滿足這么大的吞吐量。LACP可以利用這些接口聚合為一個更大帶寬的邏輯接口,同時可以實現(xiàn)鏈路的容錯性,當(dāng)聚合端口中的一條或幾條鏈路故障,仍能保證鏈路的連通性。
如何將傳統(tǒng)網(wǎng)絡(luò)架構(gòu)遷移至新的軟件定義網(wǎng)絡(luò)架構(gòu)中去,一直是近些年來討論研究的熱點。本文就嘗試探索如何傳統(tǒng)的網(wǎng)絡(luò)架構(gòu)中的鏈路聚合遷移至新的軟件定義網(wǎng)絡(luò)架構(gòu)中。本文通過SDN方式基于Ryu控制器(SDN開源控制器)研究和實現(xiàn)LACP功能,使得LACP協(xié)議可以在軟件定義網(wǎng)絡(luò)環(huán)境中實現(xiàn)。
依據(jù)IEEE的802.1ax協(xié)議標(biāo)準(zhǔn)并基于Ryu控制器平臺,設(shè)計交換模塊、LACP解析與封裝模塊、LACP處理邏輯模塊。
本系統(tǒng)是基于Ryu控制器的,Ryu控制器是基于事件機制的,每個OpenFlow消息在進入到Ryu控制器后,都會被封裝成一個事件;每個應(yīng)用在加載時,主動向Ryu控制器注冊在某個通信階段,自己期望的處理事件。
本系統(tǒng)注冊事件列表如下:
● ofp_event.EventOFPSwitchFeatures,CONFIG_DISPATCHER
●lacplib.EventPacketIn,MAIN_DISPATCHER
●lacplib.EventSlaveStateChanged,MAIN_DISPATCHER
●ofp_event.EventOFPPacketIn,MAIN_DISPATCH?ER
●ofp_event.EventOFPFlowRemoved,MAIN_DISPATCHER
在Ryu控制器中,通信階段分為以下四個:
●HANDSHAKE_DISPATCHER:連接建立階段,交換Hello信息
●CONFIG_DISPATCHER:等待接收交換機特性階段
●MAIN_DISPATCHER:正常通信階段
●DEAD_DISPATCHER:連接斷開階段
程序可以指定在某個階段,來處理相應(yīng)的事件,當(dāng)在其他非指定階段出現(xiàn)注冊事件,則不會觸發(fā)相應(yīng)方法執(zhí)行。
當(dāng)相應(yīng)的OpenFlow消息到達Ryu控制器,控制器的事件調(diào)度器會根據(jù)應(yīng)用的注冊的事件類型,來調(diào)用對應(yīng)的方法,對事件進行處理。
本系統(tǒng)分為LACP解析與封裝模塊,LACP處理邏輯模塊、交換模塊。模塊之間彼此獨立,通過Ryu事件調(diào)度器,完成彼此之間的協(xié)作。LACP處理模塊位于Ryu事件處理中最頂層,最原始的packet-in數(shù)據(jù)包首先會觸發(fā)它的處理,以執(zhí)行與LACP相關(guān)的功能;在對原始的pack-in事件進行過濾后,將不包含LACP信息的packet-in事件重新發(fā)回到Ryu控制器系統(tǒng)中,以觸發(fā)交換模塊處理。在LACP處理邏輯模塊中,會使用LACP解析封裝模塊,來將原始的字節(jié)流轉(zhuǎn)換為可以處理的信息,同時將處理的結(jié)果序列化為可以在網(wǎng)絡(luò)中傳輸?shù)腖ACP協(xié)議數(shù)據(jù)包字節(jié)流。而交換模塊則單純處理與MAC尋址相關(guān)的功能。LACP處理邏輯模塊和交換模塊彼此之間是解耦,它們之間的通過Ryu控制器進行協(xié)作。事件之間關(guān)系如圖1所示。
圖1 事件邏輯
作為交換模塊,主要實現(xiàn)學(xué)習(xí)MAC地址,并根據(jù)學(xué)習(xí)到的信息進行數(shù)據(jù)包的轉(zhuǎn)發(fā),當(dāng)有端口的LACP狀態(tài)變化的事件時,清理與LACP端口相關(guān)的流表信息。因為,為了實現(xiàn)LACP功能,控制器是通過流表來控制交換機的轉(zhuǎn)發(fā)行為,所以當(dāng)相應(yīng)接口失效,或者接口重新加入聚合組,需要清空與之相關(guān)的流表,重新建立新的轉(zhuǎn)發(fā)方式。交換模塊處理邏輯如圖2。
交換模塊注冊對以下三個事件監(jiān)聽入口:
●ofp_event.EventOFPSwitchFeatures
●lacplib.EventPacketIn
●lacplib.EventSlaveStateChanged
事件ofp_event.EventOFPSwitchFeatures會在連接建立階段,完成對tablemiss流表添加,以完成MAC地址的學(xué)習(xí)。事件lacplib.EventPacketIn會在正常通信階段,處理經(jīng)過LACP模塊過濾后的packet-in事件,這些事件經(jīng)過過濾后,所有的packet-in事件只會與數(shù)據(jù)包的交換有關(guān),屏蔽的與LACP的聯(lián)系,減少了LACP模塊與交換模塊之間的耦合性。事件lacplib.Event?SlaveStateChanged會在正常通信階段,處理交換機中端口狀態(tài)變化(從非LACP狀態(tài)到LACP狀態(tài),或LACP狀態(tài)失效),完成對交換機內(nèi)的流表清理初始化工作。
圖2 交換模塊處理邏輯
由于在網(wǎng)絡(luò)中傳輸?shù)腖ACP數(shù)據(jù)包都是字節(jié)流,無法直接處理,所以根據(jù)IEEE 802.1ax協(xié)議標(biāo)準(zhǔn),并借助程序開發(fā)語言Python中的struct模塊來設(shè)計解析與封裝模塊,將原始LACP字節(jié)流的解析成可以處理的信息,以及將處理好的數(shù)據(jù)封裝為可以在網(wǎng)絡(luò)中傳輸?shù)淖止?jié)流。此模塊用于協(xié)助LACP模塊對協(xié)議的處理。
在解析數(shù)據(jù)包時,當(dāng)LACP模塊調(diào)用本模塊解析協(xié)議的原始數(shù)據(jù)時,會調(diào)用struct模塊中的struct.un?pack_from,根據(jù)LACP協(xié)議字段值順序以及大小,以偏移量作為參數(shù)將原始的字節(jié)流解碼為可以處理的信息。主要解析的關(guān)鍵字表1所示。同樣在封裝數(shù)據(jù)包,使用struct模塊中的pack方法,根據(jù)LACP協(xié)議字段順序進行組裝,得到一個可以直接發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)包。
表1 LACP協(xié)議關(guān)鍵字段值
作為在Ryu平臺實現(xiàn)鏈路聚合控制協(xié)議,主要是通過控制actor_state字段值,來與對端交互。本系統(tǒng)主要就是根據(jù)此字段值來實現(xiàn)鏈路的聚合。actor_state為一字節(jié),8個比特位,每個位對應(yīng)的含義如表2。
●LACP_Activity:標(biāo)志LACP活動狀態(tài),主動為1,被動為0。
●LACP_Timeout:標(biāo)志鏈路超時時間控制值,Short Timeout為 1,Long Timeout為 0。
●Aggregation:如果標(biāo)志值為1,則系統(tǒng)認為這個鏈路為可聚合;如果為0,則這個鏈路為獨立的。
●Synchronization:如果值為1,系統(tǒng)認為這個鏈路是IN_SYNC狀態(tài),即這個鏈路已經(jīng)分配給合適的鏈路聚合組,這個組已經(jīng)與兼容的鏈路聚合相關(guān)聯(lián);為0表示為OUT_OF_SYNC,表示該鏈路未在聚合態(tài)。
●Collecting:如果值為1,在這條鏈路聚集傳入的幀為enabled狀態(tài),即在沒有管理性更改,或接收消息更該的情況下,不會被禁用;否則為0。
●Distributing:如果值為0,在這條鏈路上分發(fā)傳出的幀為enabled狀態(tài),即 在沒有管理性更改,或接收消息更該的情況下不會被禁用;否則為0。
●Defaulted:如果值為1,標(biāo)志表示本端的接收計算機正在使用默認的運行對端信息,這些信息是為對端管理配置的;如果為0,已在LACPDU中收到正在使用的運行對端信息。
●Expired:如果值為1,表示本端的接收機是過期狀態(tài);如果為0,本端接收機為過期。
當(dāng)有關(guān)于LACP的packet-in事件觸發(fā)時,Ryu控制器會調(diào)用這個模塊進行處理。處理邏輯關(guān)系見圖3。同時控制器中維護一個綁定信息狀態(tài)變量bond,以記錄不同交換機不同端口LACP狀態(tài)信息(是否啟用LACP,超時時間)。
首先根據(jù)事件中的信息,在bond中查看接收此LACP數(shù)據(jù)包的交換機端口的狀態(tài),來判定這個端口是否啟用了LACP;若對應(yīng)端口未啟用LACP,則將此接口啟用,并向 Ryu控制器發(fā)送 lacplib.EventSlaveStat?eChanged事件,以通告端口的狀態(tài)改變。
表2 actor_state控制字段
接著,依據(jù)數(shù)據(jù)包中的LACP超時時間類型為SHORT_TIMEOUT_TIME或者 LONG_TIMEOUT_TIME,來設(shè)置流表的超時時間。因為作為被動端,交換機會根據(jù)流表的超時時間自動調(diào)整端口的狀態(tài)。當(dāng)流表的超時時間達到,但仍未收到主動端的LACP數(shù)據(jù)包,以更新超時計時器,則表示LACP超時時間到達,交換機會主動刪除這條超時的流表,并向控制器發(fā)送ofp_event.EventOFPFlowRemoved流表移除消息,在控制器收到此條消息會主動更新控制器中保存的綁定信息,并清除交換機內(nèi)與該端口相關(guān)的LACP流表信息。以此,來自動完成與主動端鏈路狀態(tài)保持。
然后,根據(jù)LACP超時時間,來判斷超時時間是否變化,如果變化需要修改控制器中保存的綁定狀態(tài)信息,并下發(fā)指令,修改交換機內(nèi)相應(yīng)LACP流表的超時時間。
最后,作為對packet-in消息回復(fù),構(gòu)造響應(yīng)LACP數(shù)據(jù)包,通過packet-out消息發(fā)送響應(yīng)信息給主動端,以完成和主動端的交互。
圖3 LACP處理邏輯
LACP模塊包含的關(guān)鍵方法:
●do_lacp:LACP 處理
●_create_response:創(chuàng)建回應(yīng)數(shù)據(jù)包,并序列化
●_create_lacp:構(gòu)造LACP響應(yīng)數(shù)據(jù)包
●_get_slave_enabled:獲取端口的LACP狀態(tài)
●_set_slave_enabled:設(shè)置LACP狀態(tài)
●_get_slave_timeout:獲取端口的超時時間信息
●_set_slave_timeout:設(shè)置端口的超時時間信息
本實驗通過仿真工具Mininet構(gòu)建一個具有一個OpenFlow交換機,四臺主機網(wǎng)絡(luò),其中主機h1與交換機之間有兩條網(wǎng)絡(luò)連接線。如圖4所示。
圖4 實驗拓撲
完成后,如圖5看到邏輯接口bond0為MASTER,物理接口h1-eth0和h1-eth1為SLAVE。
圖5 h1最終配置結(jié)果
執(zhí)行程序,在終端中有一下信息輸出,如圖6??梢钥闯鯨ACP起用,被動端的接口也已經(jīng)UP,timeout事件從默認的0秒變?yōu)長ONG_TIMEOUT_TIME,即90秒。lacp的響應(yīng)數(shù)據(jù)包被發(fā)送出去。在最后輸出信息:“slave state changed port:2 enabled:True”表示應(yīng)用接收到了EventSlaveStateChanged事件。
圖6 程序執(zhí)行輸出
控制器端的輸出如圖7。
圖7 控制器終端輸入信息
檢查流表,如圖8,可以看出:在當(dāng)LACP數(shù)據(jù)包(類型為0x8809)從h1的eth1接口被發(fā)送(進入端口為 s1-eth2,mac 地址為 00:00:00:00:00:12),packet-in消息被發(fā)送;在當(dāng)lacp數(shù)據(jù)包從h1的eth0接口被發(fā)送出去時,packet-in消息被發(fā)送出去;同時還包含一條table-miss流表項。
圖8 流表信息
首先驗證鏈路可以改進鏈接速度,將去往h1的流量分布到兩個鏈路上。
首先執(zhí)行,h2 ping h1如圖9。
圖9
當(dāng)繼續(xù)發(fā)送ping,檢查OpenFlow交換機的流表信息,如圖10,相比剛開始,添加了兩條流表項。從這可以看出,S1-eth 1被用于h2和h1的通信。
圖10
接著從h3 ping h1,結(jié)果如圖11。
圖11
在OpenFlow交換機中可以看到如圖12,可以看出又添加了兩條流表項,但是參數(shù)duration的值比較小。由此可以得知,交換機的eth 2接口用于h3和h1通信。
圖12
同樣在從h4到h1執(zhí)行ping測試??梢缘玫饺绫?的端口使用表。
表3
由此得出,兩條鏈路都為H1通信服務(wù)。鏈路聚聚合用成功。
驗證可以實現(xiàn),數(shù)據(jù)鏈路的容錯性。當(dāng)前狀態(tài)是,當(dāng)從h2和h4與h1通信,交換機的端口eth 2被使用,當(dāng)從h3與h1通信,eth1被使用。將交換機的eth 1從聚合鏈路中移除。由于H1的eth 0停止,h3與h1無法通過ping測試,當(dāng)經(jīng)過90秒后,新的消息日志會出現(xiàn),如圖13。
圖13
可以看出超時時間到達,斷開的接口的所有學(xué)習(xí)的MAC地址和流表項都會刪除,回到初始狀態(tài)。如果有新的通信活動在h1和h3之間,存在的聚合鏈路會學(xué)習(xí)新的MAC地址,注冊新的流表項。如圖14。
圖14
之前的無法ping測試,現(xiàn)在恢復(fù),如圖15。
圖15
由此可以看出,即使某些鏈路出現(xiàn)問題,仍然能夠?qū)崿F(xiàn)通信,實現(xiàn)了容錯性。
本文根據(jù)OpenFlow協(xié)議,以及鏈路聚合控制協(xié)議LACP,在基于Ryu框架中,探索如何將鏈路聚合在軟件定義網(wǎng)絡(luò)環(huán)境中實現(xiàn)。從本實驗可以看出軟件定義網(wǎng)絡(luò)的優(yōu)勢:不用接觸底層設(shè)備,可以用過中心控制器來管控網(wǎng)絡(luò),為網(wǎng)絡(luò)管理帶來便利性;快捷的部署,對于新的技術(shù)協(xié)議,在傳統(tǒng)的環(huán)境中去驗證十分困難,但在SDN環(huán)境中,屏蔽底層細節(jié),通過統(tǒng)一的流表樣式來控制交換機的數(shù)據(jù)包轉(zhuǎn)發(fā)行為,為以后的網(wǎng)絡(luò)發(fā)展與技術(shù)革新帶來新的動力。本設(shè)計在一定程度上實現(xiàn)了鏈路聚合控制協(xié)議,但并未實現(xiàn)主動式的,交換機只作為一種被動式角色。今后的研究可以嘗試,設(shè)計一套完整的LACP協(xié)議的實現(xiàn)。