一種實現(xiàn)napt端口資源分配的方法
【專利摘要】本發(fā)明涉及數(shù)據(jù)通信領(lǐng)域中的端口分配技術(shù),其公開了一種實現(xiàn)NAPT端口資源分配的方法,解決傳統(tǒng)技術(shù)中端口資源分配方案存在的分配效率低、命中率低的問題。本發(fā)明將需要管理的端口資源中的各個端口與一段連續(xù)內(nèi)存M中的比特位一一關(guān)聯(lián)對應(yīng),將M中連續(xù)字長個位作為一個整數(shù)使用,從而將對M中位的管理轉(zhuǎn)換為對整數(shù)集合的位運算;通過逐層壓縮的方式,最終將所有需要管理的端口資源映射到一個整數(shù)R上,在進行端口分配時,以整數(shù)R為基礎(chǔ)通過判斷其各個位的狀態(tài)來確定該位對應(yīng)的下一層整數(shù)中是否存在可用端口,然后再通過所述下一層整數(shù)中的各個位的狀態(tài)來確定該位對應(yīng)的后一層整數(shù)中是否存在可用端口,基于此方式最終查找到可用端口。
【專利說明】一種實現(xiàn)NAPT端口資源分配的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)通信領(lǐng)域中的端口分配技術(shù),具體涉及一種實現(xiàn)NAPT(網(wǎng)絡(luò)地址端口轉(zhuǎn)換)端口資源分配的方法。
【背景技術(shù)】
[0002]NAT協(xié)議是一種將私網(wǎng)的私有IP地址與公網(wǎng)的合法IP地址相互轉(zhuǎn)換的接入技術(shù)?;镜木W(wǎng)絡(luò)地址轉(zhuǎn)換(basic NAT)僅對報文的源IP地址進行映射轉(zhuǎn)換,而網(wǎng)絡(luò)地址端口轉(zhuǎn)換(NAPT)對源IP地址以及源端口號都要進行映射轉(zhuǎn)換。由于IPv4地址即將耗盡,基本的網(wǎng)絡(luò)地址轉(zhuǎn)換對緩解IPv4地址即將耗盡的問題作用不大,所以網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)協(xié)議用于將私網(wǎng)地址動態(tài)轉(zhuǎn)換為合法的公網(wǎng)地址時,即將IP報文IP頭中的IP地址轉(zhuǎn)換為另一個IP地址,多為網(wǎng)絡(luò)地址端口轉(zhuǎn)換,此時通常會將大量的私網(wǎng)地址轉(zhuǎn)換為一個或幾個公網(wǎng)地址,并且每一對正在使用的私網(wǎng)IP地址端口對將與一對公網(wǎng)IP地址端口對形成映射關(guān)系,通過這些公網(wǎng)IP地址端口對實現(xiàn)對因特網(wǎng)的訪問。
[0003]在構(gòu)建網(wǎng)絡(luò)地址端口轉(zhuǎn)換的地址轉(zhuǎn)換表時需要先構(gòu)造私網(wǎng)IP地址端口對與公網(wǎng)IP地址端口對的映射關(guān)系。理論上說一個公網(wǎng)IP地址端口對可以通過五元組(源IP、目的IP、源端口、目的端口、協(xié)議號)的方式實現(xiàn)與不同的私網(wǎng)IP地址端口對形成映射關(guān)系;但在實際的應(yīng)用中,通常同一公網(wǎng)IP地址端口對只會與一個私網(wǎng)IP地址端口對形成映射關(guān)系,因為在某些情況下,可能需要對公網(wǎng)IP地址端口對進行溯源,若同一個公網(wǎng)IP地址端口對與多個私網(wǎng)IP地址端口對形成映射,那么就無法進行溯源。
[0004]在構(gòu)造映射關(guān)系時,通過一定的方式計算出使用哪個公網(wǎng)IP地址后,還應(yīng)當計算出一個16位的端口號,并且這個端口號還沒有被其它使用了這個公網(wǎng)IP地址的映射關(guān)系使用,一個公網(wǎng)地址有65536個端口,其中部分端口還要保留為特殊應(yīng)用。目前的端口分配方法,主要有以下兩種:
[0005]1)NAT服務(wù)器為每個公網(wǎng)地址初始化一個端口資源列表,采用遍歷端口資源列表的方法來獲取可用端口,并將成功獲取的端口標記為已占用。
[0006]2) NAT服務(wù)器采用隨機分配一個端口,并通過查詢現(xiàn)有地址轉(zhuǎn)換表的方式判斷該端口是否已經(jīng)被使用的方法來獲取端口。
[0007]傳統(tǒng)的端口資源分配方式效率低下,采用遍歷資源列表的方法會耗費大量的時間來進行遍歷;隨機分配的方法會出現(xiàn)一個命中率的問題,存在一定的失敗率,可能需要多次嘗試才能成功分配一個可用端口,且無法分配所有端口,造成端口資源的浪費。
【發(fā)明內(nèi)容】
[0008]本發(fā)明所要解決的技術(shù)問題是:提出一種實現(xiàn)NAPT端口資源分配的方法,解決傳統(tǒng)技術(shù)中端口資源分配方案存在的分配效率低、命中率低的問題。
[0009]字長為計算機能夠在同一時間處理的二進制數(shù)最長位數(shù)在本發(fā)明實施例中,在本發(fā)明實施例中,用η表示一個整數(shù),則[η]表示能被字長整除的且不小于η的最小整數(shù)。M (η)表示η除以字長所得余數(shù);D(n)表示η除以字長所得商。
[0010]本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:
[0011]一種實現(xiàn)NAPT端口資源分配的方法,包括:
[0012]將需要管理的端口資源中的各個端口與一段連續(xù)內(nèi)存M中的比特位一一關(guān)聯(lián)對應(yīng),將M中連續(xù)字長個位作為一個整數(shù)使用,從而將對M中位的管理轉(zhuǎn)換為對整數(shù)集合的位運算;通過逐層壓縮的方式,最終將所有需要管理的端口資源映射到一個整數(shù)R上,在進行端口分配時,以整數(shù)R為基礎(chǔ)通過判斷其各個位的狀態(tài)來確定該位對應(yīng)的下一層整數(shù)中是否存在可用端口,然后再通過所述下一層整數(shù)中的各個位的狀態(tài)來確定該位對應(yīng)的后一層整數(shù)中是否存在可用端口,基于此方式最終查找到可用端口。
[0013]該方法還包括:記錄上次分配端口成功時所使用的整數(shù)集合中的某個整數(shù)的位置,下一次分配端口時如果該整數(shù)中存在可用端口,則直接使用該整數(shù)進行端口資源的分配。
[0014]具體的,該方法包括以下步驟:
[0015]Α.創(chuàng)建用于對端口資源進行管理的端口資源管理節(jié)點N,在節(jié)點N中包括以下各個字段:
[0016]起始端口 base字段、結(jié)束端口 end字段、整型指針data字段、索引值index字段、指針數(shù)組bi字段、深度值depth字段;
[0017]所述整型指針data用于端口資源的管理,其指向內(nèi)存中的每個比特位與需要管理的端口——對應(yīng);
[0018]所述索引值index用于索引data指向內(nèi)存中的整數(shù);
[0019]所述指針數(shù)組bi中的每個元素都是一個整型指針,用于逐層壓縮data指向的內(nèi)存的比特信息;
[0020]所述深度值cbpth用于表示二維數(shù)組bi的大??;
[0021]B.初始化端口資源管理節(jié)點N,初始化過程包括:
[0022]B1.將index初始化為0,計算可使用端口的總數(shù)total和深度值depth值;
[0023]B2.根據(jù)total和depth值計算出管理端口資源所需的總內(nèi)存量tm ;
[0024]B3.申請一塊內(nèi)存量為tm的連續(xù)的內(nèi)存;并初始化data、bi及bi的各元素的指向;
[0025]B4.將申請的內(nèi)存的內(nèi)容初始化為全I ;
[0026]B5.分別將bi各元素、data中最后一個整數(shù)中需要重新置O的比特位重新置O ;
[0027]在初始化過程完成后,data中的每一個位表示一個端口的使用情況,I表示對應(yīng)的端口可用,O表示對應(yīng)的端口不可用;
[0028]C.當需要分配一個可用端口時,先根據(jù)index在data中找到整數(shù)data[index],如果data[index]為0,則通過bi重新計算index的值;然后計算出整數(shù)data[index]的某個I比特位在data [index]中的位置偏移量offset,S卩可計算出對應(yīng)的端口號,從而分配該端口。
[0029]進一步的,還包括步驟:
[0030]D.當有端口被釋放時,根據(jù)該被釋放的端口值定位其對應(yīng)的比特位以及該比特位對應(yīng)的整數(shù)在data中的索引INDEX值,然后將該比特位置為1,以表示該對應(yīng)的端口可用,并更新bi中與該比特位有關(guān)聯(lián)的元素內(nèi)容。
[0031]具體的,步驟BI中,計算可使用端口的總數(shù)total和深度值depth值的方法為:
[0032]首先根據(jù)base與end的值計算可使用端口的總數(shù)total值:total = end -base+1 ;
[0033]然后根據(jù)total值計算出depth,計算方法如下:
[0034]I)將cbpth初始化為O ;
[0035]2) depth 加 1,total 的值更新為 D ([total];
[0036]3)循環(huán)步驟 2)直至 D([total])為 I ;
[0037]其中,D([total])表示total除以字長所得的商。
[0038]具體的,步驟B2中,所述管理端口所需的總內(nèi)存量tm包括:data指向的內(nèi)存、bi指向的內(nèi)存,以及bi各元素指向的內(nèi)存,根據(jù)total以及depth計算出管理端口所需的總內(nèi)存量tm的方法如下:
[0039]I)將 tm 初始化為 cbpth 與 BYTES_PTR 之積,t 初始化為 D ([total]);
[0040]2)如果cbpth不為0,則重復(fù)步驟3直到cbpth為O位置;
[0041 ] 3) t 的值更新為 D ([t]),tm 加上 t 與 BYTES_LONG 之積,cbpth 減 I,其中 t 與 BYTES_LONG之積就是bi [depth-?]指向的內(nèi)存的字節(jié)數(shù);
[0042]4) tm 的值加上 D ([total])與 BYTES_LONG 之積;
[0043]其中,BYTES_PTR表示一個指針數(shù)據(jù)類型的字節(jié)數(shù),BYTES_LONG表示一個整數(shù)的字節(jié)數(shù),t是一個用于輔助計算的整數(shù)。
[0044]具體的,步驟B5中,分別將bi各元素、data中最后一個整數(shù)中需要重新置O的比特位重新置O的方法如下:
[0045]I)找到data中的最后一個整數(shù)L,如果M (total)不為0,則將L的第M (total)位及第M(total)位之后的所有位置0,將total的值更新為D ([total]);
[0046]2)找到bi [depth-1]中的最后一個整數(shù)L,如果M(total)不為0,則將L的第M(total)位及第M(total)位之后的所有位置0,將total的值更新為D([total]);
[0047]3)重復(fù)步驟2),直至cbpth為O ;
[0048]其中,M(total)表示total除以字長所得的余數(shù)。
[0049]具體的,步驟B中,在初始化過程完成后,可以通過data中某一位在對應(yīng)的整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX來計算該位對應(yīng)的端口號,或者通過某一位對應(yīng)的端口號來計算該位在對應(yīng)整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX:
[0050]其中,通過data中某一位在對應(yīng)的整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX來計算該位對應(yīng)的端口號的方法是:
[0051 ]端口號=INDEX X 字長 +off set+base ;
[0052]通過某一位對應(yīng)的端口號來計算該位在對應(yīng)整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX的方法是:
[0053]INDEX = D (端口號-base);
[0054]offset = M(端口號-base)。
[0055]具體的,步驟C,通過bi重新計算index的值的方法為:
[0056]I) index、t、t0、tl 的初始值設(shè)為 0 ;
[0057]2)從bi[t]中的第index個整數(shù)中獲取一個I比特位,將其保存在t0中,然后將tl的值加上to,接著將index的值更新為tl,最后t加I ;
[0058]3)重復(fù)步驟2)直至t的值不小于depth為止;
[0059]其中,t, t0, tl是用于輔助計算的整數(shù)。
[0060]具體的,步驟C中,還包括:
[0061]在根據(jù)data[index]計算出一個可用端口并進行分配后,將data[index]中對應(yīng)的位標記為O后,并同步更新bi中與該位有關(guān)聯(lián)的各元素中的內(nèi)容。
[0062]本發(fā)明的有益效果是:在建立NAT會話進行端口分配時,使用很少的內(nèi)存就可以提供O(1gN)時間復(fù)雜度的端口分配,避免了遍歷或者多次查找,且提高了端口利用率,只要還有端口可用,就不存在分配失敗的情況,提升了設(shè)備的業(yè)務(wù)性能,緩解了 NAT會話建立速率、端口利用率與內(nèi)存占用之間的矛盾,保證私網(wǎng)用戶上網(wǎng)體驗。
【專利附圖】
【附圖說明】
[0063]圖1是端口資源管理節(jié)點N的各字段示意圖;
[0064]圖2是二維數(shù)組bi的各元素與data之間的關(guān)系;
[0065]圖3是對端口資源管理節(jié)點N進行初始化后內(nèi)存布局示意圖;
[0066]圖4a、4b、4c是32位系統(tǒng)上節(jié)點N初始化后bi各元素以及data指向的內(nèi)存內(nèi)容示例,其中圖4a針對total = 34的端口資源情況,圖4b針對total = 40的端口資源情況,圖4c針對total = 82的端口資源情況。
【具體實施方式】
[0067]本發(fā)明旨在提出一種實現(xiàn)NAPT端口資源分配的方法,解決傳統(tǒng)技術(shù)中端口資源分配方案存在的分配效率低、命中率低的問題,從而更加合理和高效地對端口資源進行管理,保障NAT服務(wù)器在各種情況下均能高效地完成IP地址端口對的映射,充分利用外網(wǎng)端口資源。
[0068]本發(fā)明方案的主導(dǎo)思想是:(I)將需要管理的端口資源P中的各個端口與一段連續(xù)內(nèi)存M中的比特位——對應(yīng),將端口資源的管理轉(zhuǎn)化為對M中比特位的管理,值為I的比特位表示對應(yīng)的端口可用,值為O的比特位表示對應(yīng)的端口不可用;(2)M中連續(xù)字長個位可以作為一個整數(shù)使用,對M中位的管理轉(zhuǎn)換為對一些整數(shù)(這些整數(shù)構(gòu)成一個整數(shù)集合S)的位運算,進而將端口資源的管理轉(zhuǎn)化為集合S中的整數(shù)的位運算,并且可以通過整數(shù)值是否為O來判斷該整數(shù)的所有位對應(yīng)的端口中是否還有可用端口 ;(3)為了更高效地計算出P中的可用端口,即M中值為I的比特位的位置,S中的每一個整數(shù)A與另一個整數(shù)B的某個位b形成一一映射關(guān)系(如果A為0,則b為O ;如果A不為0,則b為I),并借助b來管理A,這樣整數(shù)B就可以同時管理字長個數(shù)的整數(shù),而B又可以與另一個整數(shù)C的某個比特位c形成一一映射關(guān)系(如果B為0,則c為O ;如果B不為0,則c為I),通過這樣的方式,需要管理的端口資源最終都可以映射到一個整數(shù)R上,并以R為根基可以快速找到一個可用端口 ;(4)為了進一步提高計算效率,可以記錄上次分配端口成功時所使用的S中的整數(shù)T的位置,下一次分配端口時如果T的值不為0,則可以直接使用T進行端口資源的分配。
[0069]下面結(jié)合附圖及實施例對本發(fā)明的方案作更進一步的描述:
[0070]在本例中,實現(xiàn)NAPT端口資源分配的方法包括以下步驟:
[0071]I)創(chuàng)建用于對端口資源進行管理的端口資源管理節(jié)點N,節(jié)點N包括:
[0072]起始端口(base)、結(jié)束端口(end)、一個整型指針(用于端口資源的管理,指向的內(nèi)存的每個比特位與需要管理的端口--對應(yīng),data)、索引值index,用于索引data執(zhí)向的內(nèi)存中的整數(shù),這個整數(shù)是上次分配源端口成功時所使用的整數(shù))、一個指針數(shù)組(每個元素是一個整型指針,具體實現(xiàn)則使用二維整型指針,用于逐層壓縮data指向的內(nèi)存的比特信息,優(yōu)化端口資源的管理,bi)、一個深度值(用于表示二維數(shù)組bi的大小,cbpth);端口資源管理節(jié)點N的各字段如圖1所示。
[0073]2)初始化節(jié)點N,初始化過程如下:
[0074]a) index初始化為0,根據(jù)base與end的值計算出可使用端口的總數(shù)total,其中base與end都應(yīng)當大于O且end不應(yīng)當小于base ;計算公式如為:total = end - base+1。
[0075]b)根據(jù)total計算出depth,即二維數(shù)組bi的大小。depth不為O時,二維數(shù)組bi的各元素與data之間的關(guān)系,一種簡單的情況如圖2所示。
[0076]在圖2中,對于data中(data指向的內(nèi)存中,下同)的每個整數(shù)I,都與bi [O]中的某個比特位b——對應(yīng),如果I為0,則b為O ;如果I不為0,則b為I ;反過來看,如果b為1,則I 一定不為0,也就是I中至少有一個比特位為I ;如果b為0,則I 一定為0,即I的所有位對應(yīng)的端口中一定沒有可用端口。這樣,data中的比特位位信息就壓縮到了 bi [O]中了(更復(fù)雜的情況下,如果depth大于1,data中的比特位信息壓縮到bi[depth_l]中,而bi[cbpth_l]中的比特位信息又可以壓縮到bi[cbpth_2]中,如此重復(fù),最終就可以將data中的比特位信息壓縮到bi [O]中);
[0077]通過bi這個二維數(shù)組,從bi [O]開始,可以快速地找到一個data中的整數(shù)I,I的所有位對應(yīng)的端口中一定還有可用端口,接下來只需要找到整數(shù)I中某個I比特位,就如同找到了一個可用端口。如果depth為0,則表示不需要對data中的比特信息進行壓縮,也就不需要二維數(shù)組了。cbpth的計算方法如下:
[0078]1.將depth初始值設(shè)為O ;
[0079]2.如果D ([total])不為I,則重復(fù)如步驟3直到D ([total])為I ;
[0080]3.depth 加 I,total 的值更新為 D([total])。
[0081]c)根據(jù)total以及depth計算出管理端口所需的總內(nèi)存量tm,其中包括data指向的內(nèi)存、bi指向的內(nèi)存,以及bi各元素指向的內(nèi)存。計算方法如下,其中BYTES_PTR表示一個指針數(shù)據(jù)類型的字節(jié)數(shù),BYTES_LONG表示一個整數(shù)的字節(jié)數(shù),t是一個用于輔助計算的整數(shù):
[0082]1.將 tm 初始化為 cbpth 與 BYTES_PTR 之積,t 初始化為 D ([total]);
[0083]2.如果cbpth不為0,則重復(fù)步驟3直到cbpth為O位置;
[0084]3.t 的值更新為 D ([t]),tm 加上 t 與 BYTES_LONG 之積,cbpth 減 I,其中 t 與 BYTES_LONG之積就是bi [depth-?]指向的內(nèi)存的字節(jié)數(shù);
[0085]4.tm 的值加上 D([total])與 BYTES_LONG 之積。
[0086]計算出需要的內(nèi)存總量之后,可以申請一塊連續(xù)的內(nèi)存,并初始化data,bi,以及bi各元素的指向初始化之后,內(nèi)存布局如圖3所示。
[0087]d)在步驟c申請的內(nèi)存中,從bi [O]指向的內(nèi)存處開始,將申請的內(nèi)存的內(nèi)容初始化為全I ;
[0088]e)接下來需要分別將bi各元素、data中最后一個整數(shù)中需要重新置O的比特位重新置0,方法如下,其中t是一個用于輔助計算的整數(shù):
[0089]1.找到data中的最后一個整數(shù)L,如果M (total)不為0,則將L的第M (total)位之后(包括第M(total)位)的所有位置0,將total的值更新為D ([total]);
[0090]2.如果depth不為0,則進行步驟3,直到depth為O為止;
[0091]3.找到bi [depth-Ι]中的最后一個整數(shù)L,如果M(total)不為0,則將L的第M(total)位之后(包括第M(total)位)的所有位置0,將total的值更新為D ([total])。
[0092]f)此時,data中的每一個位表示一個端口的使用情況,I表示對應(yīng)的端口可用,O表示對應(yīng)的端口不可用。假如data中位b在對應(yīng)的整數(shù)I中的偏移量為offset,整數(shù)I在data中的偏移量為INDEX,那么:
[0093]端口號=INDEXX 字長 +offset+base。
[0094]反過來,也可以通過端口號計算對應(yīng)位的INDEX和offset:
[0095]INDEX = D (端口號-base);
[0096]offset = M(端口號-base)。
[0097]至此,節(jié)點N的初始化完成。假如在32位系統(tǒng)上,初始化后節(jié)點bi各元素以及data指向的內(nèi)存內(nèi)容可能如圖4a、4b、4c所示:
[0098]即使depth為1,bi[0]也能同時管理字長個數(shù)的整數(shù),但如果需要管理的端口資源比較少,沒有必要為bi[0]的每個位都映射一個整數(shù),而是采用按需映射的方式,這樣可以有效地節(jié)約系統(tǒng)內(nèi)存。如果需要管理的端口數(shù)小于字長,那么depth為0,這時候就不需要bi這個二維數(shù)組了。
[0099]3)當需要分配一個可用端口時,先根據(jù)index在data中找到整數(shù)data[index],如果data[index]為0,則通過bi重新計算index的值;然后通過一定的算法計算出整數(shù)data [index]的某個I比特位在data [index]中的位置偏移量offset,即可計算出對應(yīng)的端口號。對于如何從一個整數(shù)中獲取一個I比特位,不在本發(fā)明的范疇,此處不進行過多的闡釋。
[0100]對于需要重新計算index的情況,計算過程如下,其中t, t0, tl是用于輔助計算的整數(shù):
[0101]1.1ndex、t、t0、tl 的初始值設(shè)為 O ;
[0102]2.如果depth不為0,且t的值小于depth,那么進行步驟3直到t的值不小于depth為止;
[0103]3.從bi[t]中的第index個整數(shù)中獲取一個I比特位,將其保存在t0中,然后將tl的值加上to,接著將index的值更新為tl,最后t加I ;
[0104]在根據(jù)data[index]計算出一個可用端口,并將data[index]中對應(yīng)的位標記為O后,需要同步更新bi各元素中的內(nèi)容。也就是如果data [index]的值變?yōu)镺 了,bi [depth-Ι]中與data [index]對應(yīng)的為位b需要置0,如果bi [depth -1]中b所在的整數(shù)變?yōu)?,還需要繼續(xù)更新bi [depth-2],......,如此下去,直到上層中對應(yīng)的比特位所在的整數(shù)不為O為止。
[0105]4)當有端口被釋放時,可以根據(jù)端口值直接定位對應(yīng)的比特位b以及該比特位對應(yīng)的整數(shù)I在data中的索引INDEX,然后將b置為I,表示對應(yīng)的端口可用了。這時候,需要同步更新bi各元素中的內(nèi)容,bi [depth-Ι]中與data [INDEX]對應(yīng)的為位c需要置1,bi [depth -1]中c所在的整數(shù)在bi [depth-2]中對應(yīng)的比特位置1,如此下去,直到bi [O]中對應(yīng)的比特位置I為止。
[0106]在實際應(yīng)用中,因為部分端口被作為特殊應(yīng)用,公網(wǎng)端口不應(yīng)當使用這些端口,那么需要管理的端口就不是連續(xù)的。可以在初始化之后分配端口之前,先將那些不能被分配出去的端口占用,這些端口就永遠不會被分配出去,達到管理不連續(xù)端口的目的。
[0107]當cbpth不為O時,bi [O]指向的整數(shù)為0,表示已經(jīng)無可用端口,否則還存在可用端口 ;depth為O時,data[0]為0,則表不已經(jīng)無可用端口,否則還存在可用端口。
【權(quán)利要求】
1.一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,包括: 將需要管理的端口資源中的各個端口與一段連續(xù)內(nèi)存M中的比特位一一關(guān)聯(lián)對應(yīng),將M中連續(xù)字長個位作為一個整數(shù)使用,從而將對M中位的管理轉(zhuǎn)換為對整數(shù)集合的位運算;通過逐層壓縮的方式,最終將所有需要管理的端口資源映射到一個整數(shù)R上,在進行端口分配時,以整數(shù)R為基礎(chǔ)通過判斷其各個位的狀態(tài)來確定該位對應(yīng)的下一層整數(shù)中是否存在可用端口,然后再通過所述下一層整數(shù)中的各個位的狀態(tài)來確定該位對應(yīng)的后一層整數(shù)中是否存在可用端口,基于此方式最終查找到可用端口。
2.如權(quán)利要求1所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,還包括:記錄上次分配端口成功時所使用的整數(shù)集合中的某個整數(shù)的位置,下一次分配端口時如果該整數(shù)中存在可用端口,則直接使用該整數(shù)進行端口資源的分配。
3.如權(quán)利要求1所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,該方法具體包括以下步驟: A.創(chuàng)建用于對端口資源進行管理的端口資源管理節(jié)點N,在節(jié)點N中包括以下各個字段: 起始端口 base字段、結(jié)束端口 end字段、整型指針data字段、索引值index字段、指針數(shù)組bi字段、深度值depth字段; 所述整型指針data用于端口資源的管理,其指向內(nèi)存中的每個比特位與需要管理的端□ 對應(yīng); 所述索引值index用于索引data指向內(nèi)存中的整數(shù); 所述指針數(shù)組bi中的每個元素都是一個整型指針,用于逐層壓縮data指向的內(nèi)存的比特信息; 所述深度值depth用于表示二維數(shù)組bi的大小; B.初始化端口資源管理節(jié)點N,初始化過程包括: B1.將index初始化為O,計算可使用端口的總數(shù)total和深度值depth值; B2.根據(jù)total和depth值計算出管理端口資源所需的總內(nèi)存量tm ; B3.申請一塊內(nèi)存量為tm的連續(xù)的內(nèi)存;并初始化data、bi及bi的各元素的指向; B4.將申請的內(nèi)存的內(nèi)容初始化為全I ; B5.分別將bi各元素、data中最后一個整數(shù)中需要重新置O的比特位重新置O ; 在初始化過程完成后,data中的每一個位表示一個端口的使用情況,I表示對應(yīng)的端口可用,O表示對應(yīng)的端口不可用; C.當需要分配一個可用端口時,先根據(jù)index在data中找到整數(shù)data[index],如果data [index]為0,則通過bi重新計算index的值;然后計算出整數(shù)data[index]的某個I比特位在data[index]中的位置偏移量offset,即可計算出對應(yīng)的端口號,從而分配該端□ O
4.如權(quán)利要求3所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,還包括步驟: D.當有端口被釋放時,根據(jù)該被釋放的端口值定位其對應(yīng)的比特位以及該比特位對應(yīng)的整數(shù)在data中的索引INDEX值,然后將該比特位置為1,以表示該對應(yīng)的端口可用,并更新bi中與該比特位有關(guān)聯(lián)的元素內(nèi)容。
5.如權(quán)利要求3所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,步驟BI中,計算可使用端口的總數(shù)total和深度值depth值的方法為: 首先根據(jù)base與end的值計算可使用端口的總數(shù)total值:total = end - base+1 ; 然后根據(jù)total值計算出depth,計算方法如下: 將cbpth初始化為O ; depth加I, total的值更新為D([total]),循環(huán)執(zhí)行本步驟;直至D([total])為I ; 其中,D([total])表示total除以字長所得的商。
6.如權(quán)利要求5所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,步驟B2中,所述管理端口所需的總內(nèi)存量tm包括:data指向的內(nèi)存、bi指向的內(nèi)存,以及bi各元素指向的內(nèi)存,根據(jù)total以及depth計算出管理端口所需的總內(nèi)存量tm的方法如下: 將tm初始化為cbpth與BYTES_PTR之積,t初始化為D ([total]); 如果depth不為0,則重復(fù)步驟3直到depth為O位置; t的值更新為D ([t]),tm加上t與BYTES_LONG之積,depth減I,其中t與BYTES_LONG之積就是bi [depth-1]指向的內(nèi)存的字節(jié)數(shù); tm 的值加上 D([total])與 BYTES_LONG 之積; 其中,BYTES_PTR表示一個指針數(shù)據(jù)類型的字節(jié)數(shù),BYTES_LONG表示一個整數(shù)的字節(jié)數(shù),t是一個用于輔助計算的整數(shù)。
7.如權(quán)利要求3所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,步驟B5中,分別將bi各元素、data中最后一個整數(shù)中需要重新置O的比特位重新置O的方法如下: 找到data中的最后一個整數(shù)L,如果M(total)不為0,則將L的第M(total)位及第M(total)位之后的所有位置Odftotal的值更新為D([total]); 找到bi [depth-1]中的最后一個整數(shù)L,如果M(total)不為0,則將L的第M(total)位及第M(total)位之后的所有位置Odftotal的值更新為D ([total]),循環(huán)執(zhí)行本步驟,直至depth為O ; 其中,M(total)表示total除以字長所得的余數(shù)。
8.如權(quán)利要求3所述的一種實現(xiàn)實現(xiàn)NAPT端口資源分配的方法,其特征在于,步驟B中,在初始化過程完成后,可以通過data中某一位在對應(yīng)的整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX來計算該位對應(yīng)的端口號,或者通過某一位對應(yīng)的端口號來計算該位在對應(yīng)整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX: 其中,通過data中某一位在對應(yīng)的整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX來計算該位對應(yīng)的端口號的方法是: 端口號=INDEX X 字長+offset+base ; 通過某一位對應(yīng)的端口號來計算該位在對應(yīng)整數(shù)I中的偏移量offset和整數(shù)I在data中的偏移量INDEX的方法是: INDEX = D (端口號-base); offset =M(端口號- base)。
9.如權(quán)利要求3所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,步驟C,通過bi重新計算index的值的方法為: index、t、tO、tl的初始值設(shè)為O ; 從bi[t]中的第index個整數(shù)中獲取一個I比特位,將其保存在tO中,然后將tl的值加上tO,接著將index的值更新為tl,最后t加1,循環(huán)執(zhí)行本步驟,直至t的值不小于depth為止; 其中,t, tO, tl是用于輔助計算的整數(shù)。
10.如權(quán)利要求9所述的一種實現(xiàn)NAPT端口資源分配的方法,其特征在于,步驟C中,還包括: 在根據(jù)data [index]計算出一個可用端口并進行分配后,將data[index]中對應(yīng)的位標記為O后,并同步更新bi中與該位有關(guān)聯(lián)的各元素中的內(nèi)容。
【文檔編號】H04L12/911GK104506460SQ201410836844
【公開日】2015年4月8日 申請日期:2014年12月29日 優(yōu)先權(quán)日:2014年12月29日
【發(fā)明者】馬海 申請人:邁普通信技術(shù)股份有限公司