实验目的

  1. 能够对Open vSwitch进行基本操作;
  2. 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表;
  3. 能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的Open vSwitch交换机

(一)基本要求

(1)/home/用户名/学号/lab2/目录下执行ovs-vsctl show命令、以及p0和p1连通性测试的执行结果截图

image

image
(2) /home/用户名/学号/lab2/目录下开启Mininet CLI并执行pingall命令的截图
image
上述目录下查看OVS流表的命令结果截图,wireshark抓包截图
image

image

image

image

    (二)进阶要求

    python代码

    点击查看代码
    #!/usr/bin/env python
    
    from mininet.net import Mininet
    from mininet.node import Controller, RemoteController, OVSController
    from mininet.node import CPULimitedHost, Host, Node
    from mininet.node import OVSKernelSwitch, UserSwitch
    from mininet.node import IVSSwitch
    from mininet.cli import CLI
    from mininet.log import setLogLevel, info
    from mininet.link import TCLink, Intf
    from subprocess import call
    
    def myNetwork():
    
        net = Mininet( topo=None,
                       build=False,
                       ipBase='10.0.0.1/24')
    
        info( '*** Adding controller\n' )
        c0=net.addController(name='c0',
                          controller=Controller,
                          protocol='tcp',
                          port=6633)
    
        info( '*** Add switches\n')
        s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
        s2 = net.addSwitch('s2', cls=OVSKernelSwitch)
    
        info( '*** Add hosts\n')
        h1 = net.addHost('h1', cls=Host, ip='10.0.0.1/24', defaultRoute=None)
        h2 = net.addHost('h2', cls=Host, ip='10.0.0.2/24', defaultRoute=None)
        h3 = net.addHost('h3', cls=Host, ip='10.0.0.3/24', defaultRoute=None)
        h4 = net.addHost('h4', cls=Host, ip='10.0.0.4/24', defaultRoute=None)
    
        info( '*** Add links\n')
        net.addLink(h1, s1, 1, 1)
        net.addLink(s1, h2, 2, 1)
        net.addLink(s1, s2, 3, 3)
        net.addLink(s2, h3, 1, 1)
        net.addLink(s2, h4, 2, 1)
    
        info( '*** Starting network\n')
        net.build()
        info( '*** Starting controllers\n')
        for controller in net.controllers:
            controller.start()
    
        info( '*** Starting switches\n')
        net.get('s1').start([c0])
        net.get('s2').start([c0])
        
        info( '*** Post configure switches and hosts\n')
    
        s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3')
        s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3')
        s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output:1')
        s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output:2')
        
        s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3')
        s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3')
        s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output:1')
        s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output:2')
    
        CLI(net)
        net.stop()
    
    if __name__ == '__main__':
        setLogLevel( 'info' )
        myNetwork()
    
    

    image

    image

    image

    个人总结:

    遇到的困难:

    1.忘记上次实验还遗留了拓扑结构,打开运行的时候出错了,才发现要用sudo mn -c命令进行配置删除。
    2.贴指导文件的代码时,代码中间有换行,结果没贴完直接运行出错了,然后pingall发现结果不对,只能重新来过。做这个实验必须谨慎一点!!
    心得:了解了openswitch的使用和配置方法,学会了在命令行下流表的下发,抓包。观察到VLAN的应用。一定程度提升了自学能力,但是还有很多要学的。