實(shí)驗3 Open vSwitch實(shí)驗

實(shí)驗?zāi)康模?/h3>
  • 通過python腳本調(diào)用OpenvSwitch命令靴庆;
  • 學(xué)習(xí)Mininet基于python腳本創(chuàng)建拓?fù)涞膶?shí)現(xiàn)苟耻;
  • 進(jìn)一步深度使用“ovs-vsctl”命令直接控制Open vSwitch。

實(shí)驗原理:

在SDN環(huán)境中破镰,控制器可以通過對交換機(jī)下發(fā)流表操作來控制交換機(jī)的轉(zhuǎn)發(fā)行為。在本實(shí)驗中,使用Mininet基于python的腳本妆丘,調(diào)用“ovs-vsctl”命令直接控制Open vSwitch。使用默認(rèn)的交換機(jī)泛洪規(guī)則局劲,設(shè)置更高的優(yōu)先級規(guī)則進(jìn)行預(yù)先定義IP報文的轉(zhuǎn)發(fā)勺拣。在多個交換機(jī)中通過設(shè)置不同TOS值的數(shù)據(jù)包將通過不同的方式到達(dá)目的地址,驗證主機(jī)間的連通性及到達(dá)目的的時間容握。

實(shí)驗任務(wù):

使用默認(rèn)的交換機(jī)泛洪規(guī)則宣脉,設(shè)置更高的優(yōu)先級規(guī)則進(jìn)行預(yù)先定義IP報文的轉(zhuǎn)發(fā),不同TOS值的數(shù)據(jù)包將通過不同的方式到達(dá)目的地址剔氏。

實(shí)驗步驟:

1塑猖、實(shí)驗環(huán)境

  • 安裝了 Ubuntu 16.04 Desktop amd64 的虛擬機(jī)
  • 該虛擬機(jī)上已成功安裝mininet

2、實(shí)驗內(nèi)容

實(shí)驗內(nèi)容1:
  • 通過vi ovsSingleBr.py創(chuàng)建腳本并添加內(nèi)容谈跛。本實(shí)驗通過python腳本自定義拓?fù)洌?/li>
#!/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文件賦權(quán)限羊苟。此腳本并未連接控制器,只通過腳本中手動給交換機(jī)下發(fā)流表實(shí)現(xiàn)主機(jī)間的通信感憾。

執(zhí)行腳本命令:

$ sudo su //進(jìn)入管理員權(quán)限
# python ovsSingleBr.py

在沒有控制器的情況下蜡励,在Mininet 腳本中通過調(diào)用 ovs 命令直接向 switch0 交換機(jī)下發(fā)流表,將入端口號為1/2/3 的數(shù)據(jù)包泛洪廣播,并對目的地址為 192.168.123.1/2/3 的數(shù)據(jù)包分別從1/2/3 端口轉(zhuǎn)發(fā)出去凉倚。之后測試 h0 ping h1兼都,h0 ping h2,網(wǎng)絡(luò)連通稽寒。

實(shí)驗內(nèi)容2:
  • 通過vi ovsMultiBr.py創(chuàng)建腳本并添加內(nèi)容扮碧。本實(shí)驗通過python腳本自定義拓?fù)洌?/li>
#!/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()

通過命令chmod u+x ovsMultiBr.py將ovsMultiBr.py文件賦權(quán)限。此腳本并未連接控制器杏糙,只通過腳本中手動給交換機(jī)下發(fā)流表實(shí)現(xiàn)主機(jī)間的通信慎王。在此任務(wù)二中,給多個交換機(jī)下發(fā)流表宏侍,通過ping操作測試驗證主機(jī)間的連通性赖淤,并通過-Q參數(shù)設(shè)置不通的tos值查看主機(jī)間的連通性。

執(zhí)行腳本命令:

# python ovsMultiBr.py

在沒有控制器的情況下谅河,在mininet 腳本中通過調(diào)用 ovs 命令給多個交換機(jī)下發(fā)流表咱旱,通過 h0 ping h1 操作測試驗證主機(jī)間的連通性,并通過-Q 參數(shù)設(shè)置不通的 tos 值查看主機(jī)間的連通
性旧蛾。通過驗證發(fā)現(xiàn)莽龟,tos 值設(shè)置越大,時間使用越少锨天。

實(shí)驗結(jié)論:

此實(shí)驗并未連接控制器毯盈,只通過腳本在單個/多個交換機(jī)中下發(fā)靜態(tài)流表實(shí)現(xiàn)主機(jī)間的通信。在給多個交換機(jī)下發(fā)流表時病袄,通過ping操作測試驗證主機(jī)間的連通性搂赋,并通過-Q參數(shù)設(shè)置不同的tos值驗證主機(jī)間的連通性及到達(dá)目的地址的時間,通過驗證發(fā)現(xiàn)益缠,tos值設(shè)置越大脑奠,時間使用越少。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幅慌,一起剝皮案震驚了整個濱河市宋欺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胰伍,老刑警劉巖齿诞,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骂租,居然都是意外死亡祷杈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門渗饮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但汞,“玉大人宿刮,你說我怎么就攤上這事∷嚼伲” “怎么了僵缺?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長踩叭。 經(jīng)常有香客問我谤饭,道長,這世上最難降的妖魔是什么懊纳? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮亡容,結(jié)果婚禮上嗤疯,老公的妹妹穿的比我還像新娘。我一直安慰自己闺兢,他們只是感情好茂缚,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屋谭,像睡著了一般脚囊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桐磁,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天悔耘,我揣著相機(jī)與錄音,去河邊找鬼我擂。 笑死衬以,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的校摩。 我是一名探鬼主播看峻,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衙吩!你這毒婦竟也來了互妓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤坤塞,失蹤者是張志新(化名)和其女友劉穎冯勉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尺锚,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珠闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘫辩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伏嗜。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡坛悉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出承绸,到底是詐尸還是另有隱情裸影,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布军熏,位于F島的核電站轩猩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荡澎。R本人自食惡果不足惜均践,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摩幔。 院中可真熱鬧彤委,春花似錦、人聲如沸或衡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽封断。三九已至斯辰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坡疼,已是汗流浹背彬呻。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柄瑰,地道東北人废岂。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像狱意,于是被迫代替她去往敵國和親湖苞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容