1. 程式人生 > 實用技巧 >Linux下md5sum用法 (檢視檔案或字串的md5值)

Linux下md5sum用法 (檢視檔案或字串的md5值)

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

一、實驗目的

​ 在實驗 2 的基礎上進一步熟悉 Mininet 自定義拓撲指令碼,以及與損耗率相關的設 定;初步瞭解 Mininet 安裝時自帶的 POX 控制器指令碼編寫,測試路徑損耗率。掌握 Mininet 的自定義拓撲生成方法:命令列建立、Python 指令碼編寫

二、實驗任務

​ 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. 實驗過程

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 指令碼 mymininet.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)
 link0=TCLink( h0, switch, **linkopts0)
 link1 = TCLink( switch, switch1, **linkopts1)
 link2 = TCLink( h1, switch1, **linkopts0)

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

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

之前在waiting controll的地方卡了好久 最後發現是自己犯傻 執行完flowstat再去執行mininet的時候關閉了flowstat,只要開雙終端同時執行就可