1. 程式人生 > 實用技巧 >2020 SDN第三次上機實驗

2020 SDN第三次上機實驗

實驗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 16.04.7 Desktop amd64的虛擬機器

2.實驗過程

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

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

$ ./pox.py flow_stat

     從第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 的差值。一般情況下差值為正,說明鏈路上資料包有損耗

     (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 mymininet.py 

     Ping 預設是每 1 秒鐘測一次,ping 的結果會顯示一個丟包率,這裡的丟包率是根據 ping 不通的次數佔總次數的百分比計算得到的。上圖中由於一共 ping 了 20次,每次都能通,所以丟包率是

     觀察 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 指令碼 mymininet3.py,20 秒時間的 ping 過程中有 icmp_seq 為
2/4/14/16/19/20 共 6 次 ping 不通,所以丟包率計算為 30%.

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

四、總結

  • 在pox 連線失敗時,用ctrl + C結束程序,否則會出現已經建立鏈路無法重連,需要重新啟動
  • 在mininet二次連線時會出現 File exist 的錯誤,需要使用sudo mn -c清除環境

五、參考資料:

     SDNLAB實驗 參考資料: https://www.sdnlab.com/15100.html