OpenFlow Switch學習筆記(三)——Flow Tables


  這次我們主要討論下OpenFlow Switch的核心組件之一——Flow Tables,以了解其內部的 matching 以及 action handling 機制。下文將會分為幾個部分來逐步詳述OpenFlow Switch內部數據包的流轉機制。

 

1、Pipeline Processing

  遵循OpenFlow Switch規范的OpenFlow交換機大致分為 OpenFlow-only 和 OpenFlow-hybrid 兩類。OpenFlow-only 交換機僅僅只支持OpenFlow規范定義的操作,所有經過該類交換機的數據包僅僅只能被 OpenFlow Pipeline 處理,而不能被其他方式處理。而 OpenFlow-hybrid 交換機既支持OpenFlow規范定義的操作,又支持傳統交換機規定的操作,比如傳統的L2交換、VLAN隔離、L3路由、ACL以及QoS處理等。該類交換機必須要提供一種除OpenFlow Switch規范約定的能將經過它的數據包轉發到OpenFlow Pipeline處理,也能轉發到Normal Pipeline處理特性之外的分類機制,比如交換機可以根據數據包的VLAN tag或者ingress port來決定使用某個Pipeline來處理,或者可能將所有的數據包直接轉發到OpenFlow Pipeline處理。OpenFlow-hybrid 交換機也可能將來自於 OpenFlow Pipeline 處理后的數據包通過 NORMAL 或者 FLOOD Reserved Port 轉發到 Normal Pipeline 繼續處理。

  OpenFlow Pipeline由多個Flow Tables組成,而每個Flow Table又包含有多個Flow Entries。Pipeline Processing定義了數據包如何與這些Flow Tables進行交互,一個OpenFlow Switch至少得有一個Flow Table,或者有多個。當Pipeline有多個Flow Tables時,這些Flow Tables是按照數字順序排列的,起始索引號從 0 開始,任何進入到OpenFlow Switch的數據包都會從Pipeline的第一個Flow Table,即 Table 0 開始處理,后續的Flow Table可能會被使用到,而這依賴於Table 0中匹配成功的Flow Entry的輸出結果。

  當一個數據包被一個Flow Table處理時,數據包會被逐次地依據Priority與該Flow Table里的所有Flow Entry進行匹配,當發現匹配成功的Flow Entry時,該Flow Entry相關聯的Instructions Set將會被執行,這些Instructions可能會將該數據包顯示地直接轉發到后續的其他Flow Table里(通過Goto指令)繼續處理,在那里繼續采取同樣的方式來處理數據包。這里需要注意的是,Flow Entry只會將數據包繼續往前(往索引號比當前大的Flow Table)轉發,而不會倒序轉發,因此,OpenFlow Pipeline的最后一個Flow Table不能再包含Goto指令,如果某個匹配成功的Flow Entry不能將數據包繼續轉發到后續的Flow Table,那么整個Pipeline Processing將在此終止,此時與該數據包關聯的Actions將會被執行,通常是數據包被轉發走。

  假若一個數據包在一個Flow Table里沒有發現能夠匹配成功的Flow Entry,那么這叫作一次Table Miss,至於發生Table Miss后的動作取決於這個Flow Table的配置:1)直接丟棄,2)繼續轉發給后續的Flow Table,3)封裝成 packet-in 消息發送給Remote Controller。

 

2、Flow Table

  一個Flow Table大致包含如下幾部分:

Match Fields:匹配域,可能包含ingress port、數據包頭信息以及前繼Flow Table傳過來的Metadata值域等

Priority:匹配優先級

Counters:計數器,統計與該Flow Entry成功匹配的包數量

Instructions:指令集,應用到與該Flow Entry成功匹配的數據包

Timeouts:在該Flow Entry過期前的最大有效時間或者空閑時間

Cookie:被Remote Controller用來篩選Flow Statistics、Flow Modification或者Flow Deletion行為的指示值

一個Flow Entry在Flow Table中通過Match Fields和Priority兩個字段來唯一標識(或稱為聯合主鍵)。這里注意,每個Flow Table中可能會有一個Table Miss Flow Entry,它是專門用來處理該Flow Table中沒有其他Flow Entry能否匹配成功的數據包的,它的特點是它的Match Fields能夠匹配任何數據包,並且Priority一定是0。

 

3、Flow Removal

  Flow Entry可以通過三種方式從Flow Table里被移除:1)通過Remote Controller直接發送移除Flow Entry的消息,2)通過OpenFlow Switch的過期機制,3)OpenFlow Switch的逐出機制。OpenFlow Switch過期機制的運行行為獨立於Remote Controller,僅依賴於當前Flow Entries的狀態和配置。每一個Flow Entry有一個與之關聯的 idle_timeout 和 hard_timeout,如果 hard_timeout 值不為 0 ,那么OpenFlow Switch需要記住這條Flow Entry的生成時間,當其生存時間達到指定的 hard_timeout 時間時,將被逐出Flow Table,而不管之前有多少個數據包與之成功匹配;如果 idle_timeout 值不為 0 ,那么OpenFlow Switch需要記住最后一次與該Flow Entry成功匹配的時間,當超過指定 idle_timeout 時間仍未有能成功匹配的數據包,那么該Flow Entry將會被逐出Flow Table。

  Remote Controller也可以發送 Flow Deletion 消息(OFPFC_DELETE 或者 OFPFC_DELETE_STRICT)給OpenFlow Switch;Flow Entries 也可能是由於Group或者Meter的移除而被移除。

  當OpenFlow Switch需要回收資源時,Flow Entries 也有可能被逐出Flow Table。該機制對於OpenFlow Switch實現者來說是一個可選的特性,其必須按照規范來決定哪些Flow Entries被逐出,可能會依照Flow Entry參數、資源映射關系或者其他內部約束等。

  當一個Flow Entry會移除時,OpenFlow Switch必須檢查該Flow Entry的 OFPFF_SEND_FLOW_REM 值,如果該值被設置了,那么必須發送一個Flow Removal消息給Remote Controller,每一個Flow Removal消息都包含一個完整的Flow Entry描述以及被移除的原因說明(過期、主要刪除或者被逐出)、直到刪除這刻該Flow Entry的生存時間以及統計數據等。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM