1 实验目的

  • 熟悉Mininet自定义拓扑脚本的编写;
  • 掌握使用“ovs-vsctl”命令直接控制Open vSwitch。

2 实验原理

在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为。在本实验中,使用Mininet基于python的脚本,调用“ovs-vsctl”命令直接控制Open vSwitch。

3 实验任务

本实验在基于Mininet脚本的不同拓扑环境下使用OpenDaylight控制交换机行为。任务一:一台交换机两台主机,从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口;任务二:两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口同任务一;任务三:与任务二类似,但是在创建link的时候,设置带宽、延迟以及丢包率。

任务一:一台交换机两台主机,实现从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口。

还是那个流程:

打开mininet文件夹——创建mymininet1.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
from mininet.util import quietRun
# 调用Mininet相关模块 from time import sleep
# 调用sleep模块 def scratchNet( cname='controller', cargs='-v ptcp:' ):
"Create network from scratch using Open vSwitch." # 创建网络节点其中有两个主机,一个交换机,一个控制器
info( "*** Creating nodes\n" )
controller = Node( 'c0', inNamespace=False )
switch0 = Node( 's0', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' ) # 创建网络连接,分别是h0-s0和h1-s0
info( "*** Creating links\n" )
Link( h0, switch0 )
Link( h1, switch0 ) # 设置主机的IP地址,然后再诊断的同时打印出string化的h0h1
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' ) # 开启控制器和s0的链路
info( "*** Starting network using Open vSwitch\n" )
controller.cmd( cname + ' ' + cargs + '&' )
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 )
switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' ) # 等待连接的小程序
info( '*** Waiting for switch to connect to controller' )
while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
sleep( 1 )
info( '.' )
info( '\n' ) # 两个互ping6次
info( "*** Running test\n" )
h0.cmdPrint( 'ping -c6 ' + h1.IP() )
h1.cmdPrint( 'ping -c6 ' + h0.IP() ) # 关闭这个网络
info( "*** Stopping network\n" )
controller.cmd( 'kill %' + cname )
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()
scratchNet()

任务二:两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口要求同任务一。

和前者的脚本大同小异,这里就解释mymininet1.py没有的,print switch0.cmd( 'ovs-ofctl show dp0' )意思就是打出关于s0的信息

  1.  1 #!/usr/bin/python  
    2 from mininet.net import Mininet
    from mininet.node import Node
    from mininet.link import Link
    from mininet.log import setLogLevel, info
    from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ):
    "Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" )
    controller = Node( 'c0', inNamespace=False )
    switch0 = Node( 's0', inNamespace=False )
    switch1 = Node( 's1', inNamespace=False )
    h0 = Node( 'h0' )
    h1 = Node( 'h1' ) info( "*** Creating links\n" )
    Link( h0, switch0 )
    Link( h1, switch1 )
    Link( switch0, switch1 ) 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" )
    controller.cmd( cname + ' ' + cargs + '&' )
    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 ) switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
    switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' )
    switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
    switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' )
    switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' )
    switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' )
    while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
    sleep( 1 )
    info( '.' )
    info( '\n' )
    print switch0.cmd( 'ovs-ofctl show dp0' )
    print switch1.cmd( 'ovs-ofctl show dp1' ) info( "*** Running test\n" )
    h0.cmdPrint( 'ping -c3 ' + h1.IP() )
    h1.cmdPrint( 'ping -c3 ' + h0.IP() ) info( "*** Stopping network\n" )
    controller.cmd( 'kill %' + cname )
    switch0.cmd( 'ovs-vsctl del-br dp0' )
    switch0.deleteIntfs()
    switch1.cmd( 'ovs-vsctl del-br dp1' )
    switch1.deleteIntfs()
    info( '\n' ) if __name__ == '__main__':
    setLogLevel( 'info' )
    info( '*** Scratch network demo (kernel datapath)\n' )
    Mininet.init()
    scratchNet()

任务三:与任务二类似,但是在创建link的时候,设置带宽、延迟以及丢包率。

 #!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Node
from mininet.link import TCLink
from mininet.log import setLogLevel, info
from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ):
"Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" )
controller = Node( 'c0', inNamespace=False )
switch0 = Node( 's0', inNamespace=False )
switch1 = Node( 's1', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' ) info( "*** Creating links\n" ) linkopts0=dict(bw=10)
linkopts1=dict(bw=10, delay='5ms', loss=10)
TCLink( h0, switch0,**linkopts0)
TCLink( h1, switch1,**linkopts0)
TCLink( switch0, switch1,**linkopts1) 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" )
controller.cmd( cname + ' ' + cargs + '&' )
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 ) switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' )
switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' )
switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' )
while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
sleep( 1 )
info( '.' )
info( '\n' )
print switch0.cmd( 'ovs-ofctl show dp0' )
print switch1.cmd( 'ovs-ofctl show dp1' ) info( "*** Running test\n" )
h0.cmdPrint( 'ping -c3 ' + h1.IP() )
h1.cmdPrint( 'ping -c3 ' + h0.IP() ) info( "*** Stopping network\n" )
controller.cmd( 'kill %' + cname )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.deleteIntfs()
info( '\n' ) if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
scratchNet()

总结:

1.对ovs加深理解

2.能够完全看懂脚本

3.需要更深一步了解mininet的模块的函数

最新文章

  1. 完美判断iframe是否加载完成
  2. .net core 一次坑爹的类库打包过程
  3. [译]git reset
  4. JS-取出字符串中重复次数最多的字符并输出
  5. 高校手机签到系统——第一部分Authority权限系统(下)
  6. 《ASP.NET1200例》高亮显示ListView中的数据行并自动切换图片
  7. 【NOI2015】荷马史诗
  8. SQL 语句中的With(index())
  9. HTML5七大优势“逼宫”APP
  10. CSS去除链接虚线(兼容IE6、IE7)
  11. Objective-C ,ios,iphone开发基础:多个视图(view)之间的切换2,使用导航栏控制,以及视图之间传值。
  12. ZJOI2008泡泡堂BNB
  13. 1.linux下Kconfig编写规范
  14. 在 Windows 下远程桌面连接 Linux - XManager 篇
  15. Bitmap的使用习惯——及时释放Bitmap占用的内存
  16. java 多线程 synchronized与lock的通信机制等问题,结合相应实例说明
  17. hybrid简单了解
  18. jmeter中提取json串
  19. windows + php + redis的安装
  20. NOIP 2016 天天爱跑步 (luogu 1600 & uoj 261) - 线段树

热门文章

  1. 整合91平台接入的ANE
  2. mysql的左连接问题
  3. Kubernetes-使用Helm安装istio
  4. ashx 文件的运用
  5. python3 推荐使用super调用base类方法
  6. postscript打印机语言
  7. vue中移动端自适应的postcss-plugin-px2rem插件
  8. test20190827 NOIP2019 模拟赛
  9. Linux 安装网络yum地址
  10. springboot开发人员工具(自动重启及相关的配置)