Using OpenFlow 1.3
RYU
SDN Framework
RYU project team
Contents
前言
1 交換器(Switching Hub )
.
.
.
.
.
.
1.1
1.2
1.3 在 Ryu 上實作交換器 .
1.4 執行 Ryu 應用程式 .
.
1.5 本章總結 .
.
.
Switching Hub .
.
OpenFlow 實作的交換器 .
.
.
.
.
.
.
.
.
.
.
2 流量監控(Traffic Monitor )
2.1 定期檢查網路狀態 .
2.2 安裝 Traffic Monitor .
.
2.3 執行 Traffic Monitor .
.
2.4 本章總結 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
.
.
.
.
.
.
.
.
REST API
3.1 整合 REST API
.
3.2 安裝包含 REST API 的 Switching Hub
3.3 安裝 SimpleSwitchRest13 class .
.
.
3.4 安裝 SimpleSwitchController Class .
.
3.5 執行包含 REST API 的 Switching Hub
3.6 本章總結 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 網路聚合(Link Aggregation )
4.1 網路聚合(Link Aggregation ) .
4.2 執行 Ryu 應用程式 .
.
.
4.3 實作 Ryu 的網路聚合功能 .
.
4.4 本章總結 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 生成樹(Spanning Tree )
.
Spanning Tree .
.
.
5.1
.
.
5.2 執行 Ryu 應用程式 .
.
5.3 使用 OpenFlow 完成生成樹 .
5.4 使用 Ryu 實作生成樹 .
.
5.5 本章總結 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6 OpenFlow 通訊協定
.
Match .
6.1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
3
3
3
5
14
19
21
21
21
27
29
31
31
31
33
34
36
38
39
39
39
50
59
61
61
63
73
74
83
85
85
.
.
.
.
.
.
.
86
87
89
89
89
90
93
93
95
99
99
.
.
99
. 100
101
. 101
. 110
. 114
117
. 117
. 127
. 139
141
. 141
. 143
. 146
155
. 155
157
. 157
. 157
. 158
159
. 159
. 159
6.2
6.3
Instruction .
.
Action .
.
.
.
.
.
.
.
7
ofproto 函式庫
7.1 簡單說明 .
.
7.2 相關模組 .
.
7.3 基本使用方法 .
.
.
8 封包函式庫
8.1 基本使用方法 .
8.2 應用程式範例 .
9 OF-Config 函式庫
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9.1
9.2 函式庫架構 .
9.3 使用範例 .
.
OF-Config 通訊協定 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10 防火牆(Firewall )
Single tenant 操作範例 .
10.1
10.2 Multi tenant 操作範例 .
.
10.3
REST API 列表 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11 路由器(Router )
11.1
11.2 Multi-tenant 的操作範例 .
11.3
.
Single Tenant 的操作範例 .
.
.
REST API 列表 .
.
.
.
.
12 OpenFlow 交換器測試工具
.
.
12.1 測試工具概要 .
.
12.2 使用方法 .
.
.
12.3 測試工具使用範例 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
13 組織架構
13.1 應用程式開發模型(Application programming model ) .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14 協助專案開發
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14.1 參與專案 .
.
14.2 開發環境 .
.
14.3 送交更新的程式碼 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
15 應用案例
15.1
15.2
Stratosphere SDN Platform (Stratosphere)
.
SmartSDN Controller(NTT COMWARE ) .
.
前言
本書是給那些使用 Ryu 作為開發的框架,而目的是為了實現軟體定義網路(Software Defined
Networking,SDN )而寫的一本參考書。
那麼為什麼要選擇 Ryu 作為開發平台呢?
我們衷心的希望您可以在本書中找到解答。
建議您依照本書的章節,依序的閱讀第 1 章至第 5 章。首先第 1 章是 Simple Switch 的實作,接
著後面的章節是流量監控(Traffic Monitor )以及網路聚合(Link Aggregation )。透過實際的例子,
我們將介紹 Ryu 的程式是如何運作的。
第 6 章到第 9 章,我們將詳細的說明 OpenFlow 通訊協定(OpenFlow Protocol )以及封包函數的使
用方法。接著第 10 章到第 12 章,我們會討論如何使用 Ryu 內建的防火牆(Firewall )和測試工
具(test tool )來開發應用程式。第 13 到 15 章將介紹 Ryu 的架構(architecture )及實際應用案例。
最後,我們非常感謝您對於 Ryu 專案的青睞及支持,特別對於 Ryu 的使用者而言。希望在不久
的將來能有機會在 Mailing List 上得到來自于您的寶貴意見,讓我們一起加入 Ryu 專案並進行開
發吧。
繁體中文版本是由台灣資訊工業策進會- SDN 團隊協助整理及翻譯,除了不吝批評與指教之外
也歡迎更多朋友加入,讓中文讀者可以更快更即時的了解 Ryu 這個優秀的開放原始碼的框架。
交換器( )
本章將會用簡單的 Switching hub 安裝做為題材,說明 Ryu 如何安裝一個應用程式。
在交換器中有許許多多的功能。在這邊我們將看到擁有下列簡單功能的交換器。
· 學習連接到連接埠的 host 之 MAC 位址,並記錄在 MAC 位址表當中。
· 對於已經記錄下來的 MAC 位址,若是收到送往該 MAC 位址的封包,則轉送該封包到相對
應的連接埠。
· 對於未指定目標位址的封包,則執行 Flooding。
讓我們使用 Ryu 來實現這樣一個交換器吧。
實作的交換器
OpenFlow 交換器會接受來自于 controller 的指令並達到以下功能。
· 對於接收到的封包進行修改或針對指定的連接埠進行轉送。
· 對於接收到的封包進行轉送到 Controller 的動作(Packet-In )。
· 對於接收到來自 Controller 的封包轉送到指定的連接埠(Packet-Out )。
上述的功能所組合起來的就是一台交換器的實現。
首先,利用 Packet-In 的功能來達到 MAC 位址的學習。Controller 使用 Packet-In 接收來自交換器的
封包之後進行分析,得到連接埠相關資料以及所連接的 host 之 MAC 位址。
在學習之後,對所收到的封包進行轉送。將封包的目的位址,在已經學習的 host 資料中進行檢
索,根據檢索的結果會進行下列處理。
· 如果是已經存在記錄中的 host:使用 Packet-Out 功能轉送至先前所對應的連接埠
· 如果是尚未存在記錄中的 host:使用 Packet-Out 功能來達到 Flooding
下面將一步一步的說明並附上圖片以幫助理解。
1. 初始狀態
交換器( )
Flow table 為空白的狀況。
將 host A 接到連接埠 1,host B 接到連接埠 4,host C 接到連接埠 3。
1
2
3
4
MAC address table
Flow table
Host A
Host C
Host B
2. host A → host B
當 host A 向 host B 發送封包。這時後會觸發 Packet-In 訊息。host A 的 MAC 位址
會被連接埠 1 給記錄下來。由於 host B 的 MAC 位址尚未被學習,因此會進行
Flooding 並將封包往 host B 和 host C 發送。
1
2
3
4
MAC address table
Host A: Port 1
Flow table
Host A
Host C
Host B
Packet-In:
Packet-Out:
3. host B → host A
封包從 host B 向 host A 返回時,在 Flow table 中新增一筆 Flow Entry,並將封包轉
送到連接埠 1。因此該封包並不會被 host C 收到。
在 上實作交換器
1
2
3
4
MAC address table
Host A: Port 1
Host B: Port 4
Flow table
in-port:4, eth-dst:Host A
-> output: Port 1
Host A
Host C
Host B
Packet-In:
Packet-Out:
4. host A → host B
再一次,host A 向 host B 發送封包,在 Flow table 中新增一個 Flow Entry 接著轉送
封包到連接埠 4。
1
2
3
4
MAC address table
Host A: Port 1
Host B: Port 4
Flow table
in-port:4, eth-dst:Host A
-> output: Port 1
in-port:1, eth-dst:Host B
-> output: Port 4
Host A
Host C
Host B
Packet-In:
Packet-Out:
接下來,讓我們實際來看一下在 Ryu 當中實作交換器的原始碼。
在 上實作交換器
Ryu 的原始碼之中有提供交換器的程式原始碼。