ovs源碼閱讀--元組空間搜索算法

關於TTS(元組空間搜索算法)的詳細介紹能夠參考OVS+DPDK Datapath 包分類技術這篇文章,本文只對該篇博客進行簡單的介紹,其中案例和部分圖片來自於OVS+DPDK Datapath 包分類技術html

TTS算法主要組成部分

Rule : 單條的包過濾規則+動做

如下爲具體的例子:算法

1 Rule #1: ip_src=192.168.0.0/16 ip_dst=0/0 protocol=0/0 port_src=0/0 port_dst=0/0
2 Rule #2: ip_src=0/0 ip_dst=23.23.233.0/24 protocol=6/8(TCP) port_src=0/0 port_dst=23/16 
3 Rule #3: ip_src=0/0 ip_dst=11.11.233.0/24 protocol=17/8(UDP) port_dst=0/0 port_dst=4789/16
4 Rule #4: ip_src=10.10.0.0/16 ip_dst=0/0 protocol=0/0 port_src=0/0 port_dst=0/0

能夠看到一個rule中有多個字段,每一個字段的形式爲 :字段值/掩碼前綴segmentfault

Tuple : 使用相同的匹配字段+每一個匹配字段都使用相同的掩碼長度

如下爲具體的例子:spa

1 Tuple #1: ip_src_mask=16 ip_dst_mask=0 protocol_mask=0 port_src_mask=0 port_dst_mask=0
2 Tuple #2: ip_src_mask=0 ip_dst_mask=24 protocol_mask=8 port_src_mask=0 port_dst_mask=16

tuple是將有相同規則的rule進行合併,例如上述rule #1和rule #4能夠當作是同一個tuple #1,由於其每一個字段的掩碼都相同,因此tuple有以下特色:code

  1. 使用相同的匹配字段
  2. 每一個匹配字段都使用相同的掩碼長度

Key:用於hash

以Tuple #2中的Rule #2爲例說明一下,首先用tuple的掩碼去rule中的各個字段值,丟棄tuple不關心的位,獲得:htm

ip_src=_ ip_dst=23.23.233 protocol=6 port_src=_ port_dst=23

而後把這些位拼接起來,就是哈希表的key,轉換爲二進制以下:blog

key = 0001 0111(23) 0001 0111(23) 1110 1001(233) 0000 0110(6) 0000 0000 0001 0111(23)

最後,用這個key去作散列,便是哈希表的索引索引

匹配過程

  • 全部的rule都被分紅了多個tuple,並存儲在相應tuple下的哈希表中
  • 當要對一個包進行匹配時,將遍歷這多個tuple下的哈希表,一個一個查過去,查出全部匹配成功的結果,而後按必定策略在匹配結果中選出最優的一個。

下面以ovs中具體的事例進行說明:圖片

  1. 首先添加一個rule #1,該rule建立的過程當中會建立對應的掩碼(mask FF.FF.FF.00),也就是TTS中的Tuple,而後rule與mask進行與操做生成key,經過key進行散列獲得一個索引值,最終將該rule #1加入到hash表HT 1對應的索引中

img

能夠看到,同一個哈希表中的mask都是相同的,也就是說每個tuple對應一個表
  1. 接下來收到一個包packet #1,以下圖所示,該包查找的過程當中,會與全部的hash表進行匹配,因爲目前只有一個表HT 1,因此該包會與HT 1對應的mask進行與運算,對其結果進行散列後查到對應表中的結果

img

  1. 同步驟1,此時又來了一個rule #2,按照一樣的步驟,建立一個新的表HT 2

img

  1. 收到另外一個包Packet #2,同步驟2進行查找,首先與HT 1對應的mask進行匹配查找,沒法找到結果

img

而後與HT 2對應的mask進行查找,查詢到對應的結果ip

img

經過上述步驟能夠看出來,TTS中的時間複雜度與Tuple的數量相關,若是Tuple的數量越多,則耗費的時間越長,當Tuple的數量==表項的數量,此時等同於挨個遍歷全部的表項

OVS與TTS

上一篇博文中,其中Megaflow Cache的實現就是採用了TTS,在以下圖中,每一個megaflow cache的表項對應TTS中的rule2401853394-5b7d444466240_articlex

具體的實現結構以下圖,在最新的ovs中採用的是Mircroflow cache和Megaflow Cache結合的方式,其中能夠看到Megaflow Cache是經過鏈表的形式進行組合的,sw_flow_mask結構體至關因而mask(TTS中的tuple),sw_flow結構體至關因而rule,其中Microflow cache中存放的是上次訪問的sw_flow_mask索引,具體的流程會在接下來的博客進行詳細的介紹。

流表查詢_gaitubao_com_watermark

參考資料

OVS+DPDK Datapath 包分類技術

做者: yearsj
轉載請註明出處: https://segmentfault.com/a/11...
相關文章
相關標籤/搜索