zoukankan      html  css  js  c++  java
  • 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
    " )
    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
    " )
    19     Link( h0, switch0 )
    20     Link( h1, switch0 )
    21  
    22     info( "*** Configuring hosts
    " )
    23     h0.setIP( '192.168.123.1/24' )
    24     h1.setIP( '192.168.123.2/24' )
    25     info( str( h0 ) + '
    ' )
    26     info( str( h1 ) + '
    ' )
    27  
    28     info( "*** Starting network using Open vSwitch
    " )
    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( '
    ' )
    45  
    46     info( "*** Running test
    " )
    47     h0.cmdPrint( 'ping -c6 ' + h1.IP() )
    48     h1.cmdPrint( 'ping -c6 ' + h0.IP() )
    49  
    50     info( "*** Stopping network
    " )
    51     controller.cmd( 'kill %' + cname )
    52     switch0.cmd( 'ovs-vsctl del-br dp0' )
    53     switch0.deleteIntfs()
    54     info( '
    ' )
    55  
    56 if __name__ == '__main__':
    57     setLogLevel( 'info' )
    58     info( '*** Scratch network demo (kernel datapath)
    ' )
    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
    " )
    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
    " )
    20     Link( h0, switch0 )
    21     Link( h1, switch1 )
    22     Link( switch0, switch1 )
    23  
    24     info( "*** Configuring hosts
    " )
    25     h0.setIP( '192.168.123.1/24' )
    26     h1.setIP( '192.168.123.2/24' )
    27     info( str( h0 ) + '
    ' )
    28     info( str( h1 ) + '
    ' )
    29  
    30     info( "*** Starting network using Open vSwitch
    " )
    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( '
    ' )
    59     print (switch0.cmd( 'ovs-ofctl show dp0' ))
    60     print (switch1.cmd( 'ovs-ofctl show dp1' ))
    61  
    62  
    63     info( "*** Running test
    " )
    64     h0.cmdPrint( 'ping -c3 ' + h1.IP() )
    65     h1.cmdPrint( 'ping -c3 ' + h0.IP() )
    66  
    67     info( "*** Stopping network
    " )
    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( '
    ' )
    74  
    75 if __name__ == '__main__':
    76     setLogLevel( 'info' )
    77     info( '*** Scratch network demo (kernel datapath)
    ' )
    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
    " )
    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
    " )
    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
    " )
    29     h0.setIP( '192.168.123.1/24' )
    30     h1.setIP( '192.168.123.2/24' )
    31     info( str( h0 ) + '
    ' )
    32     info( str( h1 ) + '
    ' )
    33  
    34     info( "*** Starting network using Open vSwitch
    " )
    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( '
    ' )
    63     print (switch0.cmd( 'ovs-ofctl show dp0' ))
    64     print (switch1.cmd( 'ovs-ofctl show dp1' ))
    65  
    66  
    67     info( "*** Running test
    " )
    68     h0.cmdPrint( 'ping -c3 ' + h1.IP() )
    69     h1.cmdPrint( 'ping -c3 ' + h0.IP() )
    70  
    71     info( "*** Stopping network
    " )
    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( '
    ' )
    78  
    79 if __name__ == '__main__':
    80     setLogLevel( 'info' )
    81     info( '*** Scratch network demo (kernel datapath)
    ' )
    82     Mininet.init()
    83     scratchNet()

  • 相关阅读:
    按日期重命名宾得相机的照片
    Intellij笔记
    quartznet笔记
    优秀的UI插件
    我的ORM之示例项目
    Redis笔记
    Idol之坑
    ORACLE查询表最近更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
    如何drop大表的中不用的字段 set unused column
    Oracle DUL/AUL/ODU 工具说明
  • 原文地址:https://www.cnblogs.com/pullself/p/10225343.html
Copyright © 2011-2022 走看看