【Ryu Controller 運作原理】

當Ryu Controller要與mininet建立連接時,我們會執行「reu-manager –verbose ryu/app/simple_switch_13.py」,其中simple_switch_13.py它是一個由python所撰寫的程式原始碼,其主要功能包含switch的mac address 對應 port 關係,以及flow entry的新增與刪除作業

以下程式碼針對「simple_switch_13.py」來做改寫

  • 程式碼分析 :
    def switch_features_handler(self, ev): 

    該程式碼區塊主要負責監控關於switch的各種狀態,包含初次建立連接時的握手訊息交換,目前該switch的連線狀態(連接還是斷線)等

Screenshot from 2018-04-07 03-02-41.png
新增 Table-miss Flow Entry 區塊

OpenFlow 交換器的握手協議完成之後,新增 Table-miss Flow Entry 到 Flow table 中為接收 Packet-In 訊息做準備。

Table-miss Flow Entry 的優先權為 0 即最低的優先權,而且此 Entry 可以 match 所有的封包。 這個 Entry 的 Instruction 通常指定為 output action ,並且輸出的連接埠將指向 Controller。 

   def _packet_in_handler(self, ev):

在Ryu 中當有未知的封包流經switch時,便會觸發PacketIn 事件,也就是此段程式區塊所做的事情

Screenshot from 2018-04-07 03-02-59.png

Screenshot from 2018-04-07 03-03-23.png

Screenshot from 2018-04-07 03-03-40.png

目的 MAC 位址若存在于 MAC 位址表,則判斷該連接埠的號碼為輸出。反之若不存在于 MAC 位址表則 OUTPUT action 類別的實體並生成 flooding( OFPP_FLOOD)給目的連接埠使用

對於 Flow Entry 來說,設定 match 條件以分辨目標封包、設定 instruction 以處理封包以及 Entry 的優先權和有效時間。

對於交換器的的實作,Apply Actions 是用來設定那些必須立即執行的 action 所使用。

最後透過 Flow Mod 訊息將 Flow Entry 新增到 Flow table 中。

  • 程式實作

執行Ryu和Mininet

Screenshot from 2018-04-07 03-37-36.png

當Mininet與Ryu Controller開始建立連接時,觀察Ryu的交換訊息

Screenshot from 2018-04-07 03-37-59.png
當初次建立連接時,分別會在每個switch上新增預設的「table-miss flow entry」,該規則中將所有封包都先往Controller送

接著在mininet中執行 pingall 指令

Screenshot from 2018-04-07 03-38-38.png

Screenshot from 2018-04-07 03-38-49.png

Screenshot from 2018-04-07 03-38-58.png

Screenshot from 2018-04-07 03-39-09.png

Screenshot from 2018-04-07 03-39-18

Screenshot from 2018-04-07 03-39-28.png

  • 程式運作原則
  1. 初次建立連接時,新增table-miss flow entry,作為前置作業
  2. 使用Flooding機制得知host MAC address 對應的port,並存入mac_to_port table中
  3. flow流經switch時有來源位址(eth_src)和目的位址(eth_dst)和來源port(in_port),新增至flow entry

【多個 Mininet host 連接 — 使用Gre Tunnel 】

前者所分享關於Mininet的文章都是僅有一個虛擬機裡面執行mininet模擬環境,所測試host間的連接也都是在同一個Mininet環境,然而若是在多個不同間的VM或是Mininet環境要進行網路連接時,就要用到所謂的Gre Tunnel了

根據網路上關於Gre Tunnel的介紹,整理如下:

GRE(Generic Routing Encapsulation,通用路由封裝)是一種 IP-over-IP 的隧道協定(Tunneling Protocol),可以在虛擬對等鏈路中封裝多種網路層協定,是現今主要使用的 Overlay 網路技術之一。GRE 是 Cisco 等公司提出的技術,對部分網路層協定進行封裝並在 IPv4/IPv6 網路中傳輸,簡單說就是一種協定封裝格式,定義了如何用一種網路協定去封裝另一種網路協定。

簡單說 GRE Tunnel 原理,當我們讓兩台網路介面建立了私有通道時。當封包傳送給對方時,會將封包丟到建立 GRE Tunnel的邏輯介面進行轉送,當資料抵達另一方的邏輯介面時,在將被封裝成 GRE 的封包恢復成原始狀態傳送給目的地,因此取得的封包是乾淨的。

GRE 有以下優缺點:

  • 可跨區域部署的 L3 通道技術。
  • 使用 4 bytes 的 segment id 來通當 vlan id 的租戶隔離。
  • 基於點對點通道協定(Point to Point Tunneling Protocol),每兩個點需要有一個通道,對於第四層網路埠口(port)資源是一種浪費。
  • 增加 IP Header,因此會減少 Instance 的 MTU 值,因此會影響傳輸效率。
  • 不支援群組廣播,同網路中的一個虛擬機發送廣播 frame 後,GRE 會將其廣播到所有與該節點有通道連接的節點。
  • GRE 封裝的 IP 封包過濾與負載平衡問題,有許多第三層網路與防火牆裝置無法解析。

在實作前先看看待會我們要實作的架構

gre_tunnel.png
host 1 和 host 2 透過 Gre Tunnel 進行通訊

現在就開始準備實作吧!!首先準備兩個VM環境
VM 1 配置IP為 192.168.100.3
VM 2 配置IP為 192.168.100.4

[ VM 1 配置]

Screenshot from 2018-04-07 22-32-57.png

開啟兩個terminal分別執行Ryu Controller和Mininet
[ Ryu ]
# ryu-manager –verbose ryu/app/simple_switch_13.py

[ Mininet ]
# mn –topo=single,1 –controller=remote

Screenshot from 2018-04-07 22-36-11.png
VM 1 執行  Ryu Controller 和 Mininet

[ VM 2 配置]

Screenshot from 2018-04-07 22-38-32

開啟terminal執行Mininet

[ Mininet ]
# mn –topo=single,1

Screenshot from 2018-04-07 22-39-26
VM 2 只執行 Mininet,和 VM 1 不一樣喔 !! 

#更改VM 2 host 1 的IP 為 10.0.0.2 (避免重複)

ifconfig h1-eth0 inet 10.0.0.2

Screenshot from 2018-04-07 22-41-29.png

此時測試host 1 和 host 2 是否可以通訊 ?

Screenshot from 2018-04-07 22-42-55-2.png

Screenshot from 2018-04-07 22-42-29.png

#設定Gre Tunnel
[host 1] ovs-vsctl add-port s1 s1-gre1 — set interface s1-gre1 type=gre options:remote_ip=192.168.100.4
———————————————————-
[host 2] ovs-vsctl add-port s1 s1-gre1 — set interface s1-gre1 type=gre options:remote_ip=192.168.100.3

Screenshot from 2018-04-07 22-44-21-2.png
VM 1 host1 的gre tunnel 配置
Screenshot from 2018-04-07 22-45-10.png
VM 2 host2 的gre tunnel 配置

設定完gre tunnel 後host間可以進行通訊了

Screenshot from 2018-04-07 22-45-37.png

Screenshot from 2018-04-07 22-45-21

 

 

 

 

 

 

 

【Gogobee 機車衛星導航實測】

對有關交通相關議題充滿興趣的阿寬,偶然在一次滑facebook,被一個商品廣告所吸引,於是就不小心點進去了商品頁面,抱持著好奇姑且一試的心態,而且現在官網正好特價,在這樣的因緣際會下,這台「小黃」成為了我的新寵

螢幕快照 2018-04-05 上午8.28.25.png
官方網站打折頁面
螢幕快照 2018-04-05 上午8.28.33.png
我選購了「重機超值包」的版本

gogobee 來看鏡頭

20180405_014324.jpg

20180405_075636.jpg
內容物有本體機器 x 1 + 固定支架 x 1 + 磁吸座包 x 1 + App 授權帳號 x 1
20180405_014801.jpg
現在將機器和固定支架合體吧

 

好啦!本篇的重點在於Gogobee的導航實測,好像花太多的時間在開箱了,事不宜遲,我們就開始實測吧

這次的實測路線為 新北市新店區溪園路389號 —-> 台北市文山區指南路二段64號(政治大學)

螢幕快照 2018-04-05 上午10.33.38
平常都是走這條,不知道「小黃」想怎麼走
Screenshot_20180405-071943.png
「小黃」想走的路線,和我預估的路線一模一樣,我們還真有“默契”呢 !!
  • 起點出發
20180405_071123.jpg
小黃和黑色的車身可以說是「天作之合」!!搭配起來挺好看的
  • 拯救「小黃」大作戰:
    才出發沒多久我就看到「小黃」隨著機車後照鏡震動的很劇烈,主人深怕他摔落地面,於是暫且停在路邊重新調整鬆緊度,讓他不至於震動的太劇烈
20180405_071615.jpg
調整完後真的有好很多,原來是固定支架沒有緊緊貼牢後照鏡
  • 新人難免會緊張嘛!!
    大概到了考試院附近 ( 可能怕考試吧 XD ),就發現「小黃」緊張的一直跟我說靠右前方走,但其實這條路 ( 木柵路一段 )是直線的,有點不懂它想要幹嘛,好拉!念在你的「第一次」,我就原諒你這次的小失誤
20180405_072126.jpg
一直叫我靠右前方走,但我沒有要右轉啊!!
  • 這次這樣就對了
    剛好前方就是「Y」字路口,依照路徑規劃的確是要往右前方 ( 木柵路二段 ) 移動,這次「小黃」叫的特別賣力,在等紅燈的同時,隔壁的騎士都紛紛被「小黃」所吸引,彷彿好像是要彌補上次所犯下的錯誤
20180405_072445.jpg
Good Job !!
  • 最後一哩路:
    下了道南橋後其實就到了政大的校區了,蠻好奇定位的準度,於是我就繼續騎到政大的校門口看看會有什麼結果呢?
20180405_073622.jpg
加油「小黃」,目的地就在前面了
20180405_073744.jpg
也太厲害了,剛好到學校門口導航結束,恭喜「小黃」順利完成任務

 

使用心得:

以下分「外表」和「內在」來做分享,外型方面的設計感很有簡約的風格,運用外框的燈號表示方向,中間數字表示要轉彎的剩下距離,介面上讓人淺顯易懂,且操作上不會有太多繁雜的步驟,其操作主要都是在App上,對於平常有習慣使用導航App的人算非常容易上手,另外固定支架上的設計也別有巧思,有別於傳統手機支架,同時兼具美感與實用性

在導航部分也算是表現的不錯,比我預期中的還要好,當初想說「小黃」裡面沒有GPS晶片,完全仰賴手機的GPS,而且騎車過程中我手機放在口袋,訊號難免會有些不穩定,當然使用GPS本來就會有誤差,但「小黃」的表現還蠻不錯的!!轉彎時的提示音也蠻大聲的,在吵雜的車流環境中也聽得到,不至於錯過轉彎,如果真的覺得太大聲的話,可以去App裡面做警示音的音量調整

評價(各項滿分5分):
定位精準      ★★★★☆ 4分
外觀設計      ★★★★☆ 4分
支架穩固      ★★★★★ 5分
電力續航      ★★★☆☆ 3分

[ 小提醒 ]

  • 對於不熟的路使用「小黃」前,建議先看一下App所規劃的路線,多少對路要稍微有印象,不然如果騎快一點或GPS反應較慢時,容易錯過重要的轉彎路口
  • 固定支架盡量緊貼機車的照後鏡,以免「小黃」摔落受傷
  • 遇到沒有GPS訊號或者是進入到室內時,「小黃」會暫時迷失方向,開始亂報方向,所以如果不熟路況會被帶著亂走,不過這也是GPS衛星導航的通病,平常我們用手機的導航App也會常有訊號迷失的情況
  • 在導航App中記得要調成「機車」模式,不然「小黃」有機會帶你去高速公路兜兜風喔!!還好我對文山區的路算熟悉,不然有一次就差點騎上了“信義快速道路”了
20180405_074514.jpg
緊貼照正面
20180405_074653.jpg
緊貼照側面
20180405_074711.jpg
緊貼照背面

 

 

【SDN Switch Flow Table 設定 — 使用MiniNam 】

上一篇提到關於MiniNam的安裝,現在我們就以MiniNam為例子,研究關於SDN Switch上Flow Table的設定吧

  • 考慮一個環狀的網路拓樸(ring)

    Screenshot from 2018-04-03 23-00-48.png
    自定義環狀拓樸語法如上
  • 同時執行Ryu controller 和 MiniNam

    [ Ryu ]
    ryu-manager –verbose –observe-links ryu/app/rest_topology.py ryu/app/ofctl_rest.py ryu/app/simple_switch_13.py

    [ MiniNam ]
    ./MiniNam –custom topo_new4.py –topo myoop –controller remote

    Screenshot from 2018-04-03 23-00-57.png

    Screenshot from 2018-04-03 23-01-49.png
    環狀拓樸圖形介面
  • 進行ping測試,兩主機間彼此不相通,為什麼?Screenshot from 2018-04-03 23-02-32
  • Ryu ofctl API 介紹

    #取得所有Switch資訊
    $ curl -X GET http://localhost:8080/stats/switches (localhost可用127.0.0.1取代)

    # 獲得單一Switch上目前設定的Flow Table規則
    $ curl -X GET http://localhost:8080/stats/flow/<Switch的dpid&gt;

    Screenshot from 2018-04-03 23-03-36.png
    Screenshot from 2018-04-03 23-03-44.png

    Screenshot from 2018-04-03 23-09-52
    系統預設有兩條flow entry,其中「Output: 4294967293」表示直接將封包交由給Controller做處理,第一條和第二條的差別在於match欄位,第一條將比對到的“01:80:c2:00:00:0e”(系統保留mac)交給controller執行

    第二/三/四台switch其flow entry同第一台,故省略

  • 在開始新增flow entry前,我們要先了解dpid和port的關係
    Screenshot from 2018-04-04 01-40-10.png
    比對switches 和 interface 便可得知其關係

    Screenshot from 2018-04-03 23-01-49-5.png
    其對應 port 關係如圖所示
  • 開始新增flow entry至switch

    # 新增指令
    curl -X POST -d {要送到SWITCH的FLOW ENTRY} http://127.0.0.1:8080/stats/flowentry/add

    Screenshot from 2018-04-03 23-14-51.png
    新增6比flow entry至switch 1
    Screenshot from 2018-04-03 23-01-49
    分別加入的這6筆封包流向
    Screenshot from 2018-04-03 23-17-27
    新增2筆flow entry 至 switch 2

    Screenshot from 2018-04-03 23-01-49-2.png

    Screenshot from 2018-04-03 23-18-42.png

    Screenshot from 2018-04-03 23-01-49-3.png

    Screenshot from 2018-04-03 23-19-22.png

    Screenshot from 2018-04-03 23-01-49-4

  • ping 測試
    Screenshot from 2018-04-03 23-21-11.png
    h1 ping h2 成功

    Screenshot from 2018-04-03 23-22-28.png
    h2 ping h1 成功
  • 上述已成功完成flow entry雙向設定,也就是說h1和 h2 之間有兩條路徑可走,接下來我們只設定單向的路由(順時針方向)
    Screenshot from 2018-04-04 01-44-47
    switch 1 設定
    Screenshot from 2018-04-04 01-45-23.png
    switch 2 設定
    Screenshot from 2018-04-04 01-46-54.png
    switch 3 設定

    Screenshot from 2018-04-04 01-47-17.png
    switch 4 設定
  • h1 和 h2 可相互ping 通,且封包走順時針方向

 

【MiniNam 視覺化網路拓墣模擬器】

之前使用mininet原生的模擬器套件,偶然發現「OpenState SDN」機構竟然也有類似mininet的圖形化介面,而且其整合性功能還比mininet齊全,其中最吸引人的地方是有封包傳輸過程中的模擬動畫,於是就來安裝看看

(參考網站 http://www.cs.ucc.ie/~ak18/MiniNAM/examples)
——————————— 安裝流程 ——————————-

  • 安裝以下指令前請先確認Mininet和Ryu均已正確安裝
  • 安裝OpenState所需要的相關套件

    bash -c “$(wget -O – http://openstate-sdn.org/install.sh)"

    Screenshot from 2018-04-03 07-27-11

    Screenshot from 2018-04-03 07-34-53.png
    OpenState會自動安裝缺少的套件
  • 下載MiniNam主程式並解壓縮

    wget http://www.cs.ucc.ie/~ak18/MiniNAM/code/MiniNAM.tar.gz

    Screenshot from 2018-04-03 07-40-01.png

  • 賦予位於MiniNam目錄底下的「paping」和「MiniNam」檔案執行權限

    sudo chmod +x paping
    sudo chmod +x MiniNAM

    Screenshot from 2018-04-03 07-42-16.png

  • 執行Ryu Controller和MiniNam,步驟類似於Ryu和MiniNet

    [ Ryu ]
    ryu-manager –verbose ryu/app/simple_switch_13.py

    [ MiniNam ]
    ./MiniNam –topo single,4 –controller remote

    Screenshot from 2018-04-03 07-43-48.png

    Screenshot from 2018-04-03 07-44-09.png
    執行MiniNam後會自動跳出網路拓墣出來
  • MiniNam偏好設定

    主要可以設定動畫的速度,顯示的封包內容,是否開啟CLI命令列等

    Screenshot from 2018-04-03 07-44-31.png

  • MiniNam介面統計

    主要顯示目前各個介面已傳送/接收的封包數

    Screenshot from 2018-04-03 07-44-57.png

  • pingall封包測試
    Screenshot from 2018-04-03 07-45-58.png
    將Start CLI打勾後按下OK

    Screenshot from 2018-04-03 07-46-51.png
    執行pingall指令後可以看到封包的動畫