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