1. 程式人生 > 其它 >實驗5:開源控制器實踐——POX

實驗5:開源控制器實踐——POX

一、實驗目的

  • 能夠理解 POX 控制器的工作原理
  • 通過驗證POX的forwarding.hub和forwarding.l2_learning模組,初步掌握POX控制器的使用方法
  • 能夠運用 POX控制器編寫自定義網路應用程式,進一步熟悉POX控制器流表下發的方法

二、實驗環境

  • 下載虛擬機器軟體Oracle VisualBox或VMware
  • 在虛擬機器中安裝Ubuntu 20.04 Desktop amd64,並完整安裝Mininet

三、實驗要求

3.1 基本要求

3.1.1 搭建下圖所示SDN拓撲,協議使用Open Flow 1.0,控制器使用部署於本地的POX(預設監聽6633埠)


  • 使用以下命令搭建拓撲:
    sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10

3.1.2 閱讀Hub模組程式碼,使用 tcpdump 驗證Hub模組

  • 命令列建立的主機ip分別自動分配為10.0.0.1,10.0.0.2,10.0.0.3
  • h1 ping h2

  • h1 ping h3

  • 根據上方截圖可以發現,不管h1 ping h2還是h3,h2和h3都能接收到資料包,符合Hub模組的作用:在每個交換機上安裝泛洪萬用字元規則,將資料包廣播轉發,此時交換機等效於集線器。

3.1.3 閱讀L2_learning模組程式碼,畫出程式流程圖,使用 tcpdump 驗證Switch模組

  • 流程圖

  • h1 ping h2

  • h1 ping h3

  • 根據上方截圖可以發現,當h1 ping相應主機時,只有相應主機可以接收到資料包,符合Switch模組的作用:讓OpenFlow交換機實現L2自學習

3.2 進階要求

3.2.1 重新搭建(一)的拓撲,此時交換機內無流表規則,拓撲內主機互不相通;編寫Python程式自定義一個POX模組SendFlowInSingle3,並且將拓撲連線至SendFlowInSingle3(預設埠6633),實現向s1傳送流表規則使得所有主機兩兩互通

  • 重新搭建(一)的拓撲,且交換機內要無流表規則
    • 首先刪除交換機s1中的流表:dpctl del-flows
    • 因為流表有存活性,因此如果沒有重啟虛擬機器的話,還是能夠互相ping通

  • 檢視POX使用指南編寫程式碼
  • SendFlowInSingle3.py:向交換機S1下發流表規則
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.lib.addresses import IPAddr

class SendFlowInSingle3(object):
    def __init__ (self):
    	core.openflow.addListeners(self)
    def _handle_ConnectionUp(self,event):
        msg = of.ofp_flow_mod()
        msg.priority = 1
        msg.idle_timeout=0
        msg.match.in_port = 1
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))
        event.connection.send(msg)
        msg = of.ofp_flow_mod()
        msg.priority = 1
        msg.idle_timeout=0
        msg.match.in_port = 2
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))
        event.connection.send(msg)
        msg = of.ofp_flow_mod()
        msg.priority = 1
        msg.idle_timeout=0
        msg.match.in_port = 3
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))
        event.connection.send(msg)


def launch ():
	core.registerNew(SendFlowInSingle3)

  • 各主機都能互相ping通,且檢視流表如下


四、個人總結

  • 實驗難度:較難
  • 實驗過程遇到的困難及解決辦法:
    • 實驗要求(一)中搭建拓撲要記得命令末尾為OpenFlow10,因為POX僅支援OpenFlow1.0,因為之前都是用OpenFlow13,因此沒改的話後面驗證過程會出錯。
    • 閱讀L2_learning模組程式碼,畫出程式流程圖時遇到了困難,因為程式的引數太多,後來發現程式碼檔案的開頭給出了演算法的簡介,於是根據簡介畫出了流程圖。
    • 在進行進階要求的時候,不知道如何寫,翻看中國大學慕課中溫州大學的軟體定義網路,下圖給了我靈感:

  • 個人感想:這次實驗的正常要求還是挺容易的,中規中矩,但是進階要求也太令人頭大了吧!密密麻麻的英文文件看的頭都要裂了,於是在裡面不停翻找與flow有關的字眼,後來找到的內容發現跟老師pdf裡面給出的of_flow_mod和例子兩個程式碼一樣,看了如何註冊元件之後就簡單寫了下,後來發現前者只需import呼叫就行了,然後又瞎折騰了半天,看過慕課裡的實踐指導書後找到了頭緒,在進行連線的同時下發流表,寫出的程式碼結果還挺滿意的,但是感覺跟洪泛又有點像,哈哈哈不管了。