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)运行结果

  • 相关阅读:
    理解cookie
    浏览器解析url后执行过程
    如何使用D3绘制折线图
    Django 笔记
    vi命令
    PEP8编程规范
    Python_入门第一篇【持续更新...】
    DjangoWeb _ 登录页开发test
    Django开发流程
    Django 笔记2018.2.7
  • 原文地址:https://www.cnblogs.com/southwesty/p/13721193.html
Copyright © 2011-2022 走看看