15.LPM6庫
LPM6(LPM for IPv6)庫組件實現了128位Key的最長前綴匹配表查找方法,該方法通常用于在IPv6轉發應用程序中找到最佳匹配路由。
15.1.LPM6 API概述
LPM6庫主要配置參數有:
- 支持的LPM規則最大數目:這定義了保存規則的表的大小,也就是最多可以添加的規則數目。
- tbl8的數量:tbl8是trie的一個節點,是LPM6算法的基礎。
tbl8與您可以擁有的規則數量相關,但無法準確預測持有特定數量規則所需的空間,因為它強烈依賴于每個規則的深度和IP地址。一個tbl8消耗1 kb的內存。作為推薦,65536個tbl8應該足以存儲數千個IPv6規則,但可能因情況而異。
LPM前綴由一對參數(128位Key,深度)表示,深度范圍為1到128。LPM規則由LPM前綴和與前綴相關聯的一些用戶數據表示。該前綴作為LPM規則的唯一標識符。在當前實現中,用戶數據為21位長,稱為“下一跳”,對應于其主要用途,用于存儲路由表條目中下一跳的ID。
為LPM組件導出的主要方法有:
- 添加LPM規則:LPM規則作為輸入參數。如果表中沒有存在相同前綴的規則,則將新規則添加到LPM表中。如果表中已經存在具有相同前綴的規則,則會更新規則的下一跳。當沒有可用空間時返回錯誤。
- 刪除LPM規則:LPM前綴作為輸入參數。如果具有指定前綴的規則存在于LPM表中,則會被刪除。
- 查找LPM規則:128位Key作為輸入參數。該算法選擇代表給定Key的最佳匹配的規則,并返回該規則的下一跳。在LPM表中存在多個具有相同128位Key值的規則的情況下,算法選擇最高深度的規則作為最佳匹配規則,這意味著該規則在輸入鍵和規則Key之間具有最高有效位數匹配。
15.2.實現細節
這個實現是用IPv4的算法做的修改(參見IPv4 LPM實現細節)。在這種情況下,不是使用兩級表,而是使用一級的tbl24和14級的tbl8。
該實現可以看作是一個Multi-bit trie,在每個級別上檢查的步長或位數根據級別有所不同。具體來說,在根節點檢查24位,剩下的104位以8位的組進行檢查。這意味根據添加到表中的規則,該trie最多具有14個級。
該算法允許用戶直接通過存儲器訪問操作來執行規則查找,存儲器訪問次數直接取決于規則長度,以及在數據結構中是否存在具有較大深度的其他規則和相同的Key。它可以在1到14次訪存操作之間變化,IPv6中最常用的長度的平均值為5次訪問操作。
主要數據結構使用以下元素構建:
- 一個有224個條目的表
- 具有28個條目的表,表的數目由API配置
第一個表稱為tbl24,使用要查找的IP地址的前24位進行索引,其余表稱為tbl8,使用IP地址的其余字節進行索引,大小為8位。這意味著嘗試將輸入數據包的IP地址與存儲在tbl24或后續tbl8中的規則進行匹配的結果,我們可能需要在較深級別的樹中繼續查找過程。
類似于IPv4算法中的限制,為了存儲所有可能的IPv6規則,我們需要一個具有2 ^ 128個條目的表。 由于資源限制,這顯然是不可行的。
通過將查找過程分成不同的表/級別并限制tbl8的數量,我們可以大大減少內存消耗,同時保持非常好的查找速度(每級一個內存訪問)。
表中的條目包含以下字段:
- 下一跳信息或者tbl8索引
- 規則深度
- 有效標志
- 有效組標志
- 外部條目標志
第一個字段可以包含指示查找過程應該繼續的tbl8的索引,或者如果已經找到最長的前綴匹配,則可以包含下一跳本身。規則的深度或長度是存儲在特定條目中的規則的位數。標志位用于確定條目/表是否有效以及搜索過程是否分別完成。
兩種類型的表共享相同的結構。
另一個主要數據結構是一個包含規則(IP,下一跳和深度)的主要信息的表。這是一個更高級別的表,用于不同的目的:
- 在添加或刪除之前,檢查規則是否已經存在,而無需實際執行查找。
刪除時,檢查是否存在包含要刪除的規則是很重要的,因為主數據結構必須相應更新。
15.2.1.添加
添加規則時存在不同的可能性。如果規則的深度恰好是24位,那么:
- 使用規則(IP地址)作為tbl24的索引。
? 如果條目無效(即表中原來不包含規則),則將其下一跳設置為其值,將有效標志設置為1(表示此條目正在使用中),并將外部條目標志設置為0(表示查找過程結束,因為這是匹配的最長的前綴)。
如果規則的深度大于24位,但倍數為8,則:
- 使用規則(IP地址)作為tbl24的索引。
- 如果條目無效(即它不包含規則),則查找一個空閑的tbl8,將該值的tbl8的索引設置為該值,將有效標志設置為1(表示此條目正在使用中),并將外部條目標志為1(意味著查找過程必須繼續,因為規則尚未被完全探測)。
- 使用規則的下8位作為下一個tbl8的索引。
- 重復該過程,直到達到正確級別的tbl8(取決于深度),并將其填充到下一跳,將下一個條目標志設置為0。
如果規則的深度是其他值,則必須執行前綴擴展。這意味著規則被復制到所有條目(盡管它們不被使用)以實現致匹配。
舉一個簡單的例子,我們假設深度是20位。這意味著有可能導致匹配的IP地址的前24位的2 ^(24-20)= 16種不同的組合。因此,在這種情況下,我們將完全相同的條目復制到由這些組合索引的每個位置。
通過這樣做,我們確保在查找過程中,如果存在與IP地址匹配的規則,則最多可以在14個內存訪問中找到,具體取決于需要移動到下一個表的次數。前綴擴展是該算法的關鍵之一,因為它通過添加冗余顯著提高速度。
前綴擴展可以在任何級別執行。因此,例如,深度是34位,它將在第三級(第二個基于tbl8的級別)執行。
15.2.2.查詢
查找過程要簡單得多,速度更快。在這種情況下:
- 使用IP地址的前24位作為tbl24的索引。如果該條目未被使用,那么這意味著我們沒有匹配此IP的規則。如果它有效并且外部條目標志設置為0,則返回下一跳。
? 如果它有效并且外部條目標志被設置為1,那么我們使用tbl8索引來找出要檢查的tbl8,并且將該IP地址的下一個8位作為該表的索引。類似地,如果條目未被使用,那么我們沒有與該IP地址匹配的規則。如果它是有效的,那么檢查外部條目標志以檢查新的tbl8。 - 重復該過程,直到找到無效條目(查找未命中)或外部條目標志設置為0的有效條目。在后一種情況下返回下一跳。
15.2.3.規則數目限制
有不同的因素限制可以添加的規則數量。第一個是規則的最大數量,這是通過API傳遞的參數。一旦達到這個數字,就不可能再添加任何更多的規則到路由表,除非有一個或多個刪除。
第二個限制是可用的tbl8數量。如果我們耗盡tbl8s,我們將無法再添加任何規則。很難提前確定其中有多少是特定的路由表所必需的。
在該算法中,單個規則可以消耗的tbl8的最大數量為13,這是級別數減1,因為前三個字節在tbl24中被解析。然而:
- 通常,在IPv6上,路由不超過48位,這意味著規則通常需要3個tbl8。
如在LPM for IPv4算法中所解釋的,根據它們的第一個字節是多少,很可能會有幾個規則共享一個或多個tbl8。如果它們共享相同的前24位,例如,第二級的tbl8將被共享。這可能會在更深的級別再次發生,所以有效的是,如果兩個48位長的規則在最后一個字節中唯一的區別就可能使用相同的三個tbl8。
由于其對內存消耗的影響以及可以添加到LPM表中的數量或規則,tbl8的數量是在該版本的算法中通過API暴露給用戶的參數。一個tbl8消耗1KB的內存。
15.3.用例:IPv6轉發
LPM算法用于實現實現IP轉發的路由器所使用的無類別域間路由(CIDR)策略。