實驗6:開源控制器實踐——RYU


一、實驗目的

  1. 能夠獨立部署RYU控制器;
  2. 能夠理解RYU控制器實現軟件定義的集線器原理;
  3. 能夠理解RYU控制器實現軟件定義的交換機原理。

二、實驗環境

  1. 下載虛擬機軟件Oracle VisualBox或VMware;
  2. 在虛擬機中安裝Ubuntu 20.04 Desktop amd64,並完整安裝Mininet;

三、實驗要求

(一)基本要求

  1. 完成Ryu控制器的安裝。
  2. 搭建下圖所示SDN拓撲,協議使用Open Flow 1.0,並連接Ryu控制器。
  3. 通過Ryu的圖形界面查看網絡拓撲。
  4. 閱讀Ryu文檔的The First Application一節,運行並使用 tcpdump 驗證L2Switch,分析和POX的Hub模塊有何不同。
  • 在Ryu安裝目錄下執行ryu --version
  • 搭建拓撲
    sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
  • 啟動ryu控制器、連接ryu控制器(可通過Ryu的圖形界面查看網絡拓撲,訪問http://127.0.0.1:8080)
    ryu-manager ryu/ryu/app/gui_topology/gui_topology.py --observe-links
  • 通過 vim 編輯保存 L2Switch.py 文件
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0

class L2Switch(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(L2Switch, self).__init__(*args, **kwargs)

    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def packet_in_handler(self, ev):
        msg = ev.msg
        dp = msg.datapath
        ofp = dp.ofproto
        ofp_parser = dp.ofproto_parser

        actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]

        data = None
        if msg.buffer_id == ofp.OFP_NO_BUFFER:
             data = msg.data

        out = ofp_parser.OFPPacketOut(
            datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
            actions=actions, data = data)
        dp.send_msg(out)
  • 運行並驗證:


  • 分析:
    兩個模塊都使用的是洪泛轉發 ICMP 報文,當h1 ping h2時 h3都能抓到數據包。L2Switch 與 Hub 模塊的不同在於———— L2Switch 下發的流表無法在 mininet 查看(如下圖),Hub 可以。

四、個人總結

  1. 實驗難度
    基本要求不難,但進階要求難。難度仍然體現在ruy操作以及閱讀方面。

  2. 實驗過程遇到的困難及解決辦法

  • 首先搭建拓撲時出現下圖的錯誤,沒管此處錯誤時,pingall也無法ping通。

    嘗試解決過程(似乎沒完全解決):清除此前拓撲,再次搭建,仍然出錯。百度建議更換端口號或是檢查網絡又或是先打開ryu控制器再建立拓撲。個人選擇,在ryu目錄下使用ryu-manager --verbose ryu.app.simple_switch_13啟動控制器,再建立拓撲,也能與控制器相連接,而后此處錯誤消失(如下圖);又經他人指導得到先開啟ryu控制器,運行L2Switch.py文件之后再搭建拓撲,按此順序執行步驟才能使得pingall成功。

  • Ryu的圖形界面可能沒有顯示出完整的網絡拓撲(第一次如下圖,第二次嘗試則一片空白),實驗時未解決此問題。寫報告的時候再百度,發現可能是拓撲與mininet的順序有誤,應該先啟動Ryu控制器且注意參數ryu-manager ryu/ryu/app/gui_topology/gui_topology.py --observe-links再啟動mininet,再訪問http://127.0.0.1:8080。

  1. 個人感想
    關於實驗的基礎要求,由於上一次實驗使用過 tcpdump 驗證方式,所以這塊的操作比較流暢,也能理解此次實驗的內容;關於進階要求,嘗試過,但是由於單詞的陌生以及邏輯實在理不清,遺憾無法完整地理解全部代碼,但也能回答進階要求的部分問題吧;關於實驗之中遇到錯誤這種事,我個人好像並不能理解和獨立完美地解決這些錯誤,然而百度也不是完全的對症下葯,需要加強下這方面的能力吧以及克服下詢問別人的尷尬與恐懼。總之,這次實驗體驗了獨立部署RYU控制器、理解了RYU控制器實現軟件定義的集線器原理和交換機原理,也讓我回顧了下POX的Hub模塊,也對POX與RYU有了潛意識的對比,更了解各自的特點、功能、使用方式等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM