参考:Open vSwitch使用案例扩展实验

实验目的:

通过python脚本调用OpenvSwitch命令;
学习Mininet基于python脚本创建拓扑的实现;
进一步深度使用“ovs-vsctl”命令直接控制Open vSwitch。

实验原理:

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

实验任务:

使用默认的交换机泛洪规则,设置更高的优先级规则进行预先定义IP报文的转发,不同TOS值的数据包将通过不同的方式到达目的地址。

Tos是三层数据包的服务类型标记,也是3个bit,范围0-7,同样可当作优先级标记,另外5个实际指示Delay,Throughput,Reliability等特性的bit位一般没有使用;现在为了更好的控制数据流分类,使用DSCP(Differential Services Code Point),扩展了Tos的后三个bit,因此,范围从0-63。

实验步骤

环境:Ubuntu 14.04,Mininet。

任务1:

通过vi ovsSingleBr.py创建脚本并添加内容。本实验通过python脚本自定义拓扑

vim ovsSingleBr.py

脚本内容:

#!/usr/bin/python

from mininet.net import Mininet
from mininet.node import Node
from mininet.link import Link
from mininet.log import setLogLevel, info def myNet():
"Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" )
switch0 = Node( 's0', inNamespace=False ) h0 = Node( 'h0' )
h1 = Node( 'h1' )
h2 = Node( 'h2' ) info( "*** Creating links\n" )
Link( h0, switch0)
Link( h1, switch0)
Link( h2, switch0) info( "*** Configuring hosts\n" )
h0.setIP( '192.168.123.1/24' )
h1.setIP( '192.168.123.2/24' )
h2.setIP( '192.168.123.3/24' ) info( "*** Starting network using Open vSwitch\n" )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.cmd( 'ovs-vsctl add-br dp0' ) for intf in switch0.intfs.values():
print intf
print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf ) # Note: controller and switch are in root namespace, and we
# can connect via loopback interface
#switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633' ) print switch0.cmd(r'ovs-vsctl show') print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=1,in_port=1,actions=flood' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=1,in_port=2,actions=flood' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=1,in_port=3,actions=flood' ) print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.1,actions=output:1' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,actions=output:2' )
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.3,actions=output:3') #switch0.cmd('tcpdump -i s0-eth0 -U -w aaa &')
#h0.cmd('tcpdump -i h0-eth0 -U -w aaa &')
info( "*** Running test\n" )
h0.cmdPrint( 'ping -c 3 ' + h1.IP() )
h0.cmdPrint( 'ping -c 3 ' + h2.IP() ) #print switch0.cmd( 'ovs-ofctl show dp0' )
#print switch0.cmd( 'ovs-ofctl dump-tables dp0' )
#print switch0.cmd( 'ovs-ofctl dump-ports dp0' )
#print switch0.cmd( 'ovs-ofctl dump-flows dp0' )
#print switch0.cmd( 'ovs-ofctl dump-aggregate dp0' )
#print switch0.cmd( 'ovs-ofctl queue-stats dp0' ) info( "*** Stopping network\n" )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
info( '\n' ) if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
myNet()

此脚本并未连接控制器,只通过脚本中手动给交换机下发流表实现主机间的通信。

给权限:

chmod u+x ovsSingleBr.py

执行脚本:

./ovsSingleBr.py

任务2:

vim ovsMultiBr.py

脚本内容:

#!/usr/bin/python

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\n" )
switch0 = Node( 's0', inNamespace=False )
switch1 = Node( 's1', inNamespace=False )
switch2 = Node( 's2', inNamespace=False )
switch3 = Node( 's3', inNamespace=False )
switch4 = Node( 's4', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' ) info( "*** Creating links\n" )
linkopts0=dict(bw=100, delay='1ms', loss=0)
linkopts1=dict(bw=1, delay='100ms', loss=0)
linkopts2=dict(bw=10, delay='50ms', loss=0)
linkopts3=dict(bw=100, delay='1ms', loss=0)
TCLink( h0, switch0, **linkopts0)
TCLink( switch0, switch1, **linkopts0)
TCLink( switch0, switch2, **linkopts0)
TCLink( switch0, switch3, **linkopts0)
TCLink( switch1, switch4,**linkopts1)
TCLink( switch2, switch4,**linkopts2)
TCLink( switch3, switch4,**linkopts3)
TCLink( h1, switch4, **linkopts0) info( "*** Configuring hosts\n" )
h0.setIP( '192.168.123.1/24' )
h1.setIP( '192.168.123.2/24' )
info( str( h0 ) + '\n' )
info( str( h1 ) + '\n' ) info( "*** Starting network using Open vSwitch\n" )
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' )
switch2.cmd( 'ovs-vsctl del-br dp2' )
switch2.cmd( 'ovs-vsctl add-br dp2' )
switch3.cmd( 'ovs-vsctl del-br dp3' )
switch3.cmd( 'ovs-vsctl add-br dp3' )
switch4.cmd( 'ovs-vsctl del-br dp4' )
switch4.cmd( 'ovs-vsctl add-br dp4' ) 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 ) for intf in switch2.intfs.values():
print intf
print switch2.cmd( 'ovs-vsctl add-port dp2 %s' % intf ) for intf in switch3.intfs.values():
print intf
print switch3.cmd( 'ovs-vsctl add-port dp3 %s' % intf ) for intf in switch4.intfs.values():
print intf
print switch4.cmd( 'ovs-vsctl add-port dp4 %s' % intf ) print switch1.cmd(r'ovs-ofctl add-flow dp1 idle_timeout=0,priority=1,in_port=1,actions=flood' )
print switch1.cmd(r'ovs-ofctl add-flow dp1 idle_timeout=0,priority=1,in_port=1,actions=output:2' )
print switch1.cmd(r'ovs-ofctl add-flow dp1 idle_timeout=0,priority=1,in_port=2,actions=output:1' )
print switch2.cmd(r'ovs-ofctl add-flow dp2 idle_timeout=0,priority=1,in_port=1,actions=output:2' )
print switch2.cmd(r'ovs-ofctl add-flow dp2 idle_timeout=0,priority=1,in_port=2,actions=output:1' )
print switch3.cmd(r'ovs-ofctl add-flow dp3 idle_timeout=0,priority=1,in_port=1,actions=output:2' )
print switch3.cmd(r'ovs-ofctl add-flow dp3 idle_timeout=0,priority=1,in_port=2,actions=output:1' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=1,actions=output:4' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=2,actions=output:4' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=3,actions=output:4' )
print switch4.cmd(r'ovs-ofctl add-flow dp4 idle_timeout=0,priority=1,in_port=4,actions=output:3' ) #print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,actions=output:4')
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,nw_tos=0x10,actions=output:2')
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,nw_tos=0x20,actions=output:3')
print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.2,nw_tos=0x30,actions=output:4')
#print switch0.cmd(r'ovs-ofctl add-flow dp0 idle_timeout=0,priority=10,ip,nw_dst=192.168.123.1,actions=output:1') #switch0.cmd('tcpdump -i s0-eth0 -U -w aaa &')
#h0.cmd('tcpdump -i h0-eth0 -U -w aaa &')
info( "*** Running test\n" )
h0.cmdPrint( 'ping -Q 0x10 -c 3 ' + h1.IP() )
h0.cmdPrint( 'ping -Q 0x20 -c 3 ' + h1.IP() )
h0.cmdPrint( 'ping -Q 0x30 -c 3 ' + h1.IP() )
#h1.cmdPrint('iperf -s -p 12345 -u &')
#h0.cmdPrint('iperf -c ' + h1.IP() +' -u -b 10m -p 12345 -t 10 -i 1') #print switch0.cmd( 'ovs-ofctl show dp0' )
#print switch1.cmd( 'ovs-ofctl show dp1' )
#print switch2.cmd( 'ovs-ofctl show dp2' )
#print switch3.cmd( 'ovs-ofctl show dp3' )
#print switch4.cmd( 'ovs-ofctl show dp4' )
#print switch0.cmd( 'ovs-ofctl dump-tables dp0' )
#print switch0.cmd( 'ovs-ofctl dump-ports dp0' )
#print switch0.cmd( 'ovs-ofctl dump-flows dp0' )
#print switch0.cmd( 'ovs-ofctl dump-aggregate dp0' )
#print switch0.cmd( 'ovs-ofctl queue-stats dp0' ) #print "Testing video transmission between h1 and h2"
#h1.cmd('./myrtg_svc -u > myrd &')
#h0.cmd('./mystg_svc -trace st 192.168.123.2') info( "*** Stopping network\n" )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.deleteIntfs()
switch2.cmd( 'ovs-vsctl del-br dp2' )
switch2.deleteIntfs()
switch3.cmd( 'ovs-vsctl del-br dp3' )
switch3.deleteIntfs()
switch4.cmd( 'ovs-vsctl del-br dp4' )
switch4.deleteIntfs()
info( '\n' ) if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
myNet()

此脚本并未连接控制器,只通过脚本中手动给交换机下发流表实现主机间的通信。在此任务二中,给多个交换机下发流表,通过ping操作测试验证主机间的连通性,并通过-Q参数设置不通的tos值查看主机间的连通性。

给权限:

chmod u+x ovsMultiBr.py

实验结论

此实验并未连接控制器,只通过脚本在单个/多个交换机中下发静态流表实现主机间的通信。在给多个交换机下发流表时,通过ping操作测试验证主机间的连通性,并通过-Q参数设置不同的tos值验证主机间的连通性及到达目的地址的时间,通过验证发现,tos值设置越大,时间使用越少。

2016/11/25

Open vSwitch使用案例扩展实验的更多相关文章

  1. Open vSwitch系列实验(一):Open vSwitch使用案例扩展实验

    一.实验目的 通过python脚本调用OpenvSwitch命令: 学习Mininet基于python脚本创建拓扑的实现: 进一步深度使用“ovs-vsctl”命令直接控制Open vSwitch. ...

  2. OVS-----CentOS7上搭建基于Open vSwitch的VxLAN隧道实验

    一.关于VXLAN VXLAN 是 Virtual eXtensible LANs 的缩写,它是对 VLAN 的一个扩展,是非常新的一个 tunnel 技术,在Open vSwitch中应用也非常多. ...

  3. Open vSwitch系列实验(二):Open vSwitch的GRE隧道实验网络

    一.实验目的 了解GRE协议及原理 理解 Open vSwitch如何配置GRE隧道 二.实验原理 Open vSwitch创建GRE原理很简单,就是把对GRE头和外部IP头的一些操作从原来的代码中抽 ...

  4. 十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验

    Newbe.Claptrap 项目是笔者正在构建以反应式.Actor模式和事件溯源为理论基础的一套服务端开发框架.本篇我们将来了解一下框架在水平扩展方面的能力. 前情提要 时隔许久,今日我们再次见面. ...

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

    作业链接:实验2:Open vSwitch虚拟交换机实践 一.实验目的 能够对Open vSwitch进行基本操作: 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表: 能 ...

  6. 《Linux企业应用案例精解(第2版)》新书发售啦

    本书在出版当年就获得了不错的销量,同时被中国科学院国家科学图书馆.中国国家图书馆.首都图书馆.清华大学.北京大学等上百所国内综合性大学图书馆收录为馆藏图书,在IT业界赢得了良好的口碑.随后2012年年 ...

  7. 《Linux企业应用案例精解(第2版)》新书开始发售

    <Linux企业应用案例精解(第2版)>新书开始发售 650) this.width=650;" title="linux企业应用案例精解 第2版" alt= ...

  8. lvm讲解、磁盘故障小案例

    第4周第3次课(4月11日) 课程内容: 4.10/4.11/4.12 lvm讲解4.13 磁盘故障小案例 4.10/4.11/4.12 lvm讲解 lvm可以给磁盘扩容和缩容,结构图如下. 首先创建 ...

  9. 启用 Open vSwitch - 每天5分钟玩转 OpenStack(127)

    Linux Bridge 和 Open vSwitch 是目前 OpenStack 中使用最广泛的两种虚机交换机技术. 前面各章节我们已经学习了如何用 Linux Bridge 作为 ML2 mech ...

随机推荐

  1. Popular Cows(codevs 2186)

    题意: 有N(N<=10000)头牛,每头牛都想成为most poluler的牛,给出M(M<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不可以相互,即1欢迎2不代表 ...

  2. AsyncHttpClient

    package com.jingle.httpstudy;   import org.apache.http.Header;   import android.app.Activity; import ...

  3. jdk

    mkdir java mv jdk1.7.0_71/ java/ [root@centos02 src]# java -version java version "1.7.0_71" ...

  4. 【转】解决编译Apache出现的问题:configure: error: APR not found . Please read the documentation

    这里写的很清楚了,已验证可用 http://blog.csdn.net/linghao00/article/details/7926458

  5. ThinkPHP的增、删、改、查

    一.创建操作 在ThinkPHP使用add方法新增数据到数据库. 使用方法如下: $User = M()->; $data[););')->delete();

  6. hdu 4021 n数码

    好题,6666 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2652410.html 题意:给出一个board,上面有24个位置,其中2 ...

  7. java写入文件的几种方法分享

    转自:http://www.jb51.net/article/47062.htm 一,FileWritter写入文件 FileWritter, 字符流写入字符到文件.默认情况下,它会使用新的内容取代所 ...

  8. Windows下64位Apache服务器的安装

    转自:http://www.blogjava.net/greatyuqing/archive/2013/02/13/395308.html 首先需要说明的是,Apaceh服务器没有官方的64位版本,只 ...

  9. IIS上发布WCF发布服务,访问不到

    1 环境是IIS7,发布WCF发布服务,访问不到. 一种原因站点自动生成“程序应用池”和站点的Framwork版本不一致. 解决的办法:新建一个“程序应用池”,然后站点指向这个新建的“程序应用池”

  10. SQL 中数值型数据截取以及四舍五入

    SQL 中数值型数据截取及四舍五入 例一: -- 将两个数值分别截取只保留两位小数 ( 注意此时字段默认为 decimal ) select CAST ( 10.097 as decimal ( 10 ...