zoukankan      html  css  js  c++  java
  • 实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令

    一、实验目的

    Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解调用控制的方法。

    二、实验任务

    在本实验中,使用 Mininet 基于 Python 的脚本,调用“ovs-vsctl”命令直接控制Open vSwitch。使用默认的交换机泛洪规则,设置更高的优先级规则进行预先定义 IP 报文的转发。在多个交换机中通过设置不同 TOS 值的数据包将通过不同的方式到达目的地址,验证主机间的连通性及到达目的地址的时间。

    三、实验步骤

    1. 实验环境

    安装了 Ubuntu 18.04.5 Desktop amd64 的虚拟机

    2. 实验过程

    (1)实验拓扑图

    (2)实验代码

    from mininet.net import Mininet
    
    from mininet.node import Node
    
    from mininet.link import TCLink
    
    from mininet.log import  setLogLevel, info
    
     
    
    def myNet():
    
        "Create network from scratch using Open vSwitch."
    
     
    
        info( "*** Creating nodes
    " )
    
        switch0 = Node( 's0', inNamespace=False )
    
        switch1 = Node( 's1', inNamespace=False )
    
    
        h0 = Node( 'h0' )
    
        h1 = Node( 'h1' )
    
        h2 = Node( 'h2' )
    
        h3 = Node( 'h3' )
    
     
    
        info( "*** Creating links
    " )
    
        linkopts0=dict(bw=100, delay='1ms', loss=0)
        linkopts1=dict(bw=1,delay='100ms',loss=0)
    
        TCLink( h0, switch0, **linkopts0)
    
        #TCLink( switch0, switch1, **linkopts0)
    
        TCLink( h1, switch0, **linkopts0)
    
        TCLink( h2, switch1, **linkopts0)
    
        TCLink( h3, switch1, **linkopts0)
    
        TCLink( switch0, switch1, **linkopts1)
    
     
    
        info( "*** Configuring hosts
    " )
    
        h0.setIP( '192.168.123.1/24' )
    
        h1.setIP( '192.168.123.2/24' )
        
        h2.setIP( '192.168.123.3/24' )
    
        h3.setIP( '192.168.123.4/24' )
    
        info( str( h0 ) + '
    ' )
    
        info( str( h1 ) + '
    ' )
    
           
    
        info( "*** Starting network using Open vSwitch
    " )
    
        switch0.cmd( 'ovs-vsctl del-br dp0' )
    
        switch0.cmd( 'ovs-vsctl add-br dp0' )
    
        switch1.cmd( 'ovs-vsctl del-br dp1' )
    
        switch1.cmd( 'ovs-vsctl add-br dp1' )
     
    
        for intf in switch0.intfs.values():
    
            print(intf)
    
            print(switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf ))
    
     
    
        for intf in switch1.intfs.values():
    
            print(intf)
    
            print(switch1.cmd( 'ovs-vsctl add-port dp1 %s' % intf ))
    
        info( " ** ovs-ofctl
     ")
    
        print(switch0.cmd( 'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096->vlan_vid,output:3'))
        print(switch0.cmd( 'ovs-ofctl -O OpenFlow13  add-flow dp0 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097->vlan_vid,output:3'))
        print(switch0.cmd( 'ovs-ofctl -O OpenFlow13  add-flow dp0 priority=1,dl_vlan=0,actions=pop_vlan,output:1'))
        print(switch0.cmd( 'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=1,actions=pop_vlan,output:2'))
    
        print(switch0.cmd( 'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096->vlan_vid,output:3'))
        print(switch0.cmd( 'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097->vlan_vid,output:3'))
        print(switch0.cmd( 'ovs-ofctl -O OpenFlow13  add-flow dp1 priority=1,dl_vlan=0,actions=pop_vlan,output:1'))
        print(switch0.cmd( 'ovs-ofctl  -O OpenFlow13 add-flow dp1 priority=1,dl_vlan=1,actions=pop_vlan,output:2'))
    
    
        h0.cmdPrint( 'ping -Q 0x10 -c 3 ' + h1.IP() )
    
        h0.cmdPrint( 'ping -Q 0x20 -c 3 ' + h2.IP() )
    
        h0.cmdPrint( 'ping -Q 0x30 -c 3 ' + h3.IP() )
    
        h1.cmdPrint( 'ping -Q 0x40 -c 3 ' + h2.IP())
    
        h1.cmdPrint( 'ping -Q 0x50 -c 3 ' + h3.IP())
    
        h2.cmdPrint( 'ping -Q 0x60 -c 3 ' + h3.IP())
    
    
     
    
        info( "*** Stopping network
    " )
    
        switch0.cmd( 'ovs-vsctl del-br dp0' )
    
        switch0.deleteIntfs()
    
        switch1.cmd( 'ovs-vsctl del-br dp1' )
    
        switch1.deleteIntfs()
    
    
    
        info( '
    ' )
    
     
    
    if __name__ == '__main__':
    
        setLogLevel( 'info' )
    
        info( '*** Scratch network demo (kernel datapath)
    ' )
    
        Mininet.init()
    
        myNet()

    (3)运行结果

  • 相关阅读:
    System.TypeInitializationException
    Leetcode 884. 两句话中的不常见单词
    Leetcode 5274. 停在原地的方案数
    Leetcode 1254. 统计封闭岛屿的数目
    Leetcode 1262. 可被三整除的最大和
    数据库知识点自我补充
    最大公共连续子序列
    重建二叉树
    KMP算法
    BF算法(模式匹配)
  • 原文地址:https://www.cnblogs.com/southwesty/p/13721193.html
Copyright © 2011-2022 走看看