Mininet系列實驗(七):Mininet腳本實現控制交換機行爲

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的信息

#!/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
 
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的模塊的函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章