Ryu Controller 運作原理

转载https://ting-kuan.blog/2018/04/12/%E3%80%90ryu-controller-%E9%81%8B%E4%BD%9C%E5%8E%9F%E7%90%86%E3%80%91/

當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
原文地址:https://www.cnblogs.com/dream397/p/12956140.html