Mininet系列實驗(七):Mininet腳本實現控制交換機行為


1 實驗目的

  • 熟悉Mininet自定義拓撲腳本的編寫;
  • 掌握使用“ovs-vsctl”命令直接控制Open vSwitch。

2 實驗原理

在SDN環境中,控制器可以通過對交換機下發流表操作來控制交換機的轉發行為。在本實驗中,使用Mininet基於python的腳本,調用“ovs-vsctl”命令直接控制Open vSwitch。

3 實驗任務

本實驗在基於Mininet腳本的不同拓撲環境下使用OpenDaylight控制交換機行為。任務一:一台交換機兩台主機,從1端口進入的數據流轉發到2端口,從2端口進入的數據流轉發到1端口;任務二:兩台交換機兩台主機,主機0連接交換機0,主機1連接交換機1,交換機0連接交換機1,數據轉發端口同任務一;任務三:與任務二類似,但是在創建link的時候,設置帶寬、延遲以及丟包率。

任務一:一台交換機兩台主機,實現從1端口進入的數據流轉發到2端口,從2端口進入的數據流轉發到1端口。

還是那個流程:

打開mininet文件夾——創建mymininet1.py——編輯腳本保存——改為可執行——清內存——開發者模式內打開

 1 # !/usr/bin/python 
 2 from mininet.net import Mininet
 3 from mininet.node import Node
 4 from mininet.link import Link
 5 from mininet.log import setLogLevel, info
 6 from mininet.util import quietRun
 7 # 調用Mininet相關模塊
 8  
 9 from time import sleep
10 # 調用sleep模塊 
11  
12 def scratchNet( cname='controller', cargs='-v ptcp:' ):
13     "Create network from scratch using Open vSwitch."
14  
15     # 創建網絡節點其中有兩個主機,一個交換機,一個控制器
16     info( "*** Creating nodes\n" )
17     controller = Node( 'c0', inNamespace=False )
18     switch0 = Node( 's0', inNamespace=False )
19     h0 = Node( 'h0' )
20     h1 = Node( 'h1' )
21  
22     # 創建網絡連接,分別是h0-s0和h1-s0
23     info( "*** Creating links\n" )
24     Link( h0, switch0 )
25     Link( h1, switch0 )
26  
27     # 設置主機的IP地址,然后再診斷的同時打印出string化的h0h1
28     info( "*** Configuring hosts\n" )
29     h0.setIP( '192.168.123.1/24' )
30     h1.setIP( '192.168.123.2/24' )
31     info( str( h0 ) + '\n' )
32     info( str( h1 ) + '\n' )
33  
34     # 開啟控制器和s0的鏈路
35     info( "*** Starting network using Open vSwitch\n" )
36     controller.cmd( cname + ' ' + cargs + '&' )
37     switch0.cmd( 'ovs-vsctl del-br dp0' )
38     switch0.cmd( 'ovs-vsctl add-br dp0' )
39  
40     # 在交換機的信息庫里面依次打出信息
41     for intf in switch0.intfs.values():
42         print intf
43         print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf )
44     switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
45     switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
46     switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' )
47  
48     # 等待連接的小程序
49     info( '*** Waiting for switch to connect to controller' )
50     while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
51         sleep( 1 )
52         info( '.' )
53     info( '\n' )
54  
55     # 兩個互ping6次
56     info( "*** Running test\n" )
57     h0.cmdPrint( 'ping -c6 ' + h1.IP() )
58     h1.cmdPrint( 'ping -c6 ' + h0.IP() )
59  
60     # 關閉這個網絡
61     info( "*** Stopping network\n" )
62     controller.cmd( 'kill %' + cname )
63     switch0.cmd( 'ovs-vsctl del-br dp0' )
64     switch0.deleteIntfs()
65     info( '\n' )
66  
67 # 主函數部分,設置打印等級,還有調用以上的一些函數
68 if __name__ == '__main__':
69     setLogLevel( 'info' )
70     info( '*** Scratch network demo (kernel datapath)\n' )
71     Mininet.init()
72     scratchNet()

 

 

任務二:兩台交換機兩台主機,主機0連接交換機0,主機1連接交換機1,交換機0連接交換機1,數據轉發端口要求同任務一。

和前者的腳本大同小異,這里就解釋mymininet1.py沒有的,print switch0.cmd( 'ovs-ofctl show dp0' )意思就是打出關於s0的信息

  1.  1 #!/usr/bin/python  
    2
    from mininet.net import Mininet 3 from mininet.node import Node 4 from mininet.link import Link 5 from mininet.log import setLogLevel, info 6 from mininet.util import quietRun 7 8 from time import sleep 9 10 def scratchNet( cname='controller', cargs='-v ptcp:' ): 11 "Create network from scratch using Open vSwitch." 12 13 info( "*** Creating nodes\n" ) 14 controller = Node( 'c0', inNamespace=False ) 15 switch0 = Node( 's0', inNamespace=False ) 16 switch1 = Node( 's1', inNamespace=False ) 17 h0 = Node( 'h0' ) 18 h1 = Node( 'h1' ) 19 20 info( "*** Creating links\n" ) 21 Link( h0, switch0 ) 22 Link( h1, switch1 ) 23 Link( switch0, switch1 ) 24 25 info( "*** Configuring hosts\n" ) 26 h0.setIP( '192.168.123.1/24' ) 27 h1.setIP( '192.168.123.2/24' ) 28 info( str( h0 ) + '\n' ) 29 info( str( h1 ) + '\n' ) 30 31 info( "*** Starting network using Open vSwitch\n" ) 32 controller.cmd( cname + ' ' + cargs + '&' ) 33 switch0.cmd( 'ovs-vsctl del-br dp0' ) 34 switch0.cmd( 'ovs-vsctl add-br dp0' ) 35 switch1.cmd( 'ovs-vsctl del-br dp1' ) 36 switch1.cmd( 'ovs-vsctl add-br dp1' ) 37 38 39 for intf in switch0.intfs.values(): 40 print intf 41 print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf ) 42 43 for intf in switch1.intfs.values(): 44 print intf 45 print switch1.cmd( 'ovs-vsctl add-port dp1 %s' % intf ) 46 47 switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' ) 48 switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' ) 49 switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' ) 50 switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' ) 51 switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' ) 52 switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' ) 53 54 55 info( '*** Waiting for switch to connect to controller' ) 56 while 'is_connected' not in quietRun( 'ovs-vsctl show' ): 57 sleep( 1 ) 58 info( '.' ) 59 info( '\n' ) 60 print switch0.cmd( 'ovs-ofctl show dp0' ) 61 print switch1.cmd( 'ovs-ofctl show dp1' ) 62 63 64 info( "*** Running test\n" ) 65 h0.cmdPrint( 'ping -c3 ' + h1.IP() ) 66 h1.cmdPrint( 'ping -c3 ' + h0.IP() ) 67 68 info( "*** Stopping network\n" ) 69 controller.cmd( 'kill %' + cname ) 70 switch0.cmd( 'ovs-vsctl del-br dp0' ) 71 switch0.deleteIntfs() 72 switch1.cmd( 'ovs-vsctl del-br dp1' ) 73 switch1.deleteIntfs() 74 info( '\n' ) 75 76 if __name__ == '__main__': 77 setLogLevel( 'info' ) 78 info( '*** Scratch network demo (kernel datapath)\n' ) 79 Mininet.init() 80 scratchNet()

任務三:與任務二類似,但是在創建link的時候,設置帶寬、延遲以及丟包率。

 1 #!/usr/bin/python 
 2 from mininet.net import Mininet
 3 from mininet.node import Node
 4 from mininet.link import TCLink
 5 from mininet.log import setLogLevel, info
 6 from mininet.util import quietRun
 7  
 8 from time import sleep
 9  
10 def scratchNet( cname='controller', cargs='-v ptcp:' ):
11     "Create network from scratch using Open vSwitch."
12  
13     info( "*** Creating nodes\n" )
14     controller = Node( 'c0', inNamespace=False )
15     switch0 = Node( 's0', inNamespace=False )
16     switch1 = Node( 's1', inNamespace=False )
17     h0 = Node( 'h0' )
18     h1 = Node( 'h1' )
19  
20     info( "*** Creating links\n" )
21  
22     linkopts0=dict(bw=10)
23     linkopts1=dict(bw=10, delay='5ms', loss=10)
24     TCLink( h0, switch0,**linkopts0)
25     TCLink( h1, switch1,**linkopts0)
26     TCLink( switch0, switch1,**linkopts1)
27  
28  
29     info( "*** Configuring hosts\n" )
30     h0.setIP( '192.168.123.1/24' )
31     h1.setIP( '192.168.123.2/24' )
32     info( str( h0 ) + '\n' )
33     info( str( h1 ) + '\n' )
34  
35     info( "*** Starting network using Open vSwitch\n" )
36     controller.cmd( cname + ' ' + cargs + '&' )
37     switch0.cmd( 'ovs-vsctl del-br dp0' )
38     switch0.cmd( 'ovs-vsctl add-br dp0' )
39     switch1.cmd( 'ovs-vsctl del-br dp1' )
40     switch1.cmd( 'ovs-vsctl add-br dp1' )
41  
42  
43     for intf in switch0.intfs.values():
44         print intf
45         print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf )
46  
47     for intf in switch1.intfs.values():
48         print intf
49         print switch1.cmd( 'ovs-vsctl add-port dp1 %s' % intf )
50  
51     switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
52     switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' )
53     switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
54     switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' )
55     switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' )
56     switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' )
57  
58  
59     info( '*** Waiting for switch to connect to controller' )
60     while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
61         sleep( 1 )
62         info( '.' )
63     info( '\n' )
64     print switch0.cmd( 'ovs-ofctl show dp0' )
65     print switch1.cmd( 'ovs-ofctl show dp1' )
66  
67  
68     info( "*** Running test\n" )
69     h0.cmdPrint( 'ping -c3 ' + h1.IP() )
70     h1.cmdPrint( 'ping -c3 ' + h0.IP() )
71  
72     info( "*** Stopping network\n" )
73     controller.cmd( 'kill %' + cname )
74     switch0.cmd( 'ovs-vsctl del-br dp0' )
75     switch0.deleteIntfs()
76     switch1.cmd( 'ovs-vsctl del-br dp1' )
77     switch1.deleteIntfs()
78     info( '\n' )
79  
80 if __name__ == '__main__':
81     setLogLevel( 'info' )
82     info( '*** Scratch network demo (kernel datapath)\n' )
83     Mininet.init()
84     scratchNet()

 

 

 

總結:

1.對ovs加深理解

2.能夠完全看懂腳本

3.需要更深一步了解mininet的模塊的函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM