OpenFlow Switch v1.4.0規范是在2013年10月14號發布,規范涵蓋了OpenFlow Switch各個組件的功能定義、Controller與Switch之間的通信協議Open Flow Protocol等。下文主要是基於個人理解整理的一些學習筆記,理解不到位的地方還請大家多多指教。
一、基礎概念圖:
首先我們先看下Open Flow Switch的整體結構,以便有一個初步的感性認識,如下圖所示:

從上面架構圖中,我們可以看到Open Flow Switch主要是由以下幾個部分構成:
1、Remote Controller:我們知道,SDN網絡將傳統的網絡結構划分成了Control Plane和Data Plane兩部分,這里的Remote Controller正是Control Plane部分,通過約定的通信協議來遠程控制管理OpenFlow Switch,增加、刪除或者修改OpenFlow Switch的Flow Entries。
2、OpenFlow Channel:它可以被認為是OpenFlow Switch對外開放的接口,接受來自於Remote Controller的通信協議,進而來操縱OpenFlow Switch。
3、OpenFlow Protocol:一種通信協議規范,用於Remote Controller和OpenFlow Switch之間的消息交換。
4、Flow Table:包含多個Flow Entry記錄,控制數據包的流向,具體過程可參考下文。
5、Group Table:相對於Flow Table,控制着數據包更高級的轉發特性,比如Flooding、Multipath、Fast Reroute、Link Aggregation等。
6、Pipeline:由多個Flow Table鏈接而成,控制數據包的一系列行為。
二、基礎知識:
一個OpenFlow Switch內包含了一個或多個Flow Tables,以及一個Group Table,而每個Flow Table均包括下面幾項 Flow Entry:1)Match Fields,2)Priority,3)Counters,4)Instructions Set。
當數據包進入到OpenFlow Switch后,首先會從Pipeline的第一個Flow Table開始根據每條Flow Entry的Match Fields項依據其Priority進行match,如果match成功,則會執行Instructions Set里的Actions,這些Actions或者是forward到某個port,或者是drop掉數據包,或者是跳轉到指定的后續Flow Table繼續match,或者是跳轉到Group Table里處理;假若在(或者說后續的)Flow Table里沒有發現能夠match成功,或者match成功但是沒有指定具體Action的數據包,其處理行為依賴於配置選項:1)要么通過OpenFlow Channel將其發送回Remote Controller,2)要么直接drop掉,3)要么將其繼續流轉到后續的Flow Table繼續進行match。
每個Flow Entry的Instructions Set里大致包括這么幾個Action:1)Forwarding,或者說轉發到某個port出去,2)Packet Modification,修改數據包的一些頭信息,3)流轉到Group Table里去繼續處理,4)繼續交由Pipeline中后續的Flow Table處理,在進行Pipeline processing的時候,相鄰兩個Flow Table之間可以以metadata的方式進行數據傳輸。
當某個Flow Entry的Action是將該數據包直接forward到某個port時,這個port或者是物理port,或者是OpenFlow Switch定義的邏輯port,或者是OpenFlow Switch預留的Reserved port。Reserved port主要是用於OpenFlow Switch將數據包發送給Remote Controller,或者進行flooding等等一些其他非OpenFlow Switch規范的操作,而邏輯port主要是用於link aggregation、tunnels、loopback interface等等。
而每個Group Table包含了多個Group Entries,每個Group Entry又包含了一系列依賴於Group Type的Action Buckets,這些Action Buckets里的所有Actions將會全部應用到流轉到Group Table里的數據包。
三、基本術語:
1、Byte:表示一個8位(bit)字節。
2、Packet:表示一個以太網幀,包括頭和數據載體兩部分。
3、Port:Packet流入或者流出OpenFlow Switch的通道口,其或是一個物理port,或是一個OpenFlow Switch定義的邏輯port,或是OpenFlow Switch用於OpenFlow Protocol的Reserved port。
4、Pipeline:由一系列鏈接起來的Flow Tables組成,控制着Packet的流轉。
5、Flow Table:包含多個Flow Entry記錄,控制Packet的流向。
6、Flow Entry:Flow Table中的一條記錄,包含Match Fields,Priority,Counters,Actions Set 四部分。
7、Match Field:Packet 匹配域,可以匹配Packet Header里的某些值域、ingress port、metadata value等,也可以使用匹配通配符。
8、Metadata:在Flow Table之間傳遞消息的載體。
9、Instructions:每個Flow Entry都包含一組Instructions Set,它們控制着Packet的行為,比如直接將該Packet流轉到其他的Flow Table,或者包含一系列Action加入到Action Set里,或者可以立即作用於該Packet的一系列Action。
10、Action Set:一系列Action的集合,這里所有的Action控制着Packet如何流轉出Pipeline processing。
11、Group Table:一組Action Bucket的組合,每個Action Bucket控制着Packet的一些高級行為。
12、Action Bucket:一個Action及其參數的組合,是構成Group Table的元素。
13、Tag:可以插入或者刪除數據的一個頭域。
14、Outermost Tag:Packet最開始位置的Tag。
15、Meter:OpenFlow Switch內部衡量和控制Packet速率的元素,當Packet速率超過了預定義的閥值,會被丟掉。
