這篇文章將說明當收到網路封包時,OpenFlow協定是怎樣在多個Flow Table中進行比對的動作,以及詳細說明當中會如何處理的整個過程。
一般來說,Table Miss Entry並不會存在,必須是手動增加或移除,而且Table Miss Entry也和一般的Flow Entry一樣會逾時,一樣有時效性。而若沒有這樣Table Miss Entry的話,預設上會把這樣的網路封包給丟棄。不過,可以透過調整整台交換機的設定來決定這樣的預設行為。
Flow Entry優先序
在某一個Flow Table尋找Flow Entry時,事實上只會取出優先序最高的Flow Entry,也只有優先序最高的Flow Entry中的動作會被執行。如果有多個符合的Flow Entry,而剛好它們的優先序又一樣時,會怎麼辦呢?此時這些Flow Entry將會被認為是Undefined。如果想要避免這種情況的發生,可以把OFPFF_CHECK_OVERLAP這個bit設定起來,系統就會去檢查這種可能重複選取的Flow Entry。
Flow Entry的移除
一般來說,Flow Entry有三種情況會從Flow Table中被移除。有可能是由Controller來要求移除Flow Entry,或是透過交換機的逾時機制,或是交換機的移除機制(Eviction Mechanism),以下針對這幾種不同的情況來做介紹。
交換機的逾時機制和Controller機制是完全分開來的,這個逾時機制與Flow Entry的設定以及當下的現況有關。之前提過,一個Flow Entry會包含比對欄位、優先序、計數器、執行動作、逾時時間以及Cookie等資料。
其中,逾時時間代表著多久以後這筆Flow Entry就應該要被移除。而與逾時時間有關的設定,詳細來說包含兩個值,一個是idle_timeout,另外一個是hard_timeout。這兩個值只要其中一個的設定不是零,那麼這個交換機就必須記錄下時間以便於得知何時要將這筆Flow Entry移除。
兩者的差別在於,hard_timeout指的是一旦這筆Flow Entry產生之後,就開始記錄時間,一旦指定的秒數過去了,無論是否有多少網路封包符合這筆Flow Entry的條件,就直接把這筆Flow Entry移除。而idle_timeout則是去記錄最後一次符合這筆Flow Entry的時間,一旦開始沒有符合這筆Flow Entry,直到過了指定的秒數,就把這筆Flow Entry移除。
而Controller直接要求移除Flow Entry的方式,是藉由送出刪除的要求訊息:OFPFC_DELETE或是OFPFC_DELETE_STRICT。這兩種不同的訊息,之後的文章會再詳細介紹。而如果Controller刪除了一整個Group或Meter,Flow Entry也會被移除。
最後一種就是移除機制,這種機制通常使用在當交換機需要更多資源的時候,就會透過這種方式來強迫取得較多的資源。而這種移除機制可有可無,當交換機在選擇要刪除哪一個Flow Entry時,可能會參考Flow Entry的設定,或是交換機可能的限制等等。
無論交換機是透過上述哪一種方式來刪除Flow Entry,交換機都必須檢查Flow Entry的OFPFF_SEND_FLOW_REM這個Flag,如果這個Flag被設定起來,則交換機必須傳送一個Flow Entry刪除的訊息告知Controller,這個訊息裡面會包含所有有關這個Flow Entry刪除的資訊,包含用哪一種方式來刪除、這個Flow Entry在刪除之前已經存在了多久,以及其他關於刪除的所有資訊。
結語
本篇文章的主軸是當網路封包抵達交換機時,交換機之OpenFlow詳細的Pipeline處理過程,以及其中最重要的比對過程,而比對過程需要用到的Flow Entry,在Flow Table中的存在過程也都被詳細介紹。在這篇文章中,最好注意一下Goto與Table Miss的設計,另外要留意的則是Flow Entry的移除。
<本文作者:胡凱智,目前在Solera Holdings Inc.擔任亞太區首席技術長,曾於美商Mozilla擔任全球技術專案總監,並在趨勢科技任職七年多,有兩年美國矽谷工作經驗,在美國專利局擁有軟體專利。讀者交流建議:https://www.facebook.com/khu.page>