本發(fā)明涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,尤其涉及一種端口分配的方法及裝置。
背景技術(shù):
內(nèi)網(wǎng)中的計(jì)算機(jī)在訪問互聯(lián)網(wǎng)時(shí),需要通過網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)將內(nèi)網(wǎng)計(jì)算機(jī)對(duì)應(yīng)的內(nèi)網(wǎng)網(wǎng)間協(xié)議(Internet Protocol,IP)地址轉(zhuǎn)換為互聯(lián)網(wǎng)中的公網(wǎng)IP地址,然后使用公網(wǎng)IP地址訪問互聯(lián)網(wǎng)。網(wǎng)絡(luò)端口地址轉(zhuǎn)換(Network Address Port Translation,NAPT)是一種常用的網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)。在實(shí)際的應(yīng)用中,NAPT是在內(nèi)網(wǎng)IP地址對(duì)應(yīng)的計(jì)算機(jī)向互聯(lián)網(wǎng)發(fā)起連接時(shí),將內(nèi)網(wǎng)IP地址轉(zhuǎn)換為公網(wǎng)IP地址,并且為對(duì)應(yīng)的連接分配一個(gè)公網(wǎng)IP地址對(duì)應(yīng)的協(xié)議端口。每個(gè)公網(wǎng)IP地址可以使用的協(xié)議端口數(shù)量為65536個(gè),由于協(xié)議端口數(shù)量是有限的,因此對(duì)于協(xié)議端口的搶占是不可避免的。為了保證在進(jìn)行協(xié)議端口分配時(shí)不沖突,通常使用portmap來表示協(xié)議端口的占用情況。portmap是一個(gè)8K內(nèi)存的char pm[8192]數(shù)組,由于每個(gè)字節(jié)由8個(gè)比特組成,8192個(gè)字節(jié)共占用65536個(gè)比特,因此可以用portmap來表示65536個(gè)協(xié)議端口的占用情況。通常比特置1則表示對(duì)應(yīng)的協(xié)議端口被占用,比特置0則表示對(duì)應(yīng)的協(xié)議端口未占用。
對(duì)于一個(gè)計(jì)算機(jī)數(shù)量較多的內(nèi)網(wǎng),通常會(huì)分配多個(gè)公網(wǎng)IP地址,使內(nèi)網(wǎng)中的計(jì)算機(jī)可以通過不同公網(wǎng)IP地址訪問互聯(lián)網(wǎng)。對(duì)于有多個(gè)公網(wǎng)IP地址的情況,現(xiàn)有的公網(wǎng)IP地址對(duì)應(yīng)的協(xié)議端口的分配機(jī)制為:每個(gè)公網(wǎng)IP地址對(duì)應(yīng)各自的portmap,相當(dāng)于每個(gè)公網(wǎng)IP地址都只能分配各自對(duì)應(yīng)的portmap對(duì)應(yīng)的65536個(gè)協(xié)議端口,對(duì)于每個(gè)公網(wǎng)IP地址來講,當(dāng)對(duì)應(yīng)的訪問互聯(lián)網(wǎng)的連接較少時(shí),對(duì)應(yīng)需要分配的協(xié)議端口較少,但是依然會(huì)提供一個(gè)portmap對(duì)應(yīng)的65536個(gè)協(xié)議端口供分配,會(huì)造成其中大量的協(xié)議端口未使用,當(dāng)對(duì)應(yīng)的訪問互聯(lián)網(wǎng)的連接較多并且需要分配的協(xié)議端口超過65536個(gè)時(shí),仍然只能提供一個(gè)portmap對(duì)應(yīng)的65536個(gè)協(xié)議端口供分配,從而造成一些連接無法分配到協(xié)議端口。綜上,可以看出現(xiàn)有的公網(wǎng)IP地址對(duì)應(yīng)的協(xié)議端口的分配機(jī)制存在實(shí)際需求的協(xié)議端口數(shù)和可供分配的協(xié)議端口數(shù)之間的不平衡的問題。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,本發(fā)明提供一種端口分配的方法及裝置,用以解決現(xiàn)有的公網(wǎng)IP地址對(duì)應(yīng)的協(xié)議端口的分配機(jī)制存在實(shí)際需求的協(xié)議端口數(shù)和可供分配的協(xié)議端口數(shù)之間的不平衡的問題。
一方面,本發(fā)明提供了一種端口分配的方法,包括:
接收協(xié)議端口請(qǐng)求,所述協(xié)議端口請(qǐng)求表示,當(dāng)內(nèi)網(wǎng)中的計(jì)算機(jī)向外網(wǎng)發(fā)起連接時(shí),請(qǐng)求為所述連接分配協(xié)議端口;
根據(jù)所述協(xié)議端口請(qǐng)求查找是否存在已分配的portmap,所述portmap為用于表示協(xié)議端口的占用情況的數(shù)組,所述數(shù)組中的元素與協(xié)議端口一一對(duì)應(yīng);
若存在已分配的portmap,則將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給所述連接;
若不存在已分配的portmap,則啟用新的portmap進(jìn)行分配;并且,
將所述新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給所述連接。
具體的,所述根據(jù)所述協(xié)議端口請(qǐng)求查找是否存在已分配的portmap,包括:
根據(jù)所述協(xié)議端口請(qǐng)求查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn),所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)用于分配portmap對(duì)應(yīng)的協(xié)議端口,數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)與portmap是多對(duì)一的對(duì)應(yīng)關(guān)系;
根據(jù)所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)查找符合預(yù)設(shè)條件的已分配的portmap。
具體的,根據(jù)所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)查找符合預(yù)設(shè)條件的已分配的portmap,包括:
判斷所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)是否存在對(duì)應(yīng)的portmap;
若存在對(duì)應(yīng)的portmap,則查找已分配的portmap中與所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap;
若不存在對(duì)應(yīng)的portmap,則查找已分配的portmap中符合預(yù)設(shè)規(guī)則的portmap,所述預(yù)設(shè)規(guī)則為portmap已經(jīng)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)少于portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)。
具體的,所述方法進(jìn)一步包括:
當(dāng)任一portmap對(duì)應(yīng)的協(xié)議端口出現(xiàn)被全部占用的情況時(shí),觸發(fā)自適應(yīng)更新機(jī)制,所述自適應(yīng)更新機(jī)制用于更新所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值,所述n值表示包括與n值對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在內(nèi)的n個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)能夠?qū)?yīng)一個(gè)portmap;
統(tǒng)計(jì)包含觸發(fā)自適應(yīng)更新機(jī)制時(shí)刻在內(nèi)的預(yù)設(shè)時(shí)段內(nèi)所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的m值,所述m值為預(yù)設(shè)時(shí)段內(nèi)通過數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)分配出去的與數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap對(duì)應(yīng)的協(xié)議端口的數(shù)量。
具體的,所述方法進(jìn)一步包括:
當(dāng)?shù)竭_(dá)預(yù)設(shè)更新時(shí)間時(shí),啟動(dòng)自適應(yīng)更新機(jī)制,根據(jù)所述m值對(duì)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值進(jìn)行調(diào)整。
具體的,所述方法進(jìn)一步包括:
在到達(dá)預(yù)設(shè)更新時(shí)間前,若多次觸發(fā)自適應(yīng)更新機(jī)制,則分別統(tǒng)計(jì)每次觸發(fā)自適應(yīng)更新機(jī)制時(shí),所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的m值;
選出到達(dá)預(yù)設(shè)更新時(shí)間前,已分配的portmap對(duì)應(yīng)的每個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的多個(gè)m值中最大的m值;
根據(jù)最大的m值對(duì)已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值進(jìn)行調(diào)整。
具體的,所述根據(jù)協(xié)議端口請(qǐng)求查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn),包括:
獲取所述協(xié)議端口請(qǐng)求對(duì)應(yīng)的通信信息組,所述通信信息組包括所述協(xié)議端口請(qǐng)求對(duì)應(yīng)的公網(wǎng)網(wǎng)間協(xié)議IP地址、目的IP地址、目的IP地址對(duì)應(yīng)的協(xié)議端口;
從預(yù)設(shè)哈希映射表中查找與所述通信信息組對(duì)應(yīng)的位置標(biāo)識(shí),所述位置標(biāo)識(shí)為數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中的位置標(biāo)識(shí);
根據(jù)所述位置標(biāo)識(shí)在所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)。
另一方面,本發(fā)明提供了一種端口分配的裝置,包括:
接收單元,用于接收協(xié)議端口請(qǐng)求,所述協(xié)議端口請(qǐng)求表示,當(dāng)內(nèi)網(wǎng)中的計(jì)算機(jī)向外網(wǎng)發(fā)起連接時(shí),為所述連接請(qǐng)求分配協(xié)議端口;
查找單元,用于根據(jù)所述協(xié)議端口請(qǐng)求查找是否存在已分配的portmap,所述portmap為用于表示協(xié)議端口的占用情況的數(shù)組,所述數(shù)組中的元素與協(xié)議端口一一對(duì)應(yīng);
第一分配單元,用于若存在已分配的portmap,則將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給所述連接;
第二分配單元,用于若不存在已分配的portmap,則啟用新的portmap進(jìn)行分配;并且,
將所述新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給所述連接。
具體的,所述查找單元包括:
第一查找模塊,用于根據(jù)所述協(xié)議端口請(qǐng)求查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn),所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)用于分配portmap對(duì)應(yīng)的協(xié)議端口,數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)與portmap是多對(duì)一的對(duì)應(yīng)關(guān)系;
第二查找模塊,用于根據(jù)所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)查找符合預(yù)設(shè)條件的已分配的portmap。
具體的,所述第二查找模塊用于:
判斷所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)是否存在對(duì)應(yīng)的portmap;
若存在對(duì)應(yīng)的portmap,則查找已分配的portmap中與所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap;
若不存在對(duì)應(yīng)的portmap,則查找已分配的portmap中符合預(yù)設(shè)規(guī)則的portmap,所述預(yù)設(shè)規(guī)則為portmap已經(jīng)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)少于portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)。
具體的,所述裝置進(jìn)一步包括:
觸發(fā)單元,用于當(dāng)任一portmap對(duì)應(yīng)的協(xié)議端口出現(xiàn)被全部占用的情況時(shí),觸發(fā)自適應(yīng)更新機(jī)制,所述自適應(yīng)更新機(jī)制用于更新所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值,所述n值表示包括與n值對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在內(nèi)的n個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)能夠?qū)?yīng)一個(gè)portmap;
統(tǒng)計(jì)單元,用于統(tǒng)計(jì)包含觸發(fā)自適應(yīng)更新機(jī)制時(shí)刻在內(nèi)的預(yù)設(shè)時(shí)段內(nèi)所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的m值,所述m值為預(yù)設(shè)時(shí)段內(nèi)通過數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)分配出去的與數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap對(duì)應(yīng)的協(xié)議端口的數(shù)量。
具體的,所述裝置進(jìn)一步包括:
啟動(dòng)單元,用于當(dāng)?shù)竭_(dá)預(yù)設(shè)更新時(shí)間時(shí),啟動(dòng)自適應(yīng)更新機(jī)制,根據(jù)所述m值對(duì)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值進(jìn)行調(diào)整。
具體的,所述裝置進(jìn)一步包括:
所述統(tǒng)計(jì)單元,還用于在到達(dá)預(yù)設(shè)更新時(shí)間前,若多次觸發(fā)自適應(yīng)更新機(jī)制,則分別統(tǒng)計(jì)每次觸發(fā)自適應(yīng)更新機(jī)制時(shí),所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的m值;
選擇單元,用于選出到達(dá)預(yù)設(shè)更新時(shí)間前,已分配的portmap對(duì)應(yīng)的每個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的多個(gè)m值中最大的m值;
調(diào)整單元,用于根據(jù)最大的m值對(duì)已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值進(jìn)行調(diào)整。
具體的,所述第一查找模塊,用于:
獲取所述協(xié)議端口請(qǐng)求對(duì)應(yīng)的通信信息組,所述通信信息組包括所述協(xié)議端口請(qǐng)求對(duì)應(yīng)的公網(wǎng)網(wǎng)間協(xié)議IP地址、目的IP地址、目的IP地址對(duì)應(yīng)的協(xié)議端口;
從預(yù)設(shè)哈希映射表中查找與所述通信信息組對(duì)應(yīng)的位置標(biāo)識(shí),所述位置標(biāo)識(shí)為數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中的位置標(biāo)識(shí);
根據(jù)所述位置標(biāo)識(shí)在所述數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)。
本發(fā)明提供的端口分配的方法及裝置,能夠在內(nèi)網(wǎng)中的計(jì)算機(jī)向外網(wǎng)發(fā)起連接,并請(qǐng)求為對(duì)應(yīng)的連接分配協(xié)議端口時(shí),首先查找是否存在已分配的portmap,若存在已分配的portmap,則將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接;若不存在已分配的portmap,則重新啟用一個(gè)新的portmap,并將新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接。與現(xiàn)有技術(shù)相比,不存在一個(gè)portmap與某一個(gè)公網(wǎng)IP地址對(duì)應(yīng)的情況,并且在分配協(xié)議端口時(shí),先查找已分配的portmap,而不是查找與連接對(duì)應(yīng)的公網(wǎng)IP地址對(duì)應(yīng)的特定的portmap,實(shí)現(xiàn)了portmap的共享,因此在連接較少時(shí),portmap對(duì)應(yīng)的未占用的協(xié)議端口可以被別的公網(wǎng)IP地址對(duì)應(yīng)的連接共享,在連接較多時(shí),一個(gè)portmap對(duì)應(yīng)的協(xié)議端口不夠用時(shí),因?yàn)閜ortmap可以共享,因此可以使用其他的portmap中的空閑的協(xié)議端口或者啟用新的portmap對(duì)應(yīng)的協(xié)議端口,因此可以根據(jù)實(shí)際需要的協(xié)議端口數(shù)來適應(yīng)性地提供協(xié)議端口,避免了現(xiàn)有技術(shù)中協(xié)議端口需求數(shù)量與可提供的協(xié)議端口數(shù)量不平衡的現(xiàn)象。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
附圖說明
通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1示出了本發(fā)明實(shí)施例提供的一種端口分配的方法流程圖;
圖2示出了本發(fā)明實(shí)施例提供的另一種端口分配的方法流程圖;
圖3示出了本發(fā)明實(shí)施例提供的一種端口分配的裝置的組成框圖;
圖4示出了本發(fā)明實(shí)施例提供的另一種端口分配的裝置的組成框圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
為解決現(xiàn)有公網(wǎng)IP地址對(duì)應(yīng)的協(xié)議端口的分配機(jī)制存在實(shí)際需求的協(xié)議端口數(shù)和可供分配的協(xié)議端口數(shù)之間的不平衡的問題,本發(fā)明實(shí)施例提供了一種端口分配的方法,如圖1所示,該方法包括:
首先需要說明的是,本實(shí)施例針對(duì)的是一個(gè)內(nèi)網(wǎng)對(duì)應(yīng)多個(gè)公網(wǎng)IP的情況,即內(nèi)網(wǎng)中的計(jì)算機(jī)可以通過不同公網(wǎng)IP地址訪問外網(wǎng)的情況。其中內(nèi)網(wǎng)指的是局域網(wǎng),外網(wǎng)指的是互聯(lián)網(wǎng)。在內(nèi)網(wǎng)中的計(jì)算機(jī)通過公網(wǎng)IP地址訪問外網(wǎng)時(shí),通常需要通過網(wǎng)絡(luò)設(shè)備對(duì)內(nèi)網(wǎng)計(jì)算機(jī)進(jìn)行網(wǎng)絡(luò)地址轉(zhuǎn)換,其中網(wǎng)絡(luò)設(shè)備是指具有網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)的路由器、交換機(jī)等設(shè)備。一種較常用的網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)為NAPT,本實(shí)施例是針對(duì)NAPT中具體的協(xié)議端口分配的方式作的優(yōu)化。
101、接收協(xié)議端口請(qǐng)求。
當(dāng)內(nèi)網(wǎng)中的計(jì)算機(jī)訪問外網(wǎng)時(shí),需要向外網(wǎng)發(fā)起連接,在連接發(fā)送到外網(wǎng)之前首先會(huì)通過NAPT將該連接對(duì)應(yīng)的內(nèi)網(wǎng)計(jì)算機(jī)的內(nèi)網(wǎng)IP地址轉(zhuǎn)換為公網(wǎng)IP地址(外網(wǎng)中可以使用的IP地址),并為對(duì)應(yīng)的連接分配一個(gè)協(xié)議端口,該協(xié)議端口與轉(zhuǎn)換后的公網(wǎng)IP地址作為上述連接對(duì)應(yīng)的源協(xié)議端口和源IP地址,然后使內(nèi)網(wǎng)計(jì)算機(jī)可以通過源協(xié)議端口和源IP地址去訪問外網(wǎng)中的目的IP地址和對(duì)應(yīng)的目的協(xié)議端口。
對(duì)應(yīng)上述說明,本實(shí)施例中“協(xié)議端口請(qǐng)求”請(qǐng)求的是內(nèi)網(wǎng)計(jì)算機(jī)訪問外網(wǎng)中的目的IP地址和對(duì)應(yīng)的目的協(xié)議端口時(shí)使用的源協(xié)議端口。
102、根據(jù)協(xié)議端口請(qǐng)求查找是否存在已分配的portmap。
其中,portmap是用于表示協(xié)議端口是否占用情況的數(shù)組。portmap是一個(gè)8K內(nèi)存的char pm[8192]數(shù)組,由于每個(gè)字節(jié)由8個(gè)比特組成,8192個(gè)字節(jié)共占用65536個(gè)比特,因此可以用portmap來表示65536個(gè)協(xié)議端口的占用情況,數(shù)組中的元素(比特)與協(xié)議端口一一對(duì)應(yīng)。通常比特置1則表示對(duì)應(yīng)的協(xié)議端口被占用,比特置0則表示對(duì)應(yīng)的協(xié)議端口未占用。
103、若存在已分配的portmap,則將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接。
其中已分配的portmap表示,portmap對(duì)應(yīng)的協(xié)議端口中至少有一個(gè)被分配出去過。根據(jù)步驟102的描述,其中,“將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給所述連接”,可以為“將已分配的portmap中置0比特對(duì)應(yīng)的協(xié)議端口分配給步驟101中的涉及的向外網(wǎng)發(fā)起的連接”。
需要說明的是已分配的portmap的相關(guān)的記錄信息可以記錄在任何可以記錄或者保存信息的數(shù)據(jù)結(jié)構(gòu)中,具體使用什么數(shù)據(jù)結(jié)構(gòu)進(jìn)行記錄和保存可以由程序設(shè)計(jì)人員自由設(shè)定,因此可以通過相關(guān)記錄來查找和確定已分配的portmap。
104、若不存已分配的portmap,則啟用新的portmap進(jìn)行分配。
重新分配一個(gè)新的portmap,將新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接,即將新的portmap對(duì)應(yīng)的比特置0對(duì)應(yīng)的協(xié)議端口分配給步驟101中的涉及的向外網(wǎng)發(fā)起的連接。
本發(fā)明實(shí)施例提供的端口分配的方法,能夠在內(nèi)網(wǎng)中的計(jì)算機(jī)向外網(wǎng)發(fā)起連接,并請(qǐng)求為對(duì)應(yīng)的連接分配協(xié)議端口時(shí),首先查找是否存在已分配的portmap,若存在已分配的portmap,則將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接;若不存在已分配的portmap,則重新啟用一個(gè)新的portmap,并將新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接。與現(xiàn)有技術(shù)相比,不存在一個(gè)portmap與某一個(gè)公網(wǎng)IP地址對(duì)應(yīng)的情況,并且在分配協(xié)議端口時(shí),先查找已分配的portmap,而不是查找與連接對(duì)應(yīng)的公網(wǎng)IP地址對(duì)應(yīng)的特定的portmap,實(shí)現(xiàn)了portmap的共享,因此在連接較少時(shí),portmap對(duì)應(yīng)的未占用的協(xié)議端口可以被別的公網(wǎng)IP地址對(duì)應(yīng)的連接共享,在連接較多時(shí),一個(gè)portmap對(duì)應(yīng)的協(xié)議端口不夠用時(shí),因?yàn)閜ortmap可以共享,因此可以使用其他的portmap中的空閑的協(xié)議端口或者啟用新的portmap對(duì)應(yīng)的協(xié)議端口,因此可以根據(jù)實(shí)際需要的協(xié)議端口數(shù)來適應(yīng)性地提供協(xié)議端口,避免了現(xiàn)有技術(shù)中協(xié)議端口需求數(shù)量與可提供的協(xié)議端口數(shù)量不平衡的現(xiàn)象。
進(jìn)一步的,作為對(duì)圖1所示方法的細(xì)化及擴(kuò)展,本發(fā)明另一實(shí)施例還給出了一種端口分配的方法。如圖2所示,該方法包括:
201、接收協(xié)議端口請(qǐng)求。
本步驟的實(shí)現(xiàn)方式與圖1步驟101的實(shí)現(xiàn)方式相同,此處不再贅述。
202、根據(jù)協(xié)議端口請(qǐng)求查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)。
具體的根據(jù)協(xié)議端口請(qǐng)求查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的過程包括以下步驟:
第一,獲取協(xié)議端口請(qǐng)求對(duì)應(yīng)的通信信息組;
其中通信信息組包括該協(xié)議端口請(qǐng)求對(duì)應(yīng)的公網(wǎng)IP地址、目的IP地址、目的IP地址對(duì)應(yīng)的協(xié)議端口。公網(wǎng)IP地址是由協(xié)議端口請(qǐng)求對(duì)應(yīng)的內(nèi)網(wǎng)計(jì)算機(jī)的內(nèi)網(wǎng)IP地址經(jīng)過網(wǎng)絡(luò)地址轉(zhuǎn)換后得到的,目的IP地址為協(xié)議端口請(qǐng)求對(duì)應(yīng)的連接的目的IP地址。通常公網(wǎng)IP地址記作sip、目的IP地址記作dip、目的IP地址對(duì)應(yīng)的協(xié)議端口記作dport。
第二,從預(yù)設(shè)哈希映射表中查找與通信信息組對(duì)應(yīng)的位置標(biāo)識(shí)。
其中預(yù)設(shè)哈希映射表是關(guān)于通信信息組與位置標(biāo)識(shí)之間的映射關(guān)系,其中位置標(biāo)識(shí)為數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中的位置標(biāo)識(shí),其中數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)用于分配協(xié)議端口,數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)分配協(xié)議端口的實(shí)現(xiàn)是通過數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的p指針指向portmap來實(shí)現(xiàn)的。
另外關(guān)于預(yù)設(shè)哈希映射表的設(shè)計(jì)進(jìn)行說明:預(yù)設(shè)哈希映射表是通過哈希映射得到的,具體在實(shí)現(xiàn)哈希映射時(shí),是使用網(wǎng)絡(luò)數(shù)據(jù)的標(biāo)準(zhǔn)散列函數(shù)進(jìn)行映射的,具體的標(biāo)準(zhǔn)散列函數(shù)的構(gòu)造方法可以是除留余數(shù)法、平方取中法、折疊法等。實(shí)際的應(yīng)用中標(biāo)準(zhǔn)散列函數(shù)的選擇可以根據(jù)實(shí)際需求自由選定。其中對(duì)應(yīng)的哈希映射可以表示為f(sip,dip,dport)=Id,其中f表示標(biāo)準(zhǔn)散列函數(shù),(sip,dip,dport)為預(yù)設(shè)哈希映射表對(duì)應(yīng)的鍵值,Id為位置標(biāo)識(shí)。
需要說明的是,數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)為:設(shè)計(jì)port_st數(shù)據(jù)結(jié)構(gòu),則數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)可以表示為port_st節(jié)點(diǎn),在port_st上對(duì)應(yīng)設(shè)置p指針、m、n三個(gè)字段,其中p指針指向portmap,m表示當(dāng)前port_st節(jié)點(diǎn)的p指針指向的portmap中通過該port_st節(jié)點(diǎn)分配出的比特對(duì)應(yīng)的協(xié)議端口的數(shù)量,n表示由包含當(dāng)前port_st節(jié)點(diǎn)在內(nèi)的n個(gè)port_st節(jié)點(diǎn)共享當(dāng)前port_st節(jié)點(diǎn)指向的portmap,在初始化時(shí),n是預(yù)先設(shè)定的,并且在初始化時(shí)每個(gè)port_st節(jié)點(diǎn)設(shè)置的n值是相等的。其中當(dāng)前port_st節(jié)點(diǎn)表示根據(jù)當(dāng)前的協(xié)議端口請(qǐng)求對(duì)應(yīng)的通信信息組對(duì)應(yīng)的port_st節(jié)點(diǎn)。
第三,根據(jù)位置標(biāo)識(shí)在數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)。
203、根據(jù)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)查找符合預(yù)設(shè)條件的已分配的portmap。
在查找符合預(yù)設(shè)條件的的已分配的portmap之前,首先判斷數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)是否存在對(duì)應(yīng)的portmap,根據(jù)是否存在對(duì)應(yīng)的portmap的情況,將根據(jù)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)查找符合預(yù)設(shè)條件的已分配的portmap分為兩種情況:
第一種情況,若數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)存在對(duì)應(yīng)的portmap,則查找已分配的portmap中與數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap。給出對(duì)應(yīng)第一種情況的示例進(jìn)行說明:因?yàn)椴煌倪B接或者不同時(shí)刻的相同連接可能對(duì)應(yīng)相同的通信信息組,而相同的通信信息組對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)是相同的,而一個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)只能對(duì)應(yīng)一個(gè)portmap,因此當(dāng)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在第一次確定對(duì)應(yīng)的portmap之后,之后的所有相同通信信息組對(duì)應(yīng)的portmap也是唯一固定的。因此當(dāng)連接對(duì)應(yīng)的通信信息組對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)已經(jīng)有對(duì)應(yīng)的portmap時(shí),該對(duì)應(yīng)的portmap即符合預(yù)設(shè)條件的已分配的portmap。
第二種情況,若不存在對(duì)應(yīng)的portmap,則查找已分配的portmap中符合預(yù)設(shè)規(guī)則的portmap,預(yù)設(shè)規(guī)則為portmap已經(jīng)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)少于portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)。給出對(duì)應(yīng)第二種情況的示例進(jìn)行說明:在初始階段,一個(gè)連接對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)還未指向任何portmap,即沒有對(duì)應(yīng)的portmap,這時(shí)需要在已分配的portmap中查找符合預(yù)設(shè)規(guī)則的portmap。其中關(guān)于預(yù)設(shè)規(guī)則進(jìn)行具體說明:若一個(gè)portmap設(shè)定能夠由50個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng),即可以有50個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)共享portmap對(duì)應(yīng)的協(xié)議端口,而該portmap已經(jīng)被少于50的數(shù)據(jù)節(jié)點(diǎn)對(duì)應(yīng),則該portmap即為符合預(yù)設(shè)規(guī)則的portmap。
另外,在實(shí)際的應(yīng)用中,為了達(dá)到更優(yōu)的協(xié)議端口分配效果,還可以將預(yù)設(shè)規(guī)則設(shè)置為:數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值與portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)相等,且portmap已經(jīng)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)少于portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)。
進(jìn)一步的,在實(shí)際的應(yīng)用中,還需要設(shè)計(jì)portmap節(jié)點(diǎn)與port_st節(jié)點(diǎn)進(jìn)行配合使用,portmap節(jié)點(diǎn)與portmap一一對(duì)應(yīng),port_st節(jié)點(diǎn)與portmap節(jié)點(diǎn)是多對(duì)一的對(duì)應(yīng)關(guān)系:具體的portmap節(jié)點(diǎn)包含portmap,并且設(shè)置pp指針、Pm、Pn三個(gè)字段,其中pp指針指向可以指向portmap節(jié)點(diǎn)中包含的portmap的port_st節(jié)點(diǎn),Pm表示portmap節(jié)點(diǎn)中包含的portmap已經(jīng)被Pm個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng),Pn表示portmap節(jié)點(diǎn)中包含的portmap最多能夠被Pn個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng)。
進(jìn)一步的,針對(duì)上述描述,當(dāng)找到符合預(yù)設(shè)規(guī)則的已分配的portmap之后,將數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的指針p指向?qū)?yīng)的符合預(yù)設(shè)規(guī)則的已分配的portmap,并將符合預(yù)設(shè)規(guī)則的已分配的portmap節(jié)點(diǎn)的Pm值加1。
204、若存在符合預(yù)設(shè)條件的已分配的portmap,則將符合預(yù)設(shè)條件的已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接。
其中,在將符合預(yù)設(shè)條件的已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接之前,還包括:判斷符合預(yù)設(shè)條件的已分配的portmap中是否存在未占用的協(xié)議端口,即判斷符合預(yù)設(shè)條件的已分配的portmap對(duì)應(yīng)的portmap中是否存在置0比特。然后根據(jù)判斷的結(jié)果分配協(xié)議端口,具體的:若存在未占用的協(xié)議端口,即存在置0比特,則將符合預(yù)設(shè)條件的已分配的portmap中置0比特對(duì)應(yīng)的協(xié)議端口分配給連接;若不存在未占用的協(xié)議端口,即不存在置0比特,則分配失敗。
205、若不存在符合預(yù)設(shè)條件的已分配的portmap,則啟用新的portmap進(jìn)行分配。
啟用新的portmap對(duì)應(yīng)的協(xié)議端口進(jìn)行分配,并且將新的portmap中置0比特對(duì)應(yīng)的協(xié)議端口分配給連接。
另外,對(duì)于新的portmap,需要將其對(duì)應(yīng)的Pn值設(shè)置為與連接對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值相等,并將其Pm值加1,還需要將新的portmap對(duì)應(yīng)的portmap節(jié)點(diǎn)的pp指針指向連接對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)。
進(jìn)一步的,在上述圖1以及圖2涉及的協(xié)議端口分配的過程中,若任一portmap出現(xiàn)其中所有的比特置1的情況,即portmap對(duì)應(yīng)的協(xié)議端口全部被占用的情況,則觸發(fā)自適應(yīng)更新機(jī)制。觸發(fā)自適應(yīng)更新機(jī)制不是啟動(dòng)自適應(yīng)更新機(jī)制,啟動(dòng)自適應(yīng)更新機(jī)制需要到達(dá)預(yù)設(shè)更新時(shí)間時(shí)啟動(dòng),通常預(yù)設(shè)更新時(shí)間設(shè)為業(yè)務(wù)不繁忙的時(shí)間,如午夜等。
進(jìn)一步的,觸發(fā)自適應(yīng)更新機(jī)制后,需要統(tǒng)計(jì)包含觸發(fā)自適應(yīng)更新機(jī)制時(shí)刻在內(nèi)的預(yù)設(shè)時(shí)段內(nèi)所有已分配的portmap對(duì)應(yīng)的所有port_st節(jié)點(diǎn)對(duì)應(yīng)的m值,每個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng)一個(gè)m值。若在到達(dá)預(yù)設(shè)更新時(shí)間前,多次觸發(fā)自適應(yīng)更新機(jī)制,則分別統(tǒng)計(jì)每次觸發(fā)自適應(yīng)更新機(jī)制時(shí),所有已分配的portmap對(duì)應(yīng)的port_st節(jié)點(diǎn)對(duì)應(yīng)的m值,每個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng)多個(gè)m值,這時(shí)對(duì)于每個(gè)port_st節(jié)點(diǎn)需要選出多個(gè)m值中最大的m值。
然后根據(jù)預(yù)設(shè)時(shí)段內(nèi)統(tǒng)計(jì)的m值或者最大的m值對(duì)對(duì)應(yīng)的port_st節(jié)點(diǎn)的n值進(jìn)行調(diào)整。下面以在到達(dá)預(yù)設(shè)更新時(shí)間前只觸發(fā)一次自適應(yīng)更新機(jī)制的情況為例對(duì)調(diào)整n值的過程進(jìn)行說明:其中以某一個(gè)portmap為例進(jìn)行說明。首先,將在預(yù)設(shè)時(shí)段內(nèi)統(tǒng)計(jì)的portmap對(duì)應(yīng)的所有port_st的m值相加;若相加的總和超過一個(gè)portmap對(duì)應(yīng)的總的協(xié)議端口數(shù)(65536),則將按照從大到小的順序選出前u個(gè)m值,其中選出的前u個(gè)m值需滿足相加后的總和剛好超過65536的一半;將選出的前u個(gè)m值對(duì)應(yīng)的port_st節(jié)點(diǎn)對(duì)應(yīng)的n值進(jìn)行調(diào)整,具體的調(diào)整公式為“n=portmap對(duì)應(yīng)的總的協(xié)議端口數(shù)/m”,在本實(shí)施例中調(diào)整公式為“n=65536/m”。需要說明的是,除前u個(gè)m值對(duì)應(yīng)的port_st節(jié)點(diǎn)之外,其它m值對(duì)應(yīng)的port_st對(duì)應(yīng)的n值保持不變。另外對(duì)于前u個(gè)m值需要滿足的條件也可以設(shè)置為:前u個(gè)m值相加后的總和剛好超過總的協(xié)議端口數(shù)(65536)的1/3或者2/3等。在實(shí)際應(yīng)用中,前u個(gè)m值需要滿足的條件可以根據(jù)具體的應(yīng)用需求進(jìn)行設(shè)定。
需要說明的是,對(duì)于在到達(dá)預(yù)設(shè)更新時(shí)間前多次觸發(fā)自適應(yīng)更新機(jī)制的情況,上述調(diào)整n值的過程中,只需將預(yù)設(shè)時(shí)段內(nèi)統(tǒng)計(jì)的m值替換為預(yù)設(shè)時(shí)段內(nèi)統(tǒng)計(jì)的最大的m值。
進(jìn)一步的,當(dāng)對(duì)已分配的portmap對(duì)應(yīng)的port_st節(jié)點(diǎn)的n值進(jìn)行調(diào)整后,將所有已分配的portmap釋放,并重新啟動(dòng)NAPT。
進(jìn)一步的,由于根據(jù)請(qǐng)求協(xié)議端口的需求來適應(yīng)性地提供不同數(shù)量的portmap,每個(gè)portmap都會(huì)占用8k的內(nèi)存,因此相對(duì)于現(xiàn)有技術(shù)中始終提供與公網(wǎng)IP地址數(shù)量相等的固定數(shù)量的portmap的方式節(jié)省了資源的占用。
進(jìn)一步的,在發(fā)生portmap對(duì)應(yīng)的協(xié)議端口被全部占用的情況時(shí),進(jìn)行記錄,并在到達(dá)預(yù)設(shè)更新時(shí)間時(shí),對(duì)portmap能夠共享的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的數(shù)量進(jìn)行自適應(yīng)調(diào)整,進(jìn)一步的提高了協(xié)議端口分配的平衡性。
進(jìn)一步的,作為對(duì)上述各實(shí)施例的實(shí)現(xiàn),本發(fā)明實(shí)施例的另一實(shí)施例還提供了一種端口分配的裝置,用于實(shí)現(xiàn)上述圖1和圖2所述的方法。如圖3所示,該裝置包括:接收單元31、查找單元32、第一分配單元33以及第二分配單元34。
首先需要說明的是,本實(shí)施例針對(duì)的是一個(gè)內(nèi)網(wǎng)對(duì)應(yīng)多個(gè)公網(wǎng)IP的情況,即內(nèi)網(wǎng)中的計(jì)算機(jī)可以通過不同公網(wǎng)IP地址訪問外網(wǎng)的情況。其中內(nèi)網(wǎng)指的是局域網(wǎng),外網(wǎng)指的是互聯(lián)網(wǎng)。在內(nèi)網(wǎng)中的計(jì)算機(jī)通過公網(wǎng)IP地址訪問外網(wǎng)時(shí),通常需要通過網(wǎng)絡(luò)設(shè)備對(duì)內(nèi)網(wǎng)計(jì)算機(jī)進(jìn)行網(wǎng)絡(luò)地址轉(zhuǎn)換,其中網(wǎng)絡(luò)設(shè)備是指具有網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)的路由器、交換機(jī)等設(shè)備。一種較常用的網(wǎng)絡(luò)地址轉(zhuǎn)換技術(shù)為NAPT,本實(shí)施例是針對(duì)NAPT中具體的協(xié)議端口分配的方式作的優(yōu)化。
接收單元31,用于接收協(xié)議端口請(qǐng)求,協(xié)議端口請(qǐng)求表示,當(dāng)內(nèi)網(wǎng)中的計(jì)算機(jī)向外網(wǎng)發(fā)起連接時(shí),為連接請(qǐng)求分配協(xié)議端口。
當(dāng)內(nèi)網(wǎng)中的計(jì)算機(jī)訪問外網(wǎng)時(shí),需要向外網(wǎng)發(fā)起連接,在連接發(fā)送到外網(wǎng)之前首先會(huì)通過NAPT將該連接對(duì)應(yīng)的內(nèi)網(wǎng)計(jì)算機(jī)的內(nèi)網(wǎng)IP地址轉(zhuǎn)換為公網(wǎng)IP地址(外網(wǎng)中可以使用的IP地址),并為對(duì)應(yīng)的連接分配一個(gè)協(xié)議端口,該協(xié)議端口與轉(zhuǎn)換后的公網(wǎng)IP地址作為上述連接對(duì)應(yīng)的源協(xié)議端口和源IP地址,然后使內(nèi)網(wǎng)計(jì)算機(jī)可以通過源協(xié)議端口和源IP地址去訪問外網(wǎng)中的目的IP地址和對(duì)應(yīng)的目的協(xié)議端口。
對(duì)應(yīng)上述說明,本實(shí)施例中“協(xié)議端口請(qǐng)求”請(qǐng)求的是內(nèi)網(wǎng)計(jì)算機(jī)訪問外網(wǎng)中的目的IP地址和對(duì)應(yīng)的目的協(xié)議端口時(shí)使用的源協(xié)議端口。
查找單元32,用于根據(jù)協(xié)議端口請(qǐng)求查找是否存在已分配的portmap,portmap為用于表示協(xié)議端口的占用情況的數(shù)組,數(shù)組中的元素與協(xié)議端口一一對(duì)應(yīng)。
其中,portmap是用于表示協(xié)議端口是否占用情況的數(shù)組。portmap是一個(gè)8K內(nèi)存的char pm[8192]數(shù)組,由于每個(gè)字節(jié)由8個(gè)比特組成,8192個(gè)字節(jié)共占用65536個(gè)比特,因此可以用portmap來表示65536個(gè)協(xié)議端口的占用情況,數(shù)組中的元素(比特)與協(xié)議端口一一對(duì)應(yīng)。通常比特置1則表示對(duì)應(yīng)的協(xié)議端口被占用,比特置0則表示對(duì)應(yīng)的協(xié)議端口未占用。
第一分配單元33,用于若存在已分配的portmap,則將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接。
需要說明的是已分配的portmap的相關(guān)的記錄信息可以記錄在任何可以記錄或者保存信息的數(shù)據(jù)結(jié)構(gòu)中,具體使用什么數(shù)據(jù)結(jié)構(gòu)進(jìn)行記錄和保存可以由程序設(shè)計(jì)人員自由設(shè)定,因此可以通過相關(guān)記錄來查找和確定已分配的portmap。
第二分配單元34,用于若不存在已分配的portmap,則啟用新的portmap進(jìn)行分配;并且,
將新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接。
重新分配一個(gè)新的portmap,將新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接,即將新的portmap對(duì)應(yīng)的比特置0對(duì)應(yīng)的協(xié)議端口分配給接收單元31涉及的向外網(wǎng)發(fā)起的連接。
進(jìn)一步的,如圖4所示,查找單元32包括:
第一查找模塊321,用于根據(jù)協(xié)議端口請(qǐng)求查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn),數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)用于分配portmap對(duì)應(yīng)的協(xié)議端口,數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)與portmap是多對(duì)一的對(duì)應(yīng)關(guān)系。
需要說明的是,數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)為:設(shè)計(jì)port_st數(shù)據(jù)結(jié)構(gòu),則數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)可以表示為port_st節(jié)點(diǎn),在port_st上對(duì)應(yīng)設(shè)置p指針、m、n三個(gè)字段,其中p指針指向portmap,m表示當(dāng)前port_st節(jié)點(diǎn)的p指針指向的portmap中通過該port_st節(jié)點(diǎn)分配出的比特對(duì)應(yīng)的協(xié)議端口的數(shù)量,n表示由包含當(dāng)前port_st節(jié)點(diǎn)在內(nèi)的n個(gè)port_st節(jié)點(diǎn)共享當(dāng)前port_st節(jié)點(diǎn)指向的portmap,在初始化時(shí),n是預(yù)先設(shè)定的,并且在初始化時(shí)每個(gè)port_st節(jié)點(diǎn)設(shè)置的n值是相等的。其中當(dāng)前port_st節(jié)點(diǎn)表示根據(jù)當(dāng)前的協(xié)議端口請(qǐng)求對(duì)應(yīng)的通信信息組對(duì)應(yīng)的port_st節(jié)點(diǎn)。
第二查找模塊322,用于根據(jù)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)查找符合預(yù)設(shè)條件的已分配的portmap。
進(jìn)一步的,第二查找模塊322用于:
判斷數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)是否存在對(duì)應(yīng)的portmap;
若存在對(duì)應(yīng)的portmap,則查找已分配的portmap中與數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap;
若不存在對(duì)應(yīng)的portmap,則查找已分配的portmap中符合預(yù)設(shè)規(guī)則的portmap,預(yù)設(shè)規(guī)則為portmap已經(jīng)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)少于portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)。
在查找符合預(yù)設(shè)條件的的已分配的portmap之前,首先判斷數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)是否存在對(duì)應(yīng)的portmap,根據(jù)是否存在對(duì)應(yīng)的portmap的情況,將根據(jù)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)查找符合預(yù)設(shè)條件的已分配的portmap分為兩種情況:
第一種情況,若數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)存在對(duì)應(yīng)的portmap,則查找已分配的portmap中與數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap。第二種情況,若不存在對(duì)應(yīng)的portmap,則查找已分配的portmap中符合預(yù)設(shè)規(guī)則的portmap,預(yù)設(shè)規(guī)則為portmap已經(jīng)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)少于portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)。
另外,在實(shí)際的應(yīng)用中,為了達(dá)到更優(yōu)的協(xié)議端口分配效果,還可以將預(yù)設(shè)規(guī)則設(shè)置為:數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值與portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)相等,且portmap已經(jīng)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)少于portmap能夠?qū)?yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)。
進(jìn)一步的,在實(shí)際的應(yīng)用中,還需要設(shè)計(jì)portmap節(jié)點(diǎn)與port_st節(jié)點(diǎn)進(jìn)行配合使用,portmap節(jié)點(diǎn)與portmap一一對(duì)應(yīng),port_st節(jié)點(diǎn)與portmap節(jié)點(diǎn)是多對(duì)一的對(duì)應(yīng)關(guān)系:具體的portmap節(jié)點(diǎn)包含portmap,并且設(shè)置pp指針、Pm、Pn三個(gè)字段,其中pp指針指向可以指向portmap節(jié)點(diǎn)中包含的portmap的port_st節(jié)點(diǎn),Pm表示portmap節(jié)點(diǎn)中包含的portmap已經(jīng)被Pm個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng),Pn表示portmap節(jié)點(diǎn)中包含的portmap最多能夠被Pn個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng)。
進(jìn)一步的,針對(duì)上述描述,當(dāng)找到符合預(yù)設(shè)規(guī)則的已分配的portmap之后,將數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的指針p指向?qū)?yīng)的符合預(yù)設(shè)規(guī)則的已分配的portmap,并將符合預(yù)設(shè)規(guī)則的已分配的portmap節(jié)點(diǎn)的Pm值加1。
進(jìn)一步的,如圖4所示,裝置進(jìn)一步包括:
觸發(fā)單元35,用于當(dāng)任一portmap對(duì)應(yīng)的協(xié)議端口出現(xiàn)被全部占用的情況時(shí),觸發(fā)自適應(yīng)更新機(jī)制,自適應(yīng)更新機(jī)制用于更新所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值,n值表示包括與n值對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在內(nèi)的n個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)能夠?qū)?yīng)一個(gè)portmap。
若任一portmap出現(xiàn)其中所有的比特置1的情況,即portmap對(duì)應(yīng)的協(xié)議端口全部被占用的情況,則觸發(fā)自適應(yīng)更新機(jī)制。觸發(fā)自適應(yīng)更新機(jī)制不是啟動(dòng)自適應(yīng)更新機(jī)制,啟動(dòng)自適應(yīng)更新機(jī)制需要到達(dá)預(yù)設(shè)更新時(shí)間時(shí)啟動(dòng),通常預(yù)設(shè)更新時(shí)間設(shè)為業(yè)務(wù)不繁忙的時(shí)間,如午夜等。
統(tǒng)計(jì)單元36,用于統(tǒng)計(jì)包含觸發(fā)自適應(yīng)更新機(jī)制時(shí)刻在內(nèi)的預(yù)設(shè)時(shí)段內(nèi)所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的m值,m值為預(yù)設(shè)時(shí)段內(nèi)通過數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)分配出去的與數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的portmap對(duì)應(yīng)的協(xié)議端口的數(shù)量。
觸發(fā)自適應(yīng)更新機(jī)制后,需要統(tǒng)計(jì)包含觸發(fā)自適應(yīng)更新機(jī)制時(shí)刻在內(nèi)的預(yù)設(shè)時(shí)段內(nèi)所有已分配的portmap對(duì)應(yīng)的所有port_st節(jié)點(diǎn)對(duì)應(yīng)的m值,每個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng)一個(gè)m值。
進(jìn)一步的,如圖4所示,裝置進(jìn)一步包括:
啟動(dòng)單元37,用于當(dāng)?shù)竭_(dá)預(yù)設(shè)更新時(shí)間時(shí),啟動(dòng)自適應(yīng)更新機(jī)制,根據(jù)m值對(duì)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值進(jìn)行調(diào)整。
以在到達(dá)預(yù)設(shè)更新時(shí)間前只觸發(fā)一次自適應(yīng)更新機(jī)制的情況為例對(duì)調(diào)整n值的過程進(jìn)行說明:其中以某一個(gè)portmap為例進(jìn)行說明。首先,將在預(yù)設(shè)時(shí)段內(nèi)統(tǒng)計(jì)的portmap對(duì)應(yīng)的所有port_st的m值相加;若相加的總和超過一個(gè)portmap對(duì)應(yīng)的總的協(xié)議端口數(shù)(65536),則將按照從大到小的順序選出前u個(gè)m值,其中選出的前u個(gè)m值需滿足相加后的總和剛好超過65536的一半;將選出的前u個(gè)m值對(duì)應(yīng)的port_st節(jié)點(diǎn)對(duì)應(yīng)的n值進(jìn)行調(diào)整,具體的調(diào)整公式為“n=portmap對(duì)應(yīng)的總的協(xié)議端口數(shù)/m”,在本實(shí)施例中調(diào)整公式為“n=65536/m”。需要說明的是,除前u個(gè)m值對(duì)應(yīng)的port_st節(jié)點(diǎn)之外,其它m值對(duì)應(yīng)的port_st對(duì)應(yīng)的n值保持不變。另外對(duì)于前u個(gè)m值需要滿足的條件也可以設(shè)置為:前u個(gè)m值相加后的總和剛好超過總的協(xié)議端口數(shù)(65536)的1/3或者2/3等。在實(shí)際應(yīng)用中,前u個(gè)m值需要滿足的條件可以根據(jù)具體的應(yīng)用需求進(jìn)行設(shè)定。
進(jìn)一步的,如圖4所示,裝置進(jìn)一步包括:
統(tǒng)計(jì)單元36,還用于在到達(dá)預(yù)設(shè)更新時(shí)間前,若多次觸發(fā)自適應(yīng)更新機(jī)制,則分別統(tǒng)計(jì)每次觸發(fā)自適應(yīng)更新機(jī)制時(shí),所有已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的m值;
選擇單元38,用于選出到達(dá)預(yù)設(shè)更新時(shí)間前,已分配的portmap對(duì)應(yīng)的每個(gè)數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的多個(gè)m值中最大的m值;
若在到達(dá)預(yù)設(shè)更新時(shí)間前,多次觸發(fā)自適應(yīng)更新機(jī)制,則分別統(tǒng)計(jì)每次觸發(fā)自適應(yīng)更新機(jī)制時(shí),所有已分配的portmap對(duì)應(yīng)的port_st節(jié)點(diǎn)對(duì)應(yīng)的m值,每個(gè)port_st節(jié)點(diǎn)對(duì)應(yīng)多個(gè)m值,這時(shí)對(duì)于每個(gè)port_st節(jié)點(diǎn)需要選出多個(gè)m值中最大的m值。
調(diào)整單元39,用于根據(jù)最大的m值對(duì)已分配的portmap對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)的n值進(jìn)行調(diào)整。
進(jìn)一步的,第一查找模塊321,用于:
獲取協(xié)議端口請(qǐng)求對(duì)應(yīng)的通信信息組,通信信息組包括協(xié)議端口請(qǐng)求對(duì)應(yīng)的公網(wǎng)IP地址、目的IP地址、目的IP地址對(duì)應(yīng)的協(xié)議端口;
其中通信信息組包括該協(xié)議端口請(qǐng)求對(duì)應(yīng)的公網(wǎng)IP地址、目的IP地址、目的IP地址對(duì)應(yīng)的協(xié)議端口。公網(wǎng)IP地址是由協(xié)議端口請(qǐng)求對(duì)應(yīng)的內(nèi)網(wǎng)計(jì)算機(jī)的內(nèi)網(wǎng)IP地址經(jīng)過網(wǎng)絡(luò)地址轉(zhuǎn)換后得到的,目的IP地址為協(xié)議端口請(qǐng)求對(duì)應(yīng)的連接的目的IP地址。通常公網(wǎng)IP地址記作sip、目的IP地址記作dip、目的IP地址對(duì)應(yīng)的協(xié)議端口記作dport。
從預(yù)設(shè)哈希映射表中查找與通信信息組對(duì)應(yīng)的位置標(biāo)識(shí),位置標(biāo)識(shí)為數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中的位置標(biāo)識(shí);
其中預(yù)設(shè)哈希映射表是關(guān)于通信信息組與位置標(biāo)識(shí)之間的映射關(guān)系,其中位置標(biāo)識(shí)為數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)在數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中的位置標(biāo)識(shí),其中數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)用于分配協(xié)議端口,數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)分配協(xié)議端口的實(shí)現(xiàn)是通過數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)對(duì)應(yīng)的p指針指向portmap來實(shí)現(xiàn)的。
根據(jù)位置標(biāo)識(shí)在數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)數(shù)組中查找對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)節(jié)點(diǎn)。
本發(fā)明實(shí)施例提供的端口分配的裝置,能夠在內(nèi)網(wǎng)中的計(jì)算機(jī)向外網(wǎng)發(fā)起連接,并請(qǐng)求為對(duì)應(yīng)的連接分配協(xié)議端口時(shí),首先查找是否存在已分配的portmap,若存在已分配的portmap,則將已分配的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接;若不存在已分配的portmap,則重新啟用一個(gè)新的portmap,并將新的portmap對(duì)應(yīng)的未占用的協(xié)議端口分配給連接。與現(xiàn)有技術(shù)相比,不存在一個(gè)portmap與某一個(gè)公網(wǎng)IP地址對(duì)應(yīng)的情況,并且在分配協(xié)議端口時(shí),先查找已分配的portmap,而不是查找與連接對(duì)應(yīng)的公網(wǎng)IP地址對(duì)應(yīng)的特定的portmap,實(shí)現(xiàn)了portmap的共享,因此在連接較少時(shí),portmap對(duì)應(yīng)的未占用的協(xié)議端口可以被別的公網(wǎng)IP地址對(duì)應(yīng)的連接共享,在連接較多時(shí),一個(gè)portmap對(duì)應(yīng)的協(xié)議端口不夠用時(shí),因?yàn)閜ortmap可以共享,因此可以使用其他的portmap中的空閑的協(xié)議端口或者啟用新的portmap對(duì)應(yīng)的協(xié)議端口,因此可以根據(jù)實(shí)際需要的協(xié)議端口數(shù)來適應(yīng)性地提供協(xié)議端口,避免了現(xiàn)有技術(shù)中協(xié)議端口需求數(shù)量與可提供的協(xié)議端口數(shù)量不平衡的現(xiàn)象。
在上述實(shí)施例中,對(duì)各個(gè)實(shí)施例的描述都各有側(cè)重,某個(gè)實(shí)施例中沒有詳述的部分,可以參見其他實(shí)施例的相關(guān)描述。
可以理解的是,上述方法及裝置中的相關(guān)特征可以相互參考。另外,上述實(shí)施例中的“第一”、“第二”等是用于區(qū)分各實(shí)施例,而并不代表各實(shí)施例的優(yōu)劣。
所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,上述描述的系統(tǒng),裝置和單元的具體工作過程,可以參考前述方法實(shí)施例中的對(duì)應(yīng)過程,在此不再贅述。
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的發(fā)明名稱(如端口分配的裝置)中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。