Openflow協議規範
1 總述
一個Openflow交換機包括一個或者多個流表flow table和一個組表group table。每個流表中每個流條目包括三個部分:(1) 匹配match—使用ingress port,packet header以及前一個flow table傳遞過來的metadata;(2) 計數counter---對匹配成功的包進行計數;(3) 操作instruction—修改action set或者流水線處理.
資料包從第一個流表開始匹配,可能會經歷多個流表,這叫做流水線處理pipeline processing。流水線處理的好處就是允許資料包被髮送到接下來的流表中做進一步處理或者元資料資訊在表中流動。首先,找到流表中優先順序最高的流條目完成匹配,這將根據ingress port,包頭packet header,以及有上一個流表指定的metadata三類匹配域進行。如果某個資料包成功匹配了流表中某個流條目,則更新這個流條目的conter計數,同時這個流條目中的instruction操作將被應用生效。
Pipeline processing終結於instruction中沒有指定下一個流表,這時資料包通常會被所帶有的動作集合action set處理後轉發。
如果資料包發生table miss現象,通常會通過控制通道和packet-in訊息傳送給控制器。
組表裡往往代表一組額外的處理,如flooding、multipath、fast reroute、link aggregation。
2 Openflow Port
Openflow支援三種類型的埠:物理埠(交換機埠),邏輯埠和預留埠。3 Openflow Table
這一節主要講述流表flow table和組表grouptable的組成,以及資料包的匹配和處理動作。
首先(a)圖可以看出,每個資料包是經過流水線pipeline進行處理的,經歷多個flow table的匹配,然後最後在執行action動作後被轉發出去;
(事實上,現在的交換機貌似也是這種pipeline processing的,並且openflow交換機可以通過預留的NORMAL埠轉向現有交換機的normal pipeline處理。)
那麼在每個flow table中是如何處理的呢?主要分為三步:(1) 匹配match。找到流表中優先順序最高的流條目完成匹配,這將根據ingress port,包頭packet header,以及有上一個流表指定的metadata三類匹配域進行。(2) 指令instruction。根據匹配到的流條目增刪改指令集,包括修改包、更新包的匹配域、更新動作集合action set、更新傳遞給下一個流表的metadata;(3) 傳送。將匹配的資料和動作集傳送給下一個流表。4 Openflow counter
5 OpenFlow Instruction
當一個數據包匹配了某個流表條目時,需要執行這個flow entry中的instruction指令,這些instruction指令將改變資料包、action set動作集合或者流水線處理順序。
典型的instruction指令包括以下五類:應用動作apply-action,清空動作clear-action,寫動作write-action,寫源資料write metadata以及轉向動作goto。
6 OpenFlow Action
6.1 Action Set
首先每個資料包都有一個ActionSet.這個ActionSet初始為空,中間可能被每個匹配的flow entry中的Write-Action或Clear-Action指令instruction進行修改,最後在pipleline processing結束的時候被執行。
ActionSet中包含以下九類的action:copy TTL inwards, pop, push, copy TTL outwards, decrement TTL, set, qos,group, output。每個Action Set中只能一類只能有一個action,並且嚴格按照上述順序執行。
6.2 Action List
其次,在Apply-Action指令以及Packet-out訊息中都有ActionList,用於對資料包立即執行action,並且按照Action List裡面指定的順序執行,與action的類別無關。
6.3 Action
Action包含以下幾類:output,set-queue,drop,group,push/pop,set-field,change-TTL7 OpenFlow Message
Openflow支援三類訊息:
1 Controller-to-Switch
控制器所發起的訊息,又分為以下五類:
1) Feature:查詢交換機能力;
2) Configuration:設定或者查詢配置引數;
3) Modify-State:增刪改流表或者組表條目,設定交換機埠屬性
4) Read-State
5) Packet-Out: 比較複雜一些。這個訊息用於控制器指定從交換機的特定埠傳送資料包,或者用於轉發通過Packet-in訊息接收到的資料包。
Packet-out訊息中包含一個完整的資料包或者指標,以及action.
6) Barrier:用於控制器保證訊息的依賴關係或者接收notification
2 Asynchronous
交換機發起的訊息,分為以下四類:
1) Packet-In:對於出現flowentry mismatch的資料包,交換機向控制器傳送packet-in事件。
資料包本身要麼被完全包含在packet-in訊息中,要麼被buffer在交換機中,反正都是等著控制器的Packet-out事件來處理就對了。
2) Flow-Removed: 交換機通知控制器已經沒有了某個流表條目
3) Port-Status:當埠配置或者狀態變化時通知控制器
4) Error
3 Sysmetic
兩方都可以發起的訊息,不用協商,分為以下三類:
1) Hello:交換機和控制器建立起連線後的維護訊息
2) Echo:是Echorequest和reply的配對,常用語檢查liveness,測量延遲和頻寬
3) Experimenter:8 Multiple Controller
一個交換機可以連線多個Equal狀態的控制器,多個Slave狀態的控制器以及最多一個Master狀態的控制器。
為了確保在Master/Slave轉換過程中出現訊息亂序,引入了generation-id。