Mininet实验 脚本实现控制交换机行为

实验原理

在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为。在本实验中,使用Mininet基于python的脚本,调用“ovs-vsctl”命令直接控制Open vSwitch。


实验内容

一台交换机两台主机,实现从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口

mininet脚本代码如下:

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

其实,源码中的也可以不用连接controller,直接就可以使用“ovs-vsctl”命令控制控制器。也就是代码中的 switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633' )其实不是那么必要。

两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口要求同脚本1

mininet代码如下:

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

在脚本2的基础上设置带宽、延迟以及丢包率

mininet代码如下:

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

转载于:https://www.cnblogs.com/pullself/p/10225343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值