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