实验2:Open vSwitch虚拟交换机实践

实验2:Open vSwitch虚拟交换机实践

一、实验目的

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

二、实验环境

Ubuntu 20.04 Desktop amd64

三、实验要求

(一)基本要求

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

  • 执行ovs-vsctl show命令

  • 连通性测试的执行结果

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

  • 下发流表

  • 查看OVS流表

  • pingall

  • wireshark抓包

(二)进阶要求

  • 代码
#!/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.0/8')

    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', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', 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()


  • 结果

四、个人总结

实验过程中遇到的问题,解决方法及收获:

(1)最开始做那个“ovs-vsctl基础操作实践”的任务时,因为粗心导致在配置p1端口时将其中的ofport_request=101写成了ofport_request=100,后经过寻求舍友的帮助得以解决。
(2)其次就是在做第二个实验时将sudo mn --custom mysdntopo2.py --topo my topo --controller=remote,ip=127.0.0.1,port=6653 --switch ovsk,protocols=OpenFlow13整句复制运行,忽略了其中的细节,后经过理解检查才发现问题,将mysdntopo2.py改成mytopo.py后就好了。
(3)还有一个问题就是在进阶实验运行时出现错误,后面经过自行搜索寻问舍友等解决方法后,发现这是因为没有退出之前mininet并清理先前定义的拓扑文件,导致了出现重复的拓扑,用过使用命令mn -c清除后就可以正常运行了。
(4)综上,虽然这次这次实验是相对比较好做的,但是在实验过程当中依然要注意且细心!一旦因为粗心导致的错误有时候其实是很难发现的。在遇到困难时一定不能心浮气躁,也不要盲目的重做实验,一定要细心发现问题才能解决问题!

posted @ 2022-09-21 15:07  Edith12  阅读(53)  评论(0编辑  收藏  举报