1. 程式人生 > 實用技巧 >537 es8 async 和 await

537 es8 async 和 await

實驗 3:Mininet 實驗——測量路徑的損耗率

一、實驗目的

在實驗 2 的基礎上進一步熟悉 Mininet 自定義拓撲指令碼,以及與損耗率相關的設定;初步瞭解 Mininet 安裝時自帶的 POX 控制器指令碼編寫,測試路徑損耗率。

二、實驗任務


h0 向 h1 傳送資料包,由於在 Mininet 指令碼中設定了連線損耗率,在傳輸過程中會丟失一些包,本次實驗的目的是展示如何通過控制器計算路徑損耗速率(h0-s0-s1-h1)。這裡假設控制器預先知道網路拓撲。控制器將向 s0 和 s1 傳送flow_stats_request,當控制器接收到來自 s0 的 response 時,將特定流的資料包數儲存在 input_pkts 中,當控制器接收到來自 s1 的 response 時,將接收到特定流的資料包數儲存在 output_pkts 中,差值就是丟失的資料包數量。基於上述拓撲,編寫 Mininet 指令碼,設定特定的交換機間的路徑損耗速率,然後編寫 POX 控制器指令碼,實現對路徑的損耗率的測量。

三、實驗步驟

1.實驗環境

安裝了 Ubuntu 18.04.5 Desktop amd64 的虛擬機器

2.實驗過程

SDNLAB 實驗參考資料(包含完整程式碼):https://www.sdnlab.com/15100.html

(1)新建並編輯 pox 指令碼 flowstat.py:

在 pox 安裝目錄下(Mininet 完整安裝包含了 pox)執行以下命令執行 pox 指令碼

$ ./pox.py flowstat


現在一起看下 flowstat.py 的關鍵程式碼:
第 7 行開始,讓 h0 ping h1,監測 s0 和 s1 之間的鏈路。
• 如果匹配到乙太網型別的包頭(0x0800),並且資料包的目的 IP 地址是192.168.123.2(對照後面 Mininet 的指令碼發現是 h1),並且連線到控制器的資料平面裝置 id 是 s0(h0 ping h1,鏈路 s0-s1 上資料包是從 s0 流向 s1,s0 為源,s1 為目的地),執行 input_pkts = f.packet_count,把資料包數量存入input_pkts;
• 同理,如果連線到控制器的資料平面裝置 id 是 s1,執行 output_pkts = f.packet_count,把資料包數量存入 output_pkts。
• 最後求 input_pkts 和 output_pkts 的差值。一般情況下差值為正,說明鏈路上資料包有損耗。

def _handle_flowstats_received (event):
    #stats = flow_stats_to_list(event.stats)
    #log.debug("FlowStatsReceived from %s: %s", dpidToStr(event.connection.dpid), stats)
    global src_dpid, dst_dpid, input_pkts, output_pkts
    #print "src_dpid=", dpidToStr(src_dpid), "dst_dpid=", dpidToStr(dst_dpid)
    for f in event.stats:
        if f.match.dl_type==0x0800 and f.match.nw_dst==IPAddr("192.168.123.2") and f.match.nw_tos==0x64 and event.connection.dpid==src_dpid:
            #print "input: ", f.byte_count, f.packet_count
            input_pkts = f.packet_count
        if f.match.dl_type==0x0800 and f.match.nw_dst==IPAddr("192.168.123.2") and f.match.nw_tos==0x64 and event.connection.dpid==dst_dpid:
            #print "output: ", f.byte_count, f.packet_count
            output_pkts = f.packet_count
            if input_pkts !=0:
                print getTheTime(), "Path Loss Rate =", (input_pkts-output_pkts)*1.0/input_pkts*100, "%"

(2)編輯 Mininet 指令碼 mymininet3.py

參照拓撲圖,新建並編輯 Mininet 指令碼 mymininet3.py,控制器因為安裝在本機,所以需修改參考資料程式碼中的控制器地址為 127.0.0.1:6633。

switch.cmd( 'ovs-vsctl set-controller dp0 tcp:127.0.0.1:6633' )
switch1.cmd( 'ovs-vsctl set-controller dp1 tcp:127.0.0.1:6633' )

設定 s0 和 s1 之間鏈路的丟包率為 0

    info( "*** Creating links\n" )
    linkopts0=dict(bw=100, delay='1ms', loss=0)
    linkopts1=dict(bw=100, delay='1ms', loss=0)
    link0=TCLink( h0, switch, **linkopts0)
    link1 = TCLink( switch, switch1, **linkopts1)
    link2 = TCLink( h1, switch1, **linkopts0)

再執行命令執行 Mininet 指令碼 mymininet3.py

$ sudo python mymininet3.py

Ping 預設是每 1 秒鐘測一次,ping 的結果會顯示一個丟包率,這裡的丟包率是根據 ping 不通的次數佔總次數的百分比計算得到的。上圖中由於一共 ping 了20次,每次都能通,所以丟包率是 0。
觀察 pox 側的實時狀態更新:
平均丟包率為 0,結果符合 Mininet 指令碼中設定的損耗率,也有可能出現負值,可以認為沒有丟包。

如果修改程式碼中 s0 和 s1 之間鏈路的丟包率為 10。

    info( "*** Creating links\n" )
    linkopts0=dict(bw=100, delay='1ms', loss=0)
    linkopts1=dict(bw=100, delay='1ms', loss=10) #loss改為10
    link0=TCLink( h0, switch, **linkopts0)
    link1 = TCLink( switch, switch1, **linkopts1)
    link2 = TCLink( h1, switch1, **linkopts0)

重新執行 Mininet 指令碼 mymininet3.py,20 秒時間的 ping 過程中有 icmp_seq 為6/20 共 2 次 ping 不通,所以丟包率計算為 10%。

POX 端重新測試,會發現出現丟包現象,但是實際測量出的丟包率會有浮動,鏈路的效能總體受到了限制。

四、總結

實驗中需要用超級管理員許可權來新建並編輯pox指令碼flowstat.py。可用"sudo passwd root"命令來設定root使用者密碼,然後用"su root"命令切入root使用者,然後可以就可以編輯flowstat.py了。但是,不能在root使用者狀態下執行pox。最後,實際測量出的丟包率會有浮動,可能出現s0,s1的loss都為0時,丟包率為45%的情況,可以多測量幾次,或增加ping的次數,應該能觀察到丟包率為0%或接近0%(本人沒有嘗試,僅為猜測)。