實驗目的
- 掌握多數據中心網絡拓撲的構建
- 掌握多數據中心數據交換過程
實驗原理
主機間發送消息上報給交換機,交換機對收到的報文信息進行分析判斷,如果交換機中存在此消息相對應的流表,則交換機直接下發流表,將報文消息轉發給目的主機;如果交換機中沒有相對應的流表,交換機將此發送消息給控制器,控制器根據消息分析關鍵字段內容,進行流表下發決策,交換機再將消息發送給目的主機,實現主機間通信的目的。
實驗任務
創建一個虛擬網絡,虛網中包括一台floodlight虛擬機和Mininet虛擬機,使用Mininet設計模擬一個多數據中心網絡,主要是用Mininet中的OpenFlow交換機和floodlight控制器進行測試,幫助在真實數據中心和仿真測試床數據中心提供有用的信息評估不同數據中心的網絡應用性能。
一個簡單的基於兩個數據中心的網絡拓撲,如下圖所示:

圖中c1和c2為核心交換機,a1-a4為聚合交換機,e1-e4為邊緣交換機,h1-h8為主機。本實驗主要測試及驗證交換機下掛主機間的連通性以及主機間通信收發數據包的速度。Mininet中自帶的iperf性能測試工具可以測試不同主機間通信的性能帶寬質量,在此例中,主要是對相同邊緣交換機下的主機間、相同聚合交換機下不同邊緣交換機間、相同核心交換機不同聚合交換機下的主機間進行測試。
實驗內容
啟動Floodlight
之前已經安裝過floodlight,是通過java來啟動。
1 java -jar targer/floodlight.jar
然后終端會出現一大堆的信息,然后打開瀏覽器,輸入http://localhost:8080/ui/index.html(這里我在本地,依然localhost使用127.0.0.1) 得到下圖:

創建數據中心
在mininet目錄中,創建一個fattree.py的測試腳本,
關於fattree(胖樹拓撲結構)
該拓撲網絡分為三個層次:如之前的圖,自下而上分別為邊緣層(edge),匯聚層(aggregate)以及核心層(core),其中匯聚層交換機與邊緣層交換機構成一個pod(一種數據結構)。該實驗的fattree拓撲為一個二叉胖樹。
mininet腳本
1 #!/usr/bin/python 2 # 創建網絡拓撲 3 """Custom topology example 4 Adding the 'topos' dict with a key/value pair to generate our newly defined 5 topology enables one to pass in '--topo=mytopo' from the command line. 6 """ 7 8 from mininet.topo import Topo 9 from mininet.net import Mininet 10 from mininet.node import RemoteController, CPULimitedHost 11 from mininet.link import TCLink 12 from mininet.util import dumpNodeConnections 13 14 15 class MyTopo(Topo): 16 "Simple topology example." 17 18 def __init__(self): 19 "Create custom topo." 20 21 # Initialize topology 22 Topo.__init__(self) 23 L1 = 2 24 L2 = L1 * 2 25 L3 = L2 26 c = [] 27 a = [] 28 e = [] 29 30 # add core ovs 31 for i in range(L1): 32 sw = self.addSwitch('c{}'.format(i + 1)) 33 c.append(sw) 34 35 # add aggregation ovs 36 for i in range(L2): 37 sw = self.addSwitch('a{}'.format(L1 + i + 1)) 38 a.append(sw) 39 40 # add edge ovs 41 for i in range(L3): 42 sw = self.addSwitch('e{}'.format(L1 + L2 + i + 1)) 43 e.append(sw) 44 45 # add links between core and aggregation ovs 46 for i in range(L1): 47 sw1 = c[i] 48 for sw2 in a[i // 2::L1 // 2]: 49 self.addLink(sw2, sw1) 50 51 # add links between aggregation and edge ovs 52 for i in range(0, L2, 2): 53 for sw1 in a[i:i + 2]: 54 for sw2 in e[i:i + 2]: 55 self.addLink(sw2, sw1) 56 57 # add hosts and its links with edge ovs 58 count = 1 59 for sw1 in e: 60 for i in range(2): 61 host = self.addHost('h{}'.format(count)) 62 self.addLink(sw1, host) 63 count += 1 64 65 topos = {'mytopo': (lambda: MyTopo())}
原sdnlab上的代碼有一些問題,首先先調整好原本代碼的tab縮進的問題。原sdnlab上的代碼運行完會報錯:

對於該問題,是由於使用python進行矩陣操作,分片操作時候,內部含有除法,產生錯誤。例如:
1 for sw2 in a[i / 2::L1 / 2]:
利用/自動產生的類型是浮點型,會出現上述的錯誤,將/改成//就可以解決問題。
1 for sw2 in a[i // 2::L1 // 2]:
修改完腳本問題之后用命令:
1 sudo mn --custom ~/fattree.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6633
請根據實際情況將ip為floodlight所在服務器的ip,添加protocols參數指定OpenFlow協議版本。 mn為mininet啟動命令。
- --mac指定虛擬主機的mac地址順序編號,若不帶此參數則隨機編號
- --controller指定of交換機的控制器
- --switch指定虛擬交換機的類型,ovsk表示虛擬交換機為ovs Kernel mode
- --custom指定自定義拓撲文件
- --topo指定加載拓撲的名字

連通性以及通信帶寬測試
1.測試同一交換機內部主機間的寬帶

2.測試相同匯聚交換機下不同邊緣交換機的主機間測試

3.測試相同核心交換機下不同匯聚交換機下的主機間測試

4.測試所有主機的連通性驗證和寬帶測試
添加下列代碼進腳本
1 #在開頭補充 2 from mininet.log import setLogLevel 3 #測試連通性代碼部分 4 def simpleTest(): 5 "Create and test a simple network" 6 topo = MyTopo() 7 net = Mininet( topo, controller=None, host=CPULimitedHost, link=TCLink ) 8 net.addController( 'c0', controller=RemoteController, ip='127.0.0.1', port=6633 ) 9 net.start() 10 print ("Dumping host connections") 11 dumpNodeConnections(net.hosts ) 12 print ("Testing network connectivity") 13 net.pingAll() 14 print ("Testing bandwidth between h1 with h2, h3, h5") 15 h1, h2 = net.get( 'h1', 'h2' ) 16 net.iperf( ( h1, h2 ) ) 17 h1, h3 = net.get( 'h1', 'h3' ) 18 net.iperf( ( h1, h3 ) ) 19 h1, h5 = net.get( 'h1', 'h5' ) 20 net.iperf( ( h1, h5 ) ) 21 net.stop() 22 23 if __name__ == '__main__': 24 # Tellmininet to print useful information 25 setLogLevel( 'info' ) 26 simpleTest()
在floodlight web頁面中查看網絡拓撲信息


