一、實驗目的
- 能夠獨立部署RYU控制器;
- 能夠理解RYU控制器實現軟件定義的集線器原理;
- 能夠理解RYU控制器實現軟件定義的交換機原理。
二、實驗環境
- 下載虛擬機軟件Oracle VisualBox或VMware;
- 在虛擬機中安裝Ubuntu 20.04 Desktop amd64,並完整安裝Mininet;
三、實驗要求
(一)基本要求
- 完成Ryu控制器的安裝。
- 搭建下圖所示SDN拓撲,協議使用Open Flow 1.0,並連接Ryu控制器。

- 通過Ryu的圖形界面查看網絡拓撲。
- 閱讀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 可以。

四、個人總結
-
實驗難度
基本要求不難,但進階要求難。難度仍然體現在ruy操作以及閱讀方面。 -
實驗過程遇到的困難及解決辦法
-
首先搭建拓撲時出現下圖的錯誤,沒管此處錯誤時,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。

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