關於TTS(元組空間搜索算法)的詳細介紹能夠參考OVS+DPDK Datapath 包分類技術這篇文章,本文只對該篇博客進行簡單的介紹,其中案例和部分圖片來自於OVS+DPDK Datapath 包分類技術html
如下爲具體的例子:算法
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
如下爲具體的例子: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
以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去作散列,便是哈希表的索引索引
下面以ovs中具體的事例進行說明:圖片
能夠看到,同一個哈希表中的mask都是相同的,也就是說每個tuple對應一個表
而後與HT 2對應的mask進行查找,查詢到對應的結果ip
經過上述步驟能夠看出來,TTS中的時間複雜度與Tuple的數量相關,若是Tuple的數量越多,則耗費的時間越長,當Tuple的數量==表項的數量,此時等同於挨個遍歷全部的表項
在上一篇博文中,其中Megaflow Cache的實現就是採用了TTS,在以下圖中,每一個megaflow cache的表項對應TTS中的rule
具體的實現結構以下圖,在最新的ovs中採用的是Mircroflow cache和Megaflow Cache結合的方式,其中能夠看到Megaflow Cache是經過鏈表的形式進行組合的,sw_flow_mask結構體至關因而mask(TTS中的tuple),sw_flow結構體至關因而rule,其中Microflow cache中存放的是上次訪問的sw_flow_mask索引,具體的流程會在接下來的博客進行詳細的介紹。
做者: yearsj
轉載請註明出處: https://segmentfault.com/a/11...