王德強(qiáng)+王敢甫
摘要:相較于傳統(tǒng)網(wǎng)絡(luò)體系結(jié)構(gòu)的僵化,軟件定義網(wǎng)絡(luò)(Software Defined Networking,SDN)架構(gòu)可以更好地適應(yīng)與滿足當(dāng)前復(fù)雜多變的網(wǎng)絡(luò)需求。以采用胖樹(shù)(Fat-tree)拓?fù)涞臄?shù)據(jù)中心網(wǎng)絡(luò)為例,介紹如何采用SDN網(wǎng)絡(luò)仿真軟件
Mininet方便而快捷地部署SDN仿真環(huán)境,調(diào)整鏈路性能??蔀閿?shù)據(jù)中心的管理與部署提供參考,有利于簡(jiǎn)化數(shù)據(jù)中心網(wǎng)絡(luò)的工作,加速應(yīng)用上線。
關(guān)鍵詞:軟件定義網(wǎng)絡(luò);網(wǎng)絡(luò)仿真;胖樹(shù)拓?fù)洌粩?shù)據(jù)中心;鏈路性能
0 引言
軟件定義網(wǎng)絡(luò)(Software Defined Networking,SDN) 因其對(duì)僵化網(wǎng)絡(luò)結(jié)構(gòu)的解綁,可以簡(jiǎn)化網(wǎng)絡(luò)部署與管理,有利于網(wǎng)絡(luò)快速適應(yīng)生產(chǎn)生活需求,從而快速地從理論進(jìn)入實(shí)踐。SDN概念白提出后,開(kāi)始在如數(shù)據(jù)中心、廣域網(wǎng)的部署升級(jí)中大量應(yīng)用。同時(shí),SDN網(wǎng)絡(luò)也被科研、生產(chǎn)工作者廣泛實(shí)驗(yàn)研究。然而一個(gè)完整的SDN網(wǎng)絡(luò)至少需要控制器、OpenFlow交換機(jī)、終端結(jié)點(diǎn)等設(shè)備來(lái)構(gòu)建,超出了大部分研究工作者所具備的實(shí)驗(yàn)條件。對(duì)此,如OpenNet、NS3、Mininet等仿真軟件可以幫助研究者方便、快速地使用筆記本電腦等工具構(gòu)建一個(gè)SDN網(wǎng)絡(luò)仿真平臺(tái),并進(jìn)行技術(shù)方案、功能擴(kuò)展的驗(yàn)證。
Mininet的操作與拓?fù)浣⑾鄬?duì)方便,所建立拓?fù)涞慕K端結(jié)點(diǎn)、交換機(jī)與調(diào)用的相關(guān)應(yīng)用均由源碼運(yùn)行支持,仿真度較高,實(shí)驗(yàn)結(jié)果可以直接移植到實(shí)際環(huán)境。此外,Mininet對(duì)于基于OpenFlow協(xié)}義的SDN網(wǎng)絡(luò)支持較好,適合于單機(jī)上建立SDN網(wǎng)絡(luò)仿真。
數(shù)據(jù)中心是對(duì)SDN應(yīng)用較快較廣泛的地方,其最迫切地需求是為服務(wù)器群組提供高效的雙向帶寬互聯(lián),通常采用層次性多根網(wǎng)絡(luò)拓?fù)洌渲信謽?shù)(Fat-tree)結(jié)構(gòu)因其簡(jiǎn)單易用而得到廣泛應(yīng)用。本文使用Mininet作為仿真T具,基于此構(gòu)建如Top02的胖樹(shù)結(jié)構(gòu)的SDN網(wǎng)絡(luò)進(jìn)行仿真。
1 使用Mininet創(chuàng)建拓?fù)?/p>
使用Mininet創(chuàng)建拓?fù)溆芯帉懩_本創(chuàng)建拓?fù)浠蚴褂胢iniedit 工具創(chuàng)建拓?fù)鋬煞N常用方式。通過(guò)編寫腳本創(chuàng)建拓?fù)淇梢詫?shí)現(xiàn)更加精細(xì)的拓?fù)涠x與自動(dòng)化測(cè)試等功能;使用miniedit工具創(chuàng)建拓?fù)鋭t可以通過(guò)視圖,更加直觀地創(chuàng)建網(wǎng)絡(luò)拓?fù)洌⒖梢栽趯?dǎo)出的拓?fù)淠_本中添加命令,進(jìn)一步精細(xì)化拓?fù)涠x。
1.1 編寫腳本建立拓?fù)?/p>
通過(guò)編寫腳本創(chuàng)建拓?fù)涫亲畛R?jiàn)的拓?fù)浯罱ǚ绞?。Mininet常使用Python語(yǔ)言編寫拓?fù)淠_本,表l給出了在編寫腳本過(guò)程中會(huì)使用到的主要類:
除此之外,還有如記錄日志的setLogLevel、info等類。若需要在腳本中調(diào)用終端命令,還需要導(dǎo)入call類。
導(dǎo)入合適的類后即可白定義拓?fù)?,包括添加組件與建立連接。需要添加的組件包括終端結(jié)點(diǎn)、OpenFlow交換機(jī)、控制器等。在根據(jù)自身需求定義好拓?fù)浜螅{(diào)用CLI以便調(diào)試。例如,建立圖l中的網(wǎng)絡(luò)拓?fù)?,所編寫的Python腳本如圖2。
Topol定義了包含一臺(tái)控制器controller,兩臺(tái)OpenFlow交換機(jī)sl、s2,兩臺(tái)終端主機(jī)hl、h2的SDN網(wǎng)絡(luò)。腳本運(yùn)行后將自動(dòng)創(chuàng)建topol的拓?fù)洌⒃趧?chuàng)建完成后開(kāi)啟CLI以輸入調(diào)試命令。在當(dāng)前腳本基礎(chǔ)上,用戶可以在腳本中進(jìn)一步根據(jù)自身需求精細(xì)化定義拓?fù)?,提高仿真結(jié)果精度。
除了直接編寫腳本定義拓?fù)涞姆绞?,用戶還可以使用Mininet所提供的可視化工具miniedit來(lái)更直觀的、便捷地建立拓?fù)洹?/p>
1.2使用miniedit創(chuàng)建拓?fù)?/p>
miniedit是Mininet2.2.0版本起內(nèi)置的一個(gè)可視化工具,位于安裝目錄下/mininet/examples/miniedit.py。用戶可以使用miniedit工具,通過(guò)拖拽圖標(biāo)的方式搭建拓?fù)洌⒃谕ㄟ^(guò)運(yùn)行測(cè)試后導(dǎo)出該拓?fù)涞哪_本。
在創(chuàng)建拓?fù)涞倪^(guò)程中,還可以通過(guò)圖標(biāo)→右鍵→Properties來(lái)設(shè)置組件的屬性,如控制器類型、交換機(jī)類型、終端結(jié)點(diǎn)IP、鏈路帶寬等。如果需要使用到外部控制器,則控制器的Properties設(shè)置控制器類型為Remote Controller,并填寫對(duì)應(yīng)端口。完成拓?fù)浯罱ê笤贓dit→Perferences中選擇是否調(diào)用CLI,所使用的OpenFlow版本等。
完成以上設(shè)置后即可運(yùn)行拓?fù)湟詼y(cè)試拓?fù)涞拇罱ㄇ闆r。在運(yùn)行后若沒(méi)有問(wèn)題,可通過(guò)File-> Export Leve12Script導(dǎo)出所搭建拓?fù)涞哪_本。相較于直接編寫腳本白定義拓?fù)?,miniedit這個(gè)可視化工具更加的直觀、便捷,提供的屬性設(shè)置也較豐富,可以滿足實(shí)驗(yàn)的通用需求。當(dāng)然,研究者也可以通過(guò)修改導(dǎo)出的腳本以及Mininet相關(guān)模塊實(shí)現(xiàn)更精細(xì)的拓?fù)浯罱ㄅc更豐富的拓?fù)涔δ堋?/p>
2 鏈路性能測(cè)試
2.1測(cè)試環(huán)境、工具與拓?fù)湓谕負(fù)鋭?chuàng)建完成后,可以使用相關(guān)工具進(jìn)行鏈路性能的測(cè)試,以驗(yàn)證所構(gòu)建的仿真環(huán)境是否符合設(shè)定。測(cè)試可以使用ping驗(yàn)證拓?fù)溥B通性,使用iperf測(cè)試帶寬是否符合預(yù)設(shè)。
性能測(cè)試過(guò)程可以在拓?fù)浣⒑笳{(diào)用CLI,通過(guò)CLI接口手工測(cè)試;也可以將測(cè)試過(guò)程寫入腳本中,自動(dòng)運(yùn)行出結(jié)果。需要注意的是,在拓?fù)鋭偨r(shí),由于控制器的流表來(lái)不及下發(fā),可能會(huì)出現(xiàn)部分終端結(jié)點(diǎn)ping不通;而iperf測(cè)帶寬的過(guò)程中,也會(huì)因QoS限制等原因出現(xiàn)帶寬測(cè)試不準(zhǔn)確或達(dá)不到所要需求的情況。因此,對(duì)于拓?fù)湫阅艿臏y(cè)試最好是在流表下發(fā)之后進(jìn)行。
這里,本文構(gòu)建了一個(gè)4層次4端口交換機(jī)胖樹(shù)拓?fù)洌▓D3),并進(jìn)行網(wǎng)絡(luò)性能測(cè)試演示。仿真實(shí)驗(yàn)環(huán)境在虛擬機(jī)上構(gòu)建,在VMware上創(chuàng)建一臺(tái)Ubuntu虛擬機(jī),并安裝SDN控制器與Mininet仿真軟件。具體配置如表2、3:
2.2 測(cè)試過(guò)程與結(jié)果endprint
2.2.1 連通性測(cè)試
在拓?fù)浣⒊晒?,可以通過(guò)CLI或者白動(dòng)化測(cè)試來(lái)調(diào)用pingall測(cè)試拓?fù)溥B通性。在控制器與OpenFlow交換機(jī)建立連接后,控制器將會(huì)默認(rèn)學(xué)習(xí)拓?fù)?,并隨后響應(yīng)OpenFlow交換機(jī)的詢問(wèn),下發(fā)相應(yīng)流表。但在拓?fù)鋭偨⑼戤厱r(shí),由于控制器對(duì)拓?fù)涞膶W(xué)習(xí)與流表下發(fā)處理較慢,會(huì)出現(xiàn)部分結(jié)點(diǎn)ping不同的現(xiàn)象。對(duì)此,可以在ping測(cè)試前下發(fā)流表,以避免ping不同與鏈路帶寬測(cè)試不準(zhǔn)確的情況。連通性測(cè)試結(jié)果如圖4,在控制器中顯示拓?fù)湫Ч鐖D5。在設(shè)計(jì)鏈路結(jié)點(diǎn)全部ping通后,即可進(jìn)行帶寬測(cè)試。
2.2.2 寬帶性能測(cè)試
帶寬性能測(cè)試的目的在于調(diào)整拓?fù)涞膸捫阅?,讓仿真的帶寬性能盡可能符合設(shè)定值。帶寬的設(shè)置可以在Mininet建立拓?fù)涞倪^(guò)程中設(shè)置,如在miniedit中對(duì)新添加的鏈路設(shè)置右鍵→Properties→Bandwidth.或者在腳本中添加鏈接時(shí)使用如下代碼設(shè)置鏈路:
h/s/={bw:10}
net.add Link(h1,sl,cls= TCLink,**hlsl)
其中{'bw:10}中的10為設(shè)置的帶寬,單位Mbps,這樣就可以設(shè)置鏈路hl-sl的帶寬。除此之外,還可以在拓?fù)浣⒊晒?,通過(guò)更改OpenFlow交換機(jī)的QoS來(lái)限速。但以上方法受限于Mininet仿真對(duì)鏈路轉(zhuǎn)發(fā)的支持不夠,并不能很準(zhǔn)確的達(dá)到設(shè)置的帶寬值,尤其是設(shè)置的帶寬較大,如超過(guò)50Mbps時(shí)。因此,在拓?fù)浣⒑笫褂胕perf來(lái)測(cè)試帶寬是否符合預(yù)期并做調(diào)整就很有必要。
以圖3所示胖樹(shù)拓?fù)錇槔?,分別測(cè)試主機(jī)hl與h2、h3、h5之間的鏈路帶寬。按照下發(fā)的流表,這三條鏈路將分別最高接入層、匯聚層、核心層,通過(guò)交換機(jī)的數(shù)量為l、3、5臺(tái)。其鏈路帶寬測(cè)試結(jié)果如表4。
這里,實(shí)驗(yàn)平臺(tái)分配了充足的CPU資源,使用了較大內(nèi)存與固態(tài)硬盤,測(cè)試帶寬未加限制,為極限帶寬。因此,所測(cè)出的帶寬較大,達(dá)到了30Gbps。而在不同硬件環(huán)境下的實(shí)驗(yàn)平臺(tái)所能達(dá)到的極限速度也會(huì)有所差異,且因硬件差異,所測(cè)極限速度也會(huì)相差較大。對(duì)于仿真而言,這里所測(cè)得的極限速度意義不大,重要的是可以設(shè)置帶寬為所需要的值。如在腳本中設(shè)置以上三條鏈路帶寬為lOOMbps,測(cè)得結(jié)果如圖6,與設(shè)計(jì)的帶寬性能有仍有15%左右差距,。需要調(diào)整設(shè)置帶寬為115Mbps時(shí),其帶寬性能才與設(shè)計(jì)值接近,如圖7。
此外.由表4可以看出鏈路帶寬隨著鏈路通過(guò)交換機(jī)數(shù)量的增多而下降,但由于同處一個(gè)網(wǎng)段,不需跨網(wǎng)傳輸,因此波動(dòng)不大。若需要使用UDP協(xié)議測(cè)試帶寬,由于iperf對(duì)于UDP協(xié)議萬(wàn)兆網(wǎng)卡的支持不好,需要使用iperB來(lái)進(jìn)行測(cè)試。使用iperf測(cè)試帶寬時(shí)可以看到設(shè)定參數(shù)下的一些性能指標(biāo),如使用TCP協(xié)議測(cè)試帶寬時(shí)的重傳數(shù),使用UDP協(xié)議測(cè)試帶寬時(shí)的丟包率等,可以作為進(jìn)一步細(xì)化鏈路性能的指標(biāo)使用。
2.3 自動(dòng)化測(cè)試
如果要編寫腳本自動(dòng)化測(cè)試,可以在腳本中調(diào)用以下命令來(lái)實(shí)現(xiàn):
(1)下發(fā)流表:
在腳本中下發(fā)指定流表需要從subprocess模塊導(dǎo)入call類,調(diào)用格式如下:
call(["ovs命令行工具","操作","交換機(jī)名","流表"
如為交換機(jī)sl添加一條流表:
call(["ovs-ofctl","add-flow","sl","piiorily=20,dl src=
00:00:00:00:00:01,actions=output:3"])
(2) Ping測(cè)試:
調(diào)用格式:
net.pingAll()或net.ping([測(cè)試主機(jī)列表])
(3)帶寬測(cè)試:
調(diào)用格式:
net.iperf([測(cè)試主機(jī)列表],'協(xié)議','帶寬',
'測(cè)試時(shí)長(zhǎng)','端口')
如使用UDP協(xié)議,1000M帶寬測(cè)試hl與h5之間的帶寬:
net.iperf ([hl,h5],'UDP','100M') 以上命令需要在拓?fù)浣⒑蟮拇a段中調(diào)用,若在腳本中下發(fā)相應(yīng)流表后,ping測(cè)試與iperf測(cè)試將能更快進(jìn)行,結(jié)果也更準(zhǔn)確。
3 小結(jié)
本文通過(guò)實(shí)例介紹了如何使用Mininet快速便捷地創(chuàng)建SDN網(wǎng)絡(luò)拓?fù)?,并?duì)所創(chuàng)建SDN網(wǎng)絡(luò)進(jìn)行性能測(cè)試與調(diào)整設(shè)置,以更貼近實(shí)驗(yàn)設(shè)計(jì)環(huán)境。在此基礎(chǔ)上,研究者可以對(duì)控制器策略模塊等進(jìn)行修改以測(cè)試方案正確性,也可測(cè)試SDN環(huán)境下各類應(yīng)用的性能和可行性。雖然Mininet對(duì)帶寬的限制仍難以做到準(zhǔn)確,但能降低對(duì)研究者實(shí)驗(yàn)環(huán)境的要求,因此,使用Mininet有利于SDN技術(shù)的發(fā)展與推廣。endprint