本發(fā)明涉及互聯(lián)網技術領域,尤其涉及一種網絡地址轉換映射表的操作方法及裝置。
背景技術:
近年來,隨著互聯(lián)網的迅猛發(fā)展,接入互聯(lián)網的主機數量成倍增長,聯(lián)網使用的互聯(lián)網協(xié)議(Internet Protocol,IP)的第四版IPv4協(xié)議中IP地址的長度選擇了32位,IP地址的短缺已經成為互聯(lián)網面臨的最大問題之一。
為了解決IP地址短缺的問題,人們提出了許多解決方案。在眾多的解決方案中,網絡地址轉換(Network Address Translation,NAT)技術得到了廣泛的應用。NAT的基本工作原理是,當私有網主機和公共網主機通信的IP包經過NAT網關時,將IP包中的多個待轉換IP地址轉換為一個指定的公網IP地址,一定程度上節(jié)約了IP地址資待轉換。
在實際的應用中,當防火墻接收到私有網需要向公共網絡發(fā)送的報文時,需要通過NAT模塊獲取報文的待轉換IP地址對應的轉換后的公網IP地址,對于已經有待轉換IP地址與轉換后的公網IP地址轉換關系的情況,只需要NAT模塊查詢已有的待轉換IP地址與轉換后IP地址之間的對應關系表,即網絡地址轉換NAT映射表;對于沒有待轉換IP地址與轉換后的公網IP地址轉換關系的情況,需要NAT模塊從轉換后的IP地址池中選擇一個可用的IP地址,并將選出的IP地址與報文的待轉換IP地址,對應的添加到NAT映射表中,以便下次遇到同樣的待轉換IP地址可以直接從NAT映射表中查詢到轉換后的IP地址。可以看到,對于每個接收到的報文來講,NAT模塊都需要先查詢NAT映射表,并且還需要維持NAT映射表的超時機制。由于NAT映射表是全局表,在多核系統(tǒng)下,多核同時操作NAT映射全局表時,每個核對NAT映射全局表操作時通常需要加鎖操作,即每次查找、維持NAT映射表的超時機制時都需要加鎖操作,性能十分差,嚴重影響數據報文轉發(fā)的效率。
技術實現要素:
鑒于上述問題,本發(fā)明提供一種網絡地址轉換映射表的操作方法及裝置,用以解決現有多核系統(tǒng)中操作NAT映射表造成數據報文轉發(fā)效率低的問題。
為解決上述技術問題,第一方面,本發(fā)明提供了一種網絡地址轉換映射表的操作方法,所述方法包括:
在獲取到與待轉換網間協(xié)議IP地址對應的公網IP地址后,判斷NAT映射表中表項的數量是否超過預設閾值,所述NAT映射表存儲有待轉換IP地址和公網IP地址對應關系,該對應關系以表項的形式存在,所述表項以最近最少使用LRU鏈表的方式組織,所述NAT映射表的地址空間為通過內存池預先申請的長期有效的地址空間;
若未超過預設閾值,則對NAT映射表不進行加鎖更新;
若超過預設閾值,則根據當前待轉換IP地址對應的表項在所述NAT映射表中的位置確定是否對NAT映射表進行加鎖更新。
可選的,根據當前待轉換IP地址對應的表項在所述NAT映射表中的位置確定是否對NAT映射表進行加鎖更新包括:
確定NAT映射表中的前N項;
判斷當前待轉換IP地址對應的表項是否位于所述NAT映射表中的前N項中,所述前N項對應NAT映射表中的預設常用表項;
若當前待轉換IP地址對應的表項位于NAT映射表的前N項中,則對NAT映射表不進行加鎖更新;
若當前待轉換IP地址對應的表項不位于NAT映射表的前N項中,則對NAT映射表進行加鎖更新。
可選的,所述確定NAT映射表中的前N項,包括:
初始化NAT映射表時,根據最大堆排序算法對NAT映射表中每個表項按照在預設時段內的操作次數的大小進行排序,將排序后的前N項確定為NAT映射表中的前N項;
初始化NAT映射表后,若預設單位時間內NAT映射表的加鎖更新次數超過預設更新次數,則動態(tài)調整NAT映射表中的前N項。
可選的,所述動態(tài)調整NAT映射表中的前N項,包括:
若調整前的N值小于N的最大取值Y,將前N項擴大為前N1項,其中N1大于N,N1與N之間的關系如下,
N1=N+(Y-N)/10;
若調整前的N值大于等于N的最大取值Y,則對NAT映射表中表項按照最大堆排序算法進行重新排序,得到新的前N個表項。
可選的,若獲取與待轉換網間協(xié)議IP地址對應的公網IP地址的進程為內核態(tài)進程,所述確定NAT映射表中的前N項,包括:
生成獲取NAT映射表中的前N項的獲取消息;
將所述獲取消息以消息機制發(fā)送給用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的獲取消息確定NAT映射表中的前N項后返回給內核態(tài)進程。
可選的,若獲取與待轉換網間協(xié)議IP地址對應的公網IP地址的進程為內核態(tài)進程,所述對NAT映射表進行加鎖更新,包括:
生成對NAT映射表進行加鎖更新的更新消息;
將所述更新消息發(fā)送至用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的更新消息對NAT映射表進行加鎖更新。
可選的,所述NAT映射表中的表項中還包括前項指針和后項指針,所述前項指針指向表項的前一表項,后項指針指向表項的后一表項,所述對NAT映射表進行加鎖更新,包括:
將當前待轉換IP地址對應的表項、NAT映射表中的第一個表項以及與當前待轉換IP地址相鄰的表項的前項指針和后項指針進行更新,以使當前待轉換IP地址對應的表項為NAT映射表中的第一個表項。
可選的,所述獲取到與待轉換網間協(xié)議IP地址對應的公網IP地址,包括:
查找哈希表中是否有待轉換IP地址,所述哈希表中記錄待轉換IP地址和待轉換IP地址對應的表項的空間地址之間的對應關系;
若有待轉換IP地址,則根據哈希表中待轉換IP地址對應的表項的空間地址獲取待轉換IP地址對應的公網IP地址;
若沒有待轉換IP地址,則新建與待轉換IP地址對應的表項,并將新建的表項的空間地址以及其中的待轉換IP地址對應記錄在哈希表中。
可選的,所述新建與待轉換IP地址對應的表項,包括:
若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接對NAT映射表進行加鎖后,新建與待轉換IP地址對應的表項;
若獲取到與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,則生成新建表項的新建消息;
內核態(tài)進程將所述新建消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據新建消息新建與待轉換IP地址對應的表項。
可選的,在所述新建與待轉換IP地址對應的表項方法之前,所述方法還包括:
判斷所述NAT映射表的地址空間是否已滿;
若地址空間已滿,則對NAT映射表按照從后到前的順序刪除預設數量的表項,以使新建的表項可以添加到NAT映射表中。
可選的,所述對NAT映射表按照從后到前的順序刪除預設數量的表項,包括:
若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接執(zhí)行對NAT映射表按照從后到前的順序刪除預設數量的表項;
若獲取到與待轉換IP地址對應的公網IP地址的進程內核態(tài)進程,則生成對NAT映射表按照從后到前的順序刪除預設數量的表項的刪除消息;
內核態(tài)進程將所述刪除消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據刪除消息對NAT映射表按照從后到前的順序刪除預設數量的表項。
第二方面,本發(fā)明提供了一種網絡地址轉換映射表的操作裝置,所述裝置包括:
判斷單元,用于在獲取到與待轉換網間協(xié)議IP地址對應的公網IP地址后,判斷NAT映射表中表項的數量是否超過預設閾值,所述NAT映射表存儲有待轉換IP地址和公網IP地址對應關系,該對應關系以表項的形式存在,所述表項以最近最少使用LRU鏈表的方式組織,所述NAT映射表的地址空間為通過內存池預先申請的長期有效的地址空間;
第一更新單元,用于若未超過預設閾值,則對NAT映射表不進行加鎖更新;
第二更新單元,用于若超過預設閾值,則根據當前待轉換IP地址對應的表項在所述NAT映射表中的位置確定是否對NAT映射表進行加鎖更新。
可選的,第二更新單元包括:
確定模塊,用于確定NAT映射表中的前N項;
判斷模塊,用于判斷當前待轉換IP地址對應的表項是否位于所述NAT映射表中的前N項中,所述前N項對應NAT映射表中的預設常用表項;
第一更新模塊,用于若當前待轉換IP地址對應的表項位于NAT映射表的前N項中,則對NAT映射表不進行加鎖更新;
第二更新模塊,用于若當前待轉換IP地址對應的表項不位于NAT映射表的前N項中,則對NAT映射表進行加鎖更新。
可選的,所述確定模塊用于:
初始化NAT映射表時,根據最大堆排序算法對NAT映射表中每個表項按照在預設時段內的操作次數的大小進行排序,將排序后的前N項確定為NAT映射表中的前N項;
初始化NAT映射表后,若預設單位時間內NAT映射表的加鎖更新次數超過預設更新次數,則動態(tài)調整NAT映射表中的前N項。
可選的,所述確定模塊還用于:
若調整前的N值小于N的最大取值Y,將前N項擴大為前N1項,其中N1大于N,N1與N之間的關系如下,
N1=N+(Y-N)/10;
若調整前的N值大于等于N的最大取值Y,則對NAT映射表中表項按照最大堆排序算法進行重新排序,得到新的前N個表項。
可選的,所述確定模塊還用于:
若獲取與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,生成獲取NAT映射表中的前N項的獲取消息;
將所述獲取消息以消息機制發(fā)送給用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的獲取消息確定NAT映射表中的前N項后返回給內核態(tài)進程。
可選的,所述第二更新單元還包括:
更新消息生成模塊,用于若獲取與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,生成對NAT映射表進行加鎖更新的更新消息;
更新消息發(fā)送模塊,用于將所述更新消息發(fā)送至用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的更新消息對NAT映射表進行加鎖更新。
可選的,所述判斷單元中的NAT映射表中的表項中還包括前項指針和后項指針,所述前項指針指向表項的前一表項,后項指針指向表項的后一表項,所述第二更新模塊還用于:
將當前待轉換IP地址對應的表項、NAT映射表中的第一個表項以及與當前待轉換IP地址相鄰的表項的前項指針和后項指針進行更新,以使當前待轉換IP地址對應的表項為NAT映射表中的第一個表項。
可選的,所述裝置還包括:
查找單元,用于查找哈希表中是否有待轉換IP地址,所述哈希表中記錄待轉換IP地址和待轉換IP地址對應的表項的空間地址之間的對應關系;
獲取單元,用于若有待轉換IP地址,則根據哈希表中待轉換IP地址對應的表項的空間地址獲取待轉換IP地址對應的公網IP地址;
新建單元,用于若沒有待轉換IP地址,則新建與待轉換IP地址對應的表項,并將新建的表項的空間地址以及其中的待轉換IP地址對應記錄在哈希表中。
可選的,所述新建單元,包括:
新建模塊,用于若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接對NAT映射表進行加鎖后,新建與待轉換IP地址對應的表項;
新建消息生成模塊,用于若獲取到與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,則生成新建表項的新建消息;
新建消息發(fā)送模塊,用于內核態(tài)進程將所述新建消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據新建消息新建與待轉換IP地址對應的表項。
可選的,所述裝置還包括:
第二判斷單元,用于在所述新建與待轉換IP地址對應的表項之前,判斷所述NAT映射表的地址空間是否已滿;
刪除單元,用于若地址空間已滿,則對NAT映射表按照從后到前的順序刪除預設數量的表項,以使新建的表項可以添加到NAT映射表中。
可選的,所述刪除單元包括:
刪除模塊,用于若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接執(zhí)行對NAT映射表按照從后到前的順序刪除預設數量的表項;
刪除消息生成模塊,用于若獲取到與待轉換IP地址對應的公網IP地址的進程內核態(tài)進程,則生成對NAT映射表按照從后到前的順序刪除預設數量的表項的刪除消息;
刪除消息發(fā)送模塊,用于內核態(tài)進程將所述刪除消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據刪除消息對NAT映射表按照從后到前的順序刪除預設數量的表項。
借由上述技術方案,本發(fā)明提供的網絡地址轉換映射表的操作方法及裝置,與現有技術相比,NAT映射表中的表項以最近最少使用(latest Recently Used,LRU)鏈表的方式組織,當用戶態(tài)進程和內核態(tài)進程查詢NAT映射表后,不需要每查詢一次NAT映射表就對NAT映射表進行更新來維護NAT映射表的超時機制,而是當查詢NAT映射表之后若當前NAT映射表中總的表項的數量沒有超過預設閾值,則不對NAT映射表進行加鎖更新,這樣大大減少了對NAT映射表加鎖更新的次數,減少了多核之間的競爭,因此一定程度上提高了整個數據轉發(fā)系統(tǒng)的效率。
上述說明僅是本發(fā)明技術方案的概述,為了能夠更清楚了解本發(fā)明的技術手段,而可依照說明書的內容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。
附圖說明
通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
圖1示出了本發(fā)明實施例提供的一種網絡地址轉換映射表的操作方法的流程圖;
圖2示出了本發(fā)明實施例提供的另一種網絡地址轉換映射表的操作方法的流程圖;
圖3示出了本發(fā)明實施例提供的一種NAT映射表的結構體示意圖;
圖4示出了本發(fā)明實施例提供的一種動態(tài)調整前N項的流程圖;
圖5示出了本發(fā)明實施例提供的一種對NAT映射表進行操作的示意圖;
圖6示出了本發(fā)明實施例提供的一種網絡地址轉換映射表的操作裝置的組成框圖;
圖7示出了本發(fā)明實施例提供的另一種網絡地址轉換映射表的操作裝置的組成框圖。
具體實施方式
下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應當理解,可以以各種形式實現本公開而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠將本公開的范圍完整的傳達給本領域的技術人員。
為解決解決現有多核系統(tǒng)中操作NAT映射表造成數據報文轉發(fā)效率低的問題,本發(fā)明實施例提供了一種網絡地址轉換映射表的操作方法,如圖1所示,該方法包括:
本發(fā)明實施例是基于多核異構平臺下的數據轉發(fā)系統(tǒng),異構平臺指通過不同的平臺實現的數據轉發(fā),比如包括在用戶態(tài)實現的快速數據包處理的庫和驅動程序DPDK以及在內核態(tài)實現的X86操作系統(tǒng)。但是對于在用戶態(tài)以及在內核態(tài)的進程都有對全局的NAT映射表的操作的需求。其中的操作包括查詢NAT映射表中的表項、刪除NAT映射表中的表項以及在NAT映射表中新建表項等。需要說明的是,NAT映射表包括源IP地址的映射表(Source IP mapaddr,Src map)和/或目的IP地址的映射表(Destination IP mapaddr,Dec map),Src map表中記錄待轉換的源IP地址與轉換后的公網IP地址之間的對應關系,Dec map表中記錄待轉換的目的IP地址與轉換后的公網IP地址之間的對應關系。另外還需要說明的是上述待轉換IP地址是指內網IP地址。
101、判斷NAT映射表中表項的數量是否超過預設閾值。
執(zhí)行“判斷NAT映射表中表項的數量是否超過預設閾值”是在獲取到與待轉換IP地址對應的公網IP地址后進行的,NAT映射表存儲有待轉換IP地址和公網IP地址對應關系,該對應關系以表項的形式存在。
為了維護NAT映射表的超時機制,本發(fā)明實施例使用最近最少使用算法(latest Recently Used,LRU)維護NAT映射表的超時機制。具體是將NAT映射表中的表項以LRU鏈表的方式組織,即常用的表項放在表頭,不常用的表項在表尾,當NAT映射表的地址空間不充足時,將最不常用的表項替換出。
另外需要說明的是,NAT映射表的地址空間為通過內存池mempool預先申請的長期有效的地址空間;這樣可以保證NAT映射表中表項的地址一直是有效的,即使是在表項刪除時,也不會導致地址的失效。而現有采用的地址現用現申請的方式,在用完后便釋放,而再次去訪問釋放的地址空間時已經失效。此外,本發(fā)明實施例中采用mempool申請地址空間的方式也是為了保證多核系統(tǒng)中用戶態(tài)進程或者內核態(tài)進行無鎖查詢時可以保證數據查詢的安全性。NAT映射表在用戶態(tài)進程建立后,以共享內存的方式給內核態(tài)進程使用,使內核態(tài)進程可以同步查詢到NAT映射表中與待轉換IP地址對應的公網IP地址,沒有延遲,提高了查詢NAT映射表的速率。
本步驟中的預設閾值通常設計為實際NAT映射表所能容下的所有表項的70%、75%等小于100%的值。
102、若未超過預設閾值,則對NAT映射表不進行加鎖更新。
每次查詢完NAT映射表之后為了維護NAT映射表的超時機制,通常需要對NAT映射表進行更新。對于本本實施例使用的超時機制來講即需要在每次查詢完NAT映射表之后都需要將當前被調用的表項放在NAT映射表的表頭實現對NAT映射表的更新,而由于NAT映射表是全局表,在多核系統(tǒng)中每次更新NAT映射表時都需要通過加鎖進行更新。這樣帶來了多核競爭NAT映射表資待轉換的問題,影響整個系統(tǒng)的性能。為了減少加鎖更新的次數,本發(fā)明實施例設置超時機制開啟的條件,即當NAT映射表中的總的表項的數量未超過預設閾值時,不對NAT映射表進行加鎖更新。
103、若超過預設閾值,則根據當前待轉換IP地址對應的表項在NAT映射表中的位置確定是否對NAT映射表進行加鎖更新。
當NAT映射表中總的表項的數量超過預設閾值時,也不一定對NAT映射表進行加鎖更新,還需要判斷當前操作的表項在NAT映射表中的位置,根據具體的位置來決定是否對NAT映射表進行加鎖更新,再次減少了對NAT映射表的加鎖更新的次數,提高了系統(tǒng)的性能。
本發(fā)明實施例提供的網絡地址轉換映射表的操作方法,與現有技術相比,NAT映射表中的表項以最近最少使用(latest Recently Used,LRU)鏈表的方式組織,當用戶態(tài)進程和內核態(tài)進程查詢NAT映射表后,不需要每查詢一次NAT映射表就對NAT映射表進行更新來維護NAT映射表的超時機制,而是當查詢NAT映射表之后若當前NAT映射表中總的表項的數量沒有超過預設閾值,則不對NAT映射表進行加鎖更新,這樣大大減少了對NAT映射表加鎖更新的次數,減少了多核之間的競爭,因此一定程度上提高了整個數據轉發(fā)系統(tǒng)的效率。
為了對圖1所示方法的細化及擴展,本發(fā)明實施例還提供了一種網絡地址轉換映射表的操作方法,如圖2所示:
201、查找哈希表中是否有待轉換IP地址。
為了更方便地查找NAT映射表,本發(fā)明實施例將NAT映射表掛在哈希表上,哈希表中的索引建key為待轉換IP地址,值value為待轉換IP地址對應的表項的空間地址。因此在獲取NAT映射表中與待轉換IP地址對應的公網IP地址時,是通過查找哈希表中的key是否有待轉換IP地址來判斷是否存在包含待轉換IP地址對應的表項。
202、若有待轉換IP地址,則根據哈希表中待轉換IP地址對應的表項的空間地址獲取待轉換IP地址對應的公網IP地址。
若哈希表中沒有待轉換IP地址,則新建與待轉換IP地址對應的表項,并將新建的表項的空間地址以及其中的待轉換IP地址對應記錄在哈希表中。下述為建立新的表項的算法,以待轉換地址為源IP地址為例:
Lock(srcmap_bucket)
Old_srcmap_head=bucket->next
new_srcmap=old_srcmap_head->next
bucket->next=new_srcmap
unlock(srcmap_bucket)
上述算法的主要含義是:在添加表項前,鎖住哈希桶bucket,然后添加表項,添加完成后,釋放鎖。
另外需要說明的是,本實施例中為了維護NAT映射表的超時機制,是使用最近最少使用算法LRU算法維護NAT映射表的超時機制。具體是將NAT映射表中的表項以LRU鏈表的方式組織,常用的表項放在表頭,不常用的表項在表尾,當NAT映射表的地址空間不充足時,將最不常用的替換出。
為了更清晰地表示NAT映射表的結構,給出NAT映射表的結構體示意圖,如圖3所示:其中左側的表為哈希表,哈希表是索引建key和值value配對的集合,哈希表對象是由包含集合中元素的哈希桶bucket組成的。每個NAT映射表中表項對應的表項中包括Key_node和Map addr、prev和next指針以及uptime。Key_node代表待轉換IP地址,Map addr代表待轉換IP地址轉換后對應的公網IP地址,prev和next指針分別指向的是表項在NAT映射表中的前一個表項和后一個表項,這樣就可以表示出表項在以LRU鏈表組織后表項在NAT表中的位置或者順序。圖3中下方為通過LRU鏈表形式組織后NAT映射表中的表項的順序展示圖,其中每個data所在的節(jié)點表示一個表項。
203、判斷NAT映射表中表項的數量是否超過預設閾值。
本步驟的實現方式與圖1步驟101的實現方式是相同的,此處不再贅述。
204、若未超過預設閾值,則對NAT映射表不進行加鎖更新。
本步驟的實現方式與圖1步驟102的實現方式是相同的,此處不再贅述。
205、若超過預設閾值,判斷當前待轉換IP地址對應的表項是否位于NAT映射表中的前N項中。
其中,前N項對應NAT映射表中預設常用的表項,N為正整數。
在判斷當前待轉換IP地址對應的表項是否位于NAT映射表中的前N項中之前,首先需要確定NAT映射表中的前N項,具體的確定前N項方式為:
在初始化NAT映射表時,根據最大堆排序算法對NAT映射表中每個表項按照在預設時段內的操作次數的多少進行由多到少順序排序,將排序后的前N項確定為NAT映射表中的前N項。需要說明的是,在實際應用中表明,使用最大堆排序算法相比于普通的排序算法,性能可以提升20倍以上,更進一步的提高了系統(tǒng)的性能。
初始化NAT映射表后,若預設單位時間內NAT映射表的加鎖更新次數超過預設更新次數,則動態(tài)調整NAT映射表中的前N項。具體動態(tài)調整NAT映射表中的前N項的機制為:若調整前的N值小于N的最大取值Y,將前N項擴大為前N1項,其中Y值也是預設的,N1大于N,N1與N之間的關系如下,
N1=N+(Y-N)/10;
若調整前的N值大于等于N的最大取值Y,則對NAT映射表中表項按照最大堆排序算法進行重新排序,得到新的前N個表項。新的前N個表項中包含的表項與調整前的前N項表項中包含的表項通常是不盡相同的。
另外,需要說明的是,確定NAT映射表的前N項是在用戶態(tài)執(zhí)行的,當內核態(tài)進程在獲取到與當前IP地址對應的公網IP地址之后,判斷是否對NAT映射表進行加鎖更新時,需要生成獲取NAT映射表中的前N項的獲取消息;然后將獲取消息以消息機制發(fā)送給用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的獲取消息確定NAT映射表中的前N項后返回給內核態(tài)進程。
對于上述動態(tài)調整前N項的過程,對應給出具體的流程圖,如圖4所示。圖4中首先是記錄NAT映射表在預設單位時間內的更新次數,然后判斷更新的總次數是否大于預設更新次數;若小于等于預設更新次數,則結束,即不對前N項進行調整,若大于預設更新次數,則繼續(xù)判斷N值是否小于Y值;若小于Y值,則按照上述公式進行對N進行擴大,得到新的N值,即N1,若大于等于Y值,則重新對NAT映射表中的表項重新按照最大堆排序算法進行重新排序,得到新的前N個表項。
206、若當前待轉換IP地址對應的表項不位于NAT映射表的前N項中,則對NAT映射表進行加鎖更新。
對NAT映射表進行加鎖更新具體是:將當前待轉換IP地址對應的表項、NAT映射表中的第一個表項以及與當前待轉換IP地址相鄰的表項的前項指針和后項指針進行更新,以使當前待轉換IP地址對應的表項為NAT映射表中的第一個表項。
需要說明的是,若獲取與待轉換網間協(xié)議IP地址對應的公網IP地址的進程為內核態(tài)進程,在需要對NAT映射表進行加鎖更新時:首先,生成對NAT映射表進行加鎖更新的更新消息;然后,將更新消息發(fā)送至用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的更新消息對NAT映射表進行加鎖更新。
對于當前待轉換IP地址對應的表項位于NAT映射表的前N項中的情況,則對NAT映射表不進行加鎖更新。依照步驟205中動態(tài)調整前N項機制,可以盡可能的使最近常用的表項較大概率的位于前N項中。如果,每次查詢的表項都可以保證在NAT映射表中的前N項,那么在查詢NAT映射表以及維護NAT映射表超時機制的過程中都可以做到無鎖,這樣大大地提高了系統(tǒng)的性能。
對于上述步驟202中在哈希表中沒有查找到待轉換IP地址時,則新建與待轉換IP地址對應的表項的方式具體包括以下兩種情況:
第一種情況,若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接對NAT映射表進行加鎖后,新建與待轉換IP地址對應的表項;
第二種情況,若獲取到與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,則首先生成新建表項的新建消息:然后內核態(tài)進程將新建消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據新建消息新建與待轉換IP地址對應的表項。
另外,在新建與待轉換IP地址對應的表項之前,還需要判斷NAT映射表的地址空間是否已滿;若地址空間已滿,則對NAT映射表按照從后到前的順序刪除預設數量的表項,以使新建的表項可以添加到NAT映射表中。
具體的,對于刪除預設數量的表項,包括以下兩種情況:
第一種情況:若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接執(zhí)行對NAT映射表按照從后到前的順序刪除預設數量的表項;
第二種情況:若獲取到與待轉換IP地址對應的公網IP地址的進程內核態(tài)進程,則首先生成對NAT映射表按照從后到前的順序刪除預設數量的表項的刪除消息;然后內核態(tài)進程將刪除消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據刪除消息對NAT映射表按照從后到前的順序刪除預設數量的表項。
關于刪除表項,在實際應用中還存在其他需要刪除表項的情況,比如,當用戶設置的進行網絡地址轉換的規(guī)則刪除時,對應的表項也需要刪除。
從圖2的說明中,可以看到,內核態(tài)進程直接對NAT映射表進行的操作只有查詢操作,其他的操作都需要以消息機制發(fā)送給用戶態(tài)進程處理。這種內核態(tài)進程將除查詢之外的所有對NAT映射表的操作都以消息機制的方式發(fā)送給用戶態(tài)進程的設計方式可以減少異構平臺下用戶態(tài)進程和內核態(tài)進程同時對NAT映射表進行查詢之外的操作時造成的系統(tǒng)穩(wěn)定性降低的影響。其中,除了查詢之外的操作主要包括新建表項以及刪除表項。需要說明的是,由于內核態(tài)進程發(fā)送的新建表項以及刪除表項的操作屬于配置操作,不屬于數據轉發(fā)驅動,因此不關心延遲,因此使用消息機制雖然有延遲但是不會影響數據轉發(fā)的效率。
下面給出異構平臺下,對NAT映射表進行操作的示意圖,如圖5所示:
其中內核態(tài)進程只進行查詢的操作,將刪除以及新建等都以消息機制發(fā)送給用戶態(tài)進程進行操作。其中kcore0、kcore1、kcore2、以及內核態(tài)Nat配置核運行在內核態(tài),ucore0、ucore1、ucore2以及用戶態(tài)管理核運行在用戶態(tài)。
進一步的,作為對上述各實施例的實現,本發(fā)明實施例的另一實施例還提供了一種網絡地址轉換映射表的操作裝置,用于實現上述圖1以及圖2所述的方法。如圖6所示,該裝置包括:第一判斷單元31、第一更新單元32以及第二更新單元33。
第一判斷單元31,用于在獲取到與待轉換網間協(xié)議IP地址對應的公網IP地址后,判斷NAT映射表中表項的數量是否超過預設閾值,NAT映射表存儲有待轉換IP地址和公網IP地址對應關系,該對應關系以表項的形式存在,表項以最近最少使用LRU鏈表的方式組織,NAT映射表的地址空間為通過內存池預先申請的長期有效的地址空間;
為了維護NAT映射表的超時機制,本發(fā)明實施例使用最近最少使用算法(latest Recently Used,LRU)維護NAT映射表的超時機制。具體是將NAT映射表中的表項以LRU鏈表的方式組織,即常用的表項放在表頭,不常用的表項在表尾,當NAT映射表的地址空間不充足時,將最不常用的表項替換出。
另外需要說明的是,NAT映射表的地址空間使用內存池mempool預先申請的長期有效的地址空間的方式可以保證NAT映射表中表項的地址一直是有效的,即使是在表項刪除時,也不會導致地址的失效。而現有采用的地址現用現申請的方式,在用完后便釋放,而再次去訪問釋放的地址空間時已經失效。此外,本發(fā)明實施例中采用mempool申請地址空間的方式也是為了保證多核系統(tǒng)中用戶態(tài)進程或者內核態(tài)進行無鎖查詢時可以保證數據查詢的安全性。NAT映射表在用戶態(tài)進程建立后,以共享內存的方式給內核態(tài)進程使用,使內核態(tài)進程可以同步查詢到NAT映射表中與待轉換IP地址對應的公網IP地址,沒有延遲,提高了查詢NAT映射表的速率。
本步驟中的預設閾值通常設計為實際NAT映射表所能容下的所有表項的70%、75%等小于100%的值。
第一更新單元32,用于若未超過預設閾值,則對NAT映射表不進行加鎖更新;
第二更新單元33,用于若超過預設閾值,則根據當前待轉換IP地址對應的表項在NAT映射表中的位置確定是否對NAT映射表進行加鎖更新。
在未超過預設閾值時,不對NAT映射表進行加鎖更新,大大的減少了加鎖更新的次數,提高了多核系統(tǒng)的性能。
如圖7所示,第二更新單元33包括:
確定模塊331,用于確定NAT映射表中的前N項;
判斷模塊332,用于判斷當前待轉換IP地址對應的表項是否位于NAT映射表中的前N項中,前N項對應NAT映射表中的預設常用表項;
第一更新模塊333,用于若當前待轉換IP地址對應的表項位于NAT映射表的前N項中,則對NAT映射表不進行加鎖更新;
第二更新模塊334,用于若當前待轉換IP地址對應的表項不位于NAT映射表的前N項中,則對NAT映射表進行加鎖更新。
對NAT映射表進行加鎖更新具體是:將當前待轉換IP地址對應的表項、NAT映射表中的第一個表項以及與當前待轉換IP地址相鄰的表項的前項指針和后項指針進行更新,以使當前待轉換IP地址對應的表項為NAT映射表中的第一個表項。
確定模塊331用于:
初始化NAT映射表時,根據最大堆排序算法對NAT映射表中每個表項按照在預設時段內的操作次數的大小進行排序,將排序后的前N項確定為NAT映射表中的前N項;
需要說明的是,在實際應用中表明,使用最大堆排序算法相比于普通的排序算法,性能可以提升20倍以上,更進一步的提高了系統(tǒng)的性能。
初始化NAT映射表后,若預設單位時間內NAT映射表的加鎖更新次數超過預設更新次數,則動態(tài)調整NAT映射表中的前N項。
確定模塊331還用于:
若調整前的N值小于N的最大取值Y,將前N項擴大為前N1項,其中N1大于N,N1與N之間的關系如下,
N1=N+(Y-N)/10;
若調整前的N值大于等于N的最大取值Y,則對NAT映射表中表項按照最大堆排序算法進行重新排序,得到新的前N個表項。
動態(tài)調整前N項機制,可以盡可能的使最近常用的表項較大概率的位于前N項中。如果,每次查詢的表項都可以保證在NAT映射表中的前N項,那么在查詢NAT映射表以及維護NAT映射表超時機制的過程中都可以做到無鎖,這樣大大地提高了系統(tǒng)的性能。
確定模塊331還用于:
若獲取與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,生成獲取NAT映射表中的前N項的獲取消息;
需要說明的是,確定NAT映射表的前N項是在用戶態(tài)執(zhí)行的。
將獲取消息以消息機制發(fā)送給用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的獲取消息確定NAT映射表中的前N項后返回給內核態(tài)進程。
如圖7所示,第二更新單元33還包括:
更新消息生成模塊335,用于若獲取與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,生成對NAT映射表進行加鎖更新的更新消息;
更新消息發(fā)送模塊336,用于將更新消息發(fā)送至用戶態(tài)進程,使用戶態(tài)進程根據內核態(tài)進程發(fā)送的更新消息對NAT映射表進行加鎖更新。
第一判斷單元31中的NAT映射表中的表項中還包括前項指針和后項指針,前項指針指向表項的前一表項,后項指針指向表項的后一表項,第二更新模塊334還用于:
將當前待轉換IP地址對應的表項、NAT映射表中的第一個表項以及與當前待轉換IP地址相鄰的表項的前項指針和后項指針進行更新,以使當前待轉換IP地址對應的表項為NAT映射表中的第一個表項。
如圖7所示,裝置還包括:
查找單元34,用于查找哈希表中是否有待轉換IP地址,哈希表中記錄待轉換IP地址和待轉換IP地址對應的表項的空間地址之間的對應關系;
為了更方便地查找NAT映射表,本發(fā)明實施例將NAT映射表掛在哈希表上,哈希表中的索引建key為待轉換IP地址,值value為待轉換IP地址對應的表項的空間地址。因此在獲取NAT映射表中與待轉換IP地址對應的公網IP地址時,是通過查找哈希表中的key是否有待轉換IP地址來判斷是否存在包含待轉換IP地址對應的表項。
為了更清晰地表示NAT映射表的結構,給出NAT映射表的結構體示意圖,如圖3所示:其中左側的表為哈希表,哈希表是索引建key和值value配對的集合,哈希表對象是由包含集合中元素的哈希桶bucket組成的。每個NAT映射表中表項對應的表項中包括Key_node和Map addr、prev和next指針以及uptime。Key_node代表待轉換IP地址,Map addr代表待轉換IP地址轉換后對應的公網IP地址,prev和next指針分別指向的是表項在NAT映射表中的前一個表項和后一個表項,這樣就可以表示出表項在以LRU鏈表組織后表項在NAT表中的位置或者順序。圖3中下方為通過LRU鏈表形式組織后NAT映射表中的表項的順序展示圖,其中每個data所在的節(jié)點表示一個表項。
獲取單元35,用于若有待轉換IP地址,則根據哈希表中待轉換IP地址對應的表項的空間地址獲取待轉換IP地址對應的公網IP地址;
新建單元36,用于若沒有待轉換IP地址,則新建與待轉換IP地址對應的表項,并將新建的表項的空間地址以及其中的待轉換IP地址對應記錄在哈希表中。
如圖7所示,新建單元36,包括:
新建模塊361,用于若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接對NAT映射表進行加鎖后,新建與待轉換IP地址對應的表項;
新建消息生成模塊362,用于若獲取到與待轉換IP地址對應的公網IP地址的進程為內核態(tài)進程,則生成新建表項的新建消息;
新建消息發(fā)送模塊363,用于內核態(tài)進程將新建消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據新建消息新建與待轉換IP地址對應的表項。
如圖7所示,裝置還包括:
第二判斷單元37,用于在新建與待轉換IP地址對應的表項之前,判斷NAT映射表的地址空間是否已滿;
刪除單元38,用于若地址空間已滿,則對NAT映射表按照從后到前的順序刪除預設數量的表項,以使新建的表項可以添加到NAT映射表中。
如圖7所示,刪除單元38包括:
刪除模塊381,用于若獲取到與待轉換IP地址對應的公網IP地址的進程為用戶態(tài)進程,則直接執(zhí)行對NAT映射表按照從后到前的順序刪除預設數量的表項;
刪除消息生成模塊382,用于若獲取到與待轉換IP地址對應的公網IP地址的進程內核態(tài)進程,則生成對NAT映射表按照從后到前的順序刪除預設數量的表項的刪除消息;
刪除消息發(fā)送模塊383,用于內核態(tài)進程將刪除消息發(fā)送給用戶態(tài)進程,以使用戶態(tài)進程根據刪除消息對NAT映射表按照從后到前的順序刪除預設數量的表項。
從圖6以及圖7的說明中,可以看到,內核態(tài)進程直接對NAT映射表進行的操作只有查詢操作,其他的操作都需要以消息機制發(fā)送給用戶態(tài)進程處理。這種內核態(tài)進程將除查詢之外的所有對NAT映射表的操作都以消息機制的方式發(fā)送給用戶態(tài)進程的設計方式可以減少異構平臺下用戶態(tài)進程和內核態(tài)進程同時對NAT映射表進行查詢之外的操作時造成的系統(tǒng)穩(wěn)定性降低的影響。其中,除了查詢之外的操作主要包括新建表項以及刪除表項。需要說明的是,由于內核態(tài)進程發(fā)送的新建表項以及刪除表項的操作屬于配置操作,不屬于數據轉發(fā)驅動,因此不關心延遲,因此使用消息機制雖然有延遲但是不會影響數據轉發(fā)的效率。
本發(fā)明實施例提供的網絡地址轉換映射表的操作裝置,與現有技術相比,NAT映射表中的表項以最近最少使用(latest Recently Used,LRU)鏈表的方式組織,當用戶態(tài)進程和內核態(tài)進程查詢NAT映射表后,不需要每查詢一次NAT映射表就對NAT映射表進行更新來維護NAT映射表的超時機制,而是當查詢NAT映射表之后若當前NAT映射表中總的表項的數量沒有超過預設閾值,則不對NAT映射表進行加鎖更新,這樣大大減少了對NAT映射表加鎖更新的次數,減少了多核之間的競爭,因此一定程度上提高了整個數據轉發(fā)系統(tǒng)的效率。
在上述實施例中,對各個實施例的描述都各有側重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關描述。
可以理解的是,上述方法及裝置中的相關特征可以相互參考。另外,上述實施例中的“第一”、“第二”等是用于區(qū)分各實施例,而并不代表各實施例的優(yōu)劣。
所屬領域的技術人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實施例中的對應過程,在此不再贅述。
在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設備固有相關。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據上面的描述,構造這類系統(tǒng)所要求的結構是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應當明白,可以利用各種編程語言實現在此描述的本發(fā)明的內容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。
在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結構和技術,以便不模糊對本說明書的理解。
類似地,應當理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應將該公開的方法解釋成反映如下意圖:即所要求保護的本發(fā)明要求比在每個權利要求中所明確記載的特征更多的特征。更確切地說,如下面的權利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權利要求書由此明確地并入該具體實施方式,其中每個權利要求本身都作為本發(fā)明的單獨實施例。
本領域那些技術人員可以理解,可以對實施例中的設備中的模塊進行自適應性地改變并且把它們設置在與該實施例不同的一個或多個設備中。可以把實施例中的模塊或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領域的技術人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內并且形成不同的實施例。例如,在下面的權利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個部件實施例可以以硬件實現,或者以在一個或者多個處理器上運行的軟件模塊實現,或者以它們的組合實現。本領域的技術人員應當理解,可以在實踐中使用微處理器或者數字信號處理器(DSP)來實現根據本發(fā)明實施例的發(fā)明名稱(如網絡地址轉換映射表的操作裝置)中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現為用于執(zhí)行這里所描述的方法的一部分或者全部的設備或者裝置程序(例如,計算機程序和計算機程序產品)。這樣的實現本發(fā)明的程序可以存儲在計算機可讀介質上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網網站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
應該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領域技術人員在不脫離所附權利要求的范圍的情況下可設計出替換實施例。在權利要求中,不應將位于括號之間的任何參考符號構造成對權利要求的限制。單詞“包含”不排除存在未列在權利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現。在列舉了若干裝置的單元權利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。