亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種基于內(nèi)存的ip地址最長匹配快速查找的方法

文檔序號:6555299閱讀:600來源:國知局
專利名稱:一種基于內(nèi)存的ip地址最長匹配快速查找的方法
技術(shù)領(lǐng)域
本發(fā)明涉及一種基于內(nèi)存的IP地址最長匹配快速查找的方法,可實現(xiàn)IP路由查找、軟件防火墻規(guī)則表查找、基于IP方式的負(fù)載均衡系統(tǒng)的IP表查找,屬于數(shù)據(jù)通訊領(lǐng)域。
背景技術(shù)
在基于IP方式的負(fù)載均衡系統(tǒng)中,經(jīng)常需要根據(jù)請求用戶的IP地址來判斷該用戶所在的地區(qū),并根據(jù)用戶所在的地區(qū),將用戶的請求重定向到與該用戶最近的服務(wù)器為用戶提供服務(wù)。
譬如,面向全省或者全國各地的流服務(wù),特別需要使用此方法向用戶提供就近服務(wù),以便提高服務(wù)質(zhì)量。目前用戶向系統(tǒng)重定向器發(fā)起請求,重定向器根據(jù)發(fā)起請求的用戶的IP地址,與系統(tǒng)中已經(jīng)預(yù)先錄入的成千上萬條IP段按照最長匹配方式進(jìn)行一個一個匹配,得到該用戶所在的地區(qū),并根據(jù)用戶所在的地區(qū)將用戶的請求重定向到離用戶最近的服務(wù)器,由于所有的用戶都會向重定向器發(fā)起請求,采用依次查找的方式查找速度慢,以至于不能夠進(jìn)行快速定位,高效地響應(yīng)用戶的請求,給工作帶來影響。

發(fā)明內(nèi)容
本發(fā)明的目的是提供一種基于內(nèi)存的IP地址最長匹配快速查找的方法,該方法簡單易行,能夠進(jìn)行快速定位,高效地響應(yīng)用戶的請求,可以有效提高IP路由查找的效率。
為實現(xiàn)以上目的,本發(fā)明的技術(shù)方案是提供一種基于內(nèi)存的IP地址最長匹配快速查找的方法,其特征在于,采用C、C++語言編程實現(xiàn),運(yùn)行于基于X86架構(gòu)的PC服務(wù)器,或運(yùn)行在防火墻、路由器網(wǎng)絡(luò)設(shè)備中,其方法為(一)創(chuàng)建IP地址庫加載到內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)1)首先執(zhí)行初始化操作,將IP地址庫加載到內(nèi)存中來,建立“第一段表”進(jìn)行A、B類地址分別進(jìn)行處理,將高8位<128的IP地址庫列入A類,強(qiáng)高8位>128IP的地址庫列入B類,并初始化該表中的內(nèi)容為0;2)如果沒有更多的IP地址記錄,則結(jié)束;否則讀取一個IP地址庫中的IP地址/MASK對,先根據(jù)IP地址判斷是A類還是B類地址,如果在“第一段表”中的指針為0,并且是A類地址,執(zhí)行步驟3);如果在“第一段表”中的指針為0,并且是B類地址,則執(zhí)行步驟6);如果在“第一段表”中的指針不為0,并且是A類地址,得到表項中指針指向的“MASK桶索引表”,并轉(zhuǎn)向步驟4);否則,得到表項中指針指向的“MASK桶索引表”,執(zhí)行步驟7);3)創(chuàng)建一個表項數(shù)為24個的“MASK桶索引表”,將所有表項初始化為0;4)根據(jù)掩碼1的位數(shù)在“MASK桶索引表”中定位到相應(yīng)的表項,如果該表項的指針為0,創(chuàng)建一個新的“IP順序查找表”,并將該表項的指針指向新的“IP順序查找表”;5)在上一步得到的“IP順序查找表中”將新的IP插入,并轉(zhuǎn)到步驟2);6)創(chuàng)建一個新的“第二段表”,將所有表項初始化為0,并將“第一段表”中該項的指針指向新創(chuàng)建的“第二段表”;7)根據(jù)IP地址的次高8定位當(dāng)前“第二段表”中的表項,判斷表項中的指針值是否為0,如果是,創(chuàng)建一個表項數(shù)為16個的“MASK桶索引表”,并將所有表項初始化為0,并最后轉(zhuǎn)到步驟4);二)快速查找的方法1)根據(jù)傳入的IP地址判斷是A類還是B類地址,并根據(jù)IP地址高8位在“第一段表”中定位表項,如果表項中的指針值為0,則返回未匹配錯誤;2)如果是A類地址,根據(jù)步驟1)中得到的指針,獲取“MASK桶索引表”的地址,并轉(zhuǎn)到步驟4)執(zhí)行;3)如果是B類地址,根據(jù)步驟1)中得到的指針,獲取“第二段表”的地址,并根據(jù)IP地址次高8位在當(dāng)前“第二段表”中定位表項,如果表項中的指針值為0,則返回未匹配錯誤。否則,根據(jù)該指針值,得到“MASK桶索引表”的地址;4)對得到的“MASK桶索引表”的地址,按照掩碼1的位數(shù),從多到少,依次對“IP順序查找表”進(jìn)行二分查找,如果找到,則返回匹配正確信息,否則返回未匹配錯誤。
本發(fā)明對IP地址庫按照掩碼的位數(shù)進(jìn)行分類組成“MASK桶索引表”,最多32類,由于A類IP地址的掩碼1的位數(shù)最少是8位,實際我們只要考慮32-8=24類即可。我們對每一類掩碼建立一個順序表,即“IP順序查找表”,按照實際IP地址(32位無符號整型數(shù))依次排列。查找的時候,按照從掩碼1的位數(shù)最多的表開始查找,在表中用二分查找方式進(jìn)行快速查找,如果找到,立即停止。如果沒有找到,依次查遍24個類別的表,如果還未找到,則返回匹配失敗并停止。由于按照掩碼1的位數(shù)最多的表開始查找,滿足了最長匹配的要求。同時通過二分查找,有效地提高了查找速度,對于一個有n條記錄的IP地址庫,如果它們的掩碼是平均分布的,并且查找成功和失敗的幾率也是平均的,那么我們估算,大約平均經(jīng)過12×Log2(n/24)次比較就可以完成查找。
為了加速查找,本發(fā)明對IP地址的第一段(即高8位)建立一個256個項目的索引表,即“第一段表”,對IP地址先按高8位進(jìn)行初步分類,每個索引項是一個指針,要么為0,要么為指向上面所述的“MASK桶索引表”。這樣由于“第一段表”可以根據(jù)傳入的IP地址的高8位進(jìn)行一次定位,進(jìn)行一次判斷就可以判定該IP在表中是否存在,或者是否需要進(jìn)行進(jìn)一步匹配,而“MASK桶索引表”下對應(yīng)的每個“IP順序查找表”的規(guī)??s小了256倍,這樣二分查找的比較次數(shù)最多縮小了Log2256=8次,因此如果按照平均需要查找12個“IP順序查找表”來算,那么實際平均最多減少了8×12-1=95次比較。
如果空間允許,本發(fā)明還可以進(jìn)行進(jìn)一步的優(yōu)化,如圖1所示。用來提高對B類地址(這里包括RFC中規(guī)定的B類,C類,D類,E類地址)的查找。如果預(yù)先知道所有A類地址的細(xì)分的子網(wǎng),并且子網(wǎng)掩碼1的位數(shù)達(dá)到并超過了16位,那么同樣可以對A類地址進(jìn)行優(yōu)化查找。優(yōu)化的方法是這樣的與上面的優(yōu)化原理一樣,取IP地址的第二段(即次高8位)建立一個256個項目的索引表,即“第二段表”,“第一段表”中的指針要么為0,要么指向“第二段表”,對IP地址按照次高8位進(jìn)行進(jìn)一步的分類,每個索引項是一個指針,要么是0,要么是指向“MASK桶索引表”。這樣,查找的時候,先按IP地址的高8位在“第一段表”中進(jìn)行直接定位,然后用次高8位在“第二段表”中進(jìn)行另外一次直接定位,最后在“MASK桶索引表”中按照掩碼1的位數(shù),從多到少依次進(jìn)行二分查找。由于在這種情況下,掩碼1的位數(shù)最少有16位,因此,這里“MASK桶索引表”中只要16個桶就可以了。這樣,可以進(jìn)一步減少比較的次數(shù),從而用空間換取了時間,提高了查找的效率。
本發(fā)明的優(yōu)點是方法簡單易行,在盡量少占用內(nèi)存空間的情況下大大提高了查找的效率。


圖1為將IP地址庫加載到內(nèi)存中數(shù)據(jù)結(jié)構(gòu)示意圖;圖2為5個IP段組成的地址庫數(shù)據(jù)結(jié)構(gòu)示意圖;圖3為本發(fā)明的實現(xiàn)方法的查找操作的步驟流程圖。
具體實施例方式
以下結(jié)合附圖和實施例對本發(fā)明作進(jìn)一步說明。
實施例如圖1所示,為將IP地址庫加載到內(nèi)存中數(shù)據(jù)結(jié)構(gòu)示意圖,所述的一種基于內(nèi)存的IP地址最長匹配快速查找方法,其操作步驟是1)首先執(zhí)行初始化操作,將IP地址庫加載到內(nèi)存中來,建立如圖1所示的數(shù)據(jù)結(jié)構(gòu)?!暗谝欢伪怼焙汀暗诙伪怼泵總€表都有256個表項,兩個表的表項的數(shù)據(jù)結(jié)構(gòu)定義如下


“MASK桶索引”的表項數(shù)量不固定,按照掩碼1的位數(shù)從少到多排列“MASK桶指針”,數(shù)據(jù)結(jié)構(gòu)定義如下

“IP順序查找表”是一個可隨機(jī)查找的數(shù)組,將每個表項按照IP地址的32位無符號整型數(shù)的大小按照從小到大順序排列,如果采用標(biāo)準(zhǔn)C++庫,可以用vector對象來實現(xiàn),如果采用標(biāo)準(zhǔn)C,采用以下數(shù)據(jù)結(jié)構(gòu)定義

在加載IP地址庫的時候,該結(jié)構(gòu)可動態(tài)進(jìn)行分配,當(dāng)新加入表項前,“本桶中的當(dāng)前表項數(shù)量”和“本桶可容納的最大表項”相等時,需要為該桶重新分配更大的空間,并用得到的新地址更新在“MASK桶索引”中的相應(yīng)的指針。
如圖2所示,為5個IP段組成的地址庫數(shù)據(jù)結(jié)構(gòu)示意圖,假設(shè)有以下5個IP段組成的地址庫

那么初始化過程如下首先初始化“第一段表”,表項全部清零。
讀取第一個IP段,61.175.0.0/255.255.0.0,因為子網(wǎng)IP的第一段為61,所以是A類地址。并且通過MASK值知道,掩碼位數(shù)為16位,并且子網(wǎng)IP對應(yīng)的4字節(jié)32位無符號數(shù)表示為0x3DAF0000。
因為在“第一段表”中,序號為61的項當(dāng)時為0,所以,創(chuàng)建一個“MASK桶索引”,并將其所有表項初始化為0,然后在“第一段表”的序號61的項中填入指向新創(chuàng)建的“MASK桶索引”的指針。
根據(jù)掩碼位數(shù)為16,由于新創(chuàng)建的“MASK桶索引”表的第16-8=8項為0,表示尚未創(chuàng)建該MASK對應(yīng)的“IP列表”,則創(chuàng)建一個可動態(tài)分配空間的“IP列表”(如動態(tài)數(shù)組方式),并將當(dāng)前“MASK桶索引”的第7項的值指向新創(chuàng)建的“IP列表”,然后在該“IP列表”中加入0x3DAF0000,并完成對第一個IP段的處理。
讀取第二個IP段,62.2.0.0/255.254.0.0,它為A類地址,掩碼位數(shù)15位,子網(wǎng)IP對應(yīng)的4字節(jié)32位無符號數(shù)表示為0x3E020000。
初始化操作步驟與第一個步驟類似。
讀取第三個IP段,62.4.0.0/255.254.0.0,它為A類地址,掩碼位數(shù)15位,子網(wǎng)IP對應(yīng)的4字節(jié)32位無符號數(shù)表示為0x3E040000。
由于“第一段表”中的序號為62的表項經(jīng)過第二個IP段的處理,已經(jīng)不為0,所以沒有必要創(chuàng)建新的“MASK桶索引”,而根據(jù)該表項所設(shè)置的指針,得到原先創(chuàng)建的“MASK桶索引”,另外,由于第15-8=7的表項中的指針值不為0,因此,根據(jù)該指針值得到“IP列表”,并將0x3E040000的值按從小到大的順序填入該“IP列表”中。
讀取第四個IP段,129.27.4.0/255.255.255.0,它為B類地址,掩碼位數(shù)24位,子網(wǎng)IP對應(yīng)的4字節(jié)32位無符號數(shù)表示為0x811B0400。
創(chuàng)建一個“第二段表”,并將該表的所有表項清0,在“第一段表”的序號為129的表項中設(shè)置指針指向“第二段表”。
然后再創(chuàng)建一個新的“MASK桶索引”,并將當(dāng)前“第二段表”的序號為27的表項中設(shè)置指針指向新的“MASK桶索引”,接下去的操作和第一個IP段的處理一樣。
讀取第五個IP段,202.57.3.128/255.255.255.128,它為C類地址,在本文中歸為B類,掩碼位數(shù)為25位,子網(wǎng)IP對應(yīng)的4字節(jié)32位無符號數(shù)表示為0xCA390380。
操作過程和第四個IP段的處理一樣,經(jīng)過初始化,已經(jīng)創(chuàng)建了如下圖3的數(shù)據(jù)結(jié)構(gòu)。
如圖3所示,為本發(fā)明的實現(xiàn)方法的查找操作的步驟流程圖,查找的操作步驟如下1)根據(jù)傳入的IP地址判斷是A類還是B類地址,并根據(jù)IP地址高8位在“第一段表”中定位表項,如果表項中的指針值為0,則返回未匹配錯誤;2)如果是A類地址,根據(jù)步驟1)中得到的指針,獲取“MASK桶索引表”的地址,并轉(zhuǎn)到步驟4)執(zhí)行。
3)如果是B類地址,根據(jù)步驟1)中得到的指針,獲取“第二段表”的地址,并根據(jù)IP地址次高8位在當(dāng)前“第二段表”中定位表項,如果表項中的指針值為0,則返回未匹配錯誤。否則,根據(jù)該指針值,得到“MASK桶索引表”的地址;4)對得到的“MASK桶索引表”的地址,按照掩碼1的位數(shù),從多到少,依次對“IP順序查找表”進(jìn)行二分查找,如果找到,則返回匹配正確信息,否則返回未匹配錯誤。
下面,對以上初始化建立的結(jié)構(gòu)進(jìn)行查找操作。
判斷61.176.1.1,62.3.1.4,202.58.3.129三個IP地址是否在IP地址庫中。
對于61.176.1.1,該IP地址對應(yīng)的4字節(jié)32位無符號數(shù)表示為0x3DB00101。由于該IP地址第一段為61,則在“第一段表”得到序號61的指針值,并根據(jù)指針值得到其指向的“MASK桶索引”。
然后按照掩碼1的位數(shù)從多到少,依次對“MASK桶索引”進(jìn)行掃描,因為只有序號為8的表項,即對應(yīng)MASK位數(shù)為16的表項指針值不為0,所以根據(jù)該指針值,得到其指向的“IP列表”,因為MASK位數(shù)為16的4字節(jié)32位無符號數(shù)表示為0xFFFF0000,需要查找的IP地址為0x3DB00101,其對應(yīng)的IP段的值為0x3DB00101&0xFFFF0000=0x3DB00000,而IP列表中只有0x3DAF0000的表項,因為該IP地址不在IP地址庫中。
對于62.3.1.4,該IP地址對應(yīng)的4字節(jié)32位無符號數(shù)表示為0x3E030104。由于該IP地址第一段為62,則在“第一段表”得到序號62的指針值,并根據(jù)指針值得到其指向的MASK桶索引。
然后按照掩碼1的位數(shù)從多到少對MASK桶索引進(jìn)行掃描,因為只有序號為7的表項,即對應(yīng)MASK位數(shù)為15的表項指針值不為0,所以根據(jù)該指針值,得到其指向的“IP列表”,因為MASK位數(shù)為15的4字節(jié)32位無符號數(shù)表示為0xFFFE0000,需要查找的IP地址為0x3E030104,其對應(yīng)的IP段的值為0x3E030104&0xFFFE0000=0x3E020000,而IP列表中確實有0x3E020000的表項,因為該IP地址在IP地址庫中。由于IP列表中的值是按照32位無符號數(shù)值的大小從小到大按順序排列,所以實際查找過程中可以采用二分算法進(jìn)行查找。
對于202.58.3.129,該IP地址對應(yīng)的4字節(jié)32位無符號數(shù)表示為0xCA3A0381。由于該IP地址第一段為202,則在“第一段表”得到序號202的指針值,并根據(jù)指針值得到其指向的“第二段表”。
由于該IP地址第二段為58,由于當(dāng)前“第二段表”中序號為58的表項指針值為0,表示其下面沒有“MASK桶索引”,因此,可以立即斷定該IP地址肯定不在IP地址庫中。
權(quán)利要求
1.一種基于內(nèi)存的IP地址最長匹配快速查找的方法,其特征在于,采用C、C++語言編程實現(xiàn),運(yùn)行于基于X86架構(gòu)的PC服務(wù)器,或運(yùn)行在防火墻、路由器網(wǎng)絡(luò)設(shè)備中,其方法為(一)創(chuàng)建IP地址庫加載到內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)1)首先執(zhí)行初始化操作,將IP地址庫加載到內(nèi)存中來,建立“第一段表”進(jìn)行A、B類地址分別進(jìn)行處理,將高8位<128的IP地址庫列入A類,強(qiáng)高8位>128IP的地址庫列入B類,并初始化該表中的內(nèi)容為0;2)如果沒有更多的IP地址記錄,則結(jié)束;否則讀取一個IP地址庫中的IP地址/MASK對,先根據(jù)IP地址判斷是A類還是B類地址,如果在“第一段表”中的指針為0,并且是A類地址,執(zhí)行步驟3);如果在“第一段表”中的指針為0,并且是B類地址,則執(zhí)行步驟6);如果在“第一段表”中的指針不為0,并且是A類地址,得到表項中指針指向的“MASK桶索引表”,并轉(zhuǎn)向步驟4);否則,得到表項中指針指向的“MASK桶索引表”,執(zhí)行步驟7);3)創(chuàng)建一個表項數(shù)為24個的“MASK桶索引表”,將所有表項初始化為0;4)根據(jù)掩碼1的位數(shù)在“MASK桶索引表”中定位到相應(yīng)的表項,如果該表項的指針為0,創(chuàng)建一個新的“IP順序查找表”,并將該表項的指針指向新的“IP順序查找表”;5)在上一步得到的“IP順序查找表中”將新的IP插入,并轉(zhuǎn)到步驟2);6)創(chuàng)建一個新的“第二段表”,將所有表項初始化為0,并將“第一段表”中該項的指針指向新創(chuàng)建的“第二段表”;7)根據(jù)IP地址的次高8定位當(dāng)前“第二段表”中的表項,判斷表項中的指針值是否為0,如果是,創(chuàng)建一個表項數(shù)為16個的“MASK桶索引表”,并將所有表項初始化為0,并最后轉(zhuǎn)到步驟4);(二)快速查找的方法1)根據(jù)傳入的IP地址判斷是A類還是B類地址,并根據(jù)IP地址高8位在“第一段表”中定位表項,如果表項中的指針值為0,則返回未匹配錯誤;2)如果是A類地址,根據(jù)步驟1)中得到的指針,獲取“MASK桶索引表”的地址,并轉(zhuǎn)到步驟4)執(zhí)行。3)如果是B類地址,根據(jù)步驟1)中得到的指針,獲取“第二段表”的地址,并根據(jù)IP地址次高8位在當(dāng)前“第二段表”中定位表項,如果表項中的指針值為0,則返回未匹配錯誤。否則,根據(jù)該指針值,得到“MASK桶索引表”的地址;4)對得到的“MASK桶索引表”的地址,按照掩碼1的位數(shù),從多到少,依次對“IP順序查找表”進(jìn)行二分查找,如果找到,則返回匹配正確信息,否則返回未匹配錯誤。
全文摘要
本發(fā)明涉及一種基于內(nèi)存的IP地址最長匹配快速查找的方法,該方法首先對IP地址分成A類,B類,對IP按照8位一段的方式建立索引樹,A類地址只有1層,B類地址有2層。對最底層,建立一個MASK桶索引,每個MASK下面掛接一個IP順序表,在此順序表中存放最終的IP項,查找的時候,根據(jù)傳入的IP地址判定是A類還是B類地址,如果是A類地址,根據(jù)得到的MASK桶索引,從32位MASK的IP列表開始,采用二分法進(jìn)行匹配,直到找到或者查找失敗。如果是B類地址,則引導(dǎo)到第二段表中,用IP地址的次8位在第二段表中進(jìn)行定位,并最終跟A類地址一樣引導(dǎo)到MASK桶索引,進(jìn)行查找。本發(fā)明的優(yōu)點是查找快速、高效。
文檔編號G06F17/30GK101043421SQ200610024890
公開日2007年9月26日 申請日期2006年3月21日 優(yōu)先權(quán)日2006年3月21日
發(fā)明者王磊 申請人:上海激動通信有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1