劉 業(yè),劉林峰
(1.中國科學(xué)技術(shù)大學(xué) 蘇州研究院,江蘇 蘇州215123;2.中國科學(xué)技術(shù)大學(xué) 軟件學(xué)院,江蘇 蘇州215123;3.南京郵電大學(xué) 計(jì)算機(jī)學(xué)院,江蘇 南京210003;4.陽立電子(蘇州)有限公司,江蘇 蘇州215000)
近年來,CAN、Chord、Tapestry、Pastry、BAKE[1-6]等為代表的結(jié)構(gòu)化拓?fù)銹2P網(wǎng)絡(luò)技術(shù)層出不窮,結(jié)構(gòu)化P2P網(wǎng)絡(luò)在資源管理過程中同時(shí)擁有自組織特性、規(guī)模的強(qiáng)可縮放特性以及部署的廉價(jià)性等等,突破了網(wǎng)絡(luò)規(guī)模限制的結(jié)構(gòu)化P2P網(wǎng)絡(luò)技術(shù)給廣域網(wǎng)范圍內(nèi)規(guī)模龐大的資源整合及共享提供了可能性。
目前國內(nèi)P2P網(wǎng)絡(luò)研究領(lǐng)域很多都是在某一種開源項(xiàng)目的基礎(chǔ)上來開展后續(xù)研究,目前尚未有一個(gè)通用的P2P網(wǎng)絡(luò)支撐平臺(tái)見諸報(bào)道。我們通用的結(jié)構(gòu)化P2P網(wǎng)絡(luò)支撐平臺(tái)原型系統(tǒng)設(shè)計(jì)的目的是建立一個(gè)可以應(yīng)用于廣域網(wǎng)范圍內(nèi),集資源整合與利用為一體,面向服務(wù)的P2P網(wǎng)絡(luò)支撐平臺(tái),能夠提供文件共享、應(yīng)用層多播、CPU資源整合、網(wǎng)絡(luò)存儲(chǔ)、極速傳輸?shù)然痉?wù),從而實(shí)現(xiàn)對(duì)當(dāng)前網(wǎng)絡(luò)中的存儲(chǔ)資源、計(jì)算資源、存儲(chǔ)轉(zhuǎn)發(fā)資源(即,帶寬資源)以及信息資源的整合。另外,通用平臺(tái)是基于分層模型的,亦能方便我們進(jìn)行底層不同結(jié)構(gòu)化P2P網(wǎng)絡(luò)拓?fù)浼奥酚伤惴ǖ奶鎿Q,利于進(jìn)行不同結(jié)構(gòu)化P2P網(wǎng)絡(luò)路由算法的比對(duì)研究。
正文部分首先給出了一種通用的結(jié)構(gòu)化P2P網(wǎng)絡(luò)支撐平臺(tái)實(shí)現(xiàn)框架的模塊劃分圖,接下來介紹了我們所開發(fā)的通用平臺(tái)的具體設(shè)計(jì)及實(shí)現(xiàn),闡述了課提供給第三方進(jìn)行新型應(yīng)用開發(fā)的開放接口函數(shù),最后給出了通用平臺(tái)的相關(guān)測(cè)試結(jié)果。
參照文獻(xiàn)[7]給出的面向服務(wù)的P2P網(wǎng)絡(luò)體系結(jié)構(gòu)(ISPNA)框架模型,圖1給出了一種典型的結(jié)構(gòu)化P2P網(wǎng)絡(luò)支撐平臺(tái)參考模型。得益于結(jié)構(gòu)化P2P網(wǎng)絡(luò)技術(shù)所擁有的強(qiáng)大的可縮放特性,我們能夠在該結(jié)構(gòu)化P2P網(wǎng)絡(luò)支撐平臺(tái)參考模型的指導(dǎo)下,實(shí)現(xiàn)一個(gè)在廣域網(wǎng)范圍內(nèi)進(jìn)行海量規(guī)模的資源整合及共享的系統(tǒng)。

圖1 結(jié)構(gòu)化P2P網(wǎng)絡(luò)支撐平臺(tái)參考模型
圖2給出了一個(gè)原型系統(tǒng)的總體實(shí)現(xiàn)框架,我們接下來對(duì)各主要功能模塊的實(shí)現(xiàn)做逐一說明。對(duì)于P2P網(wǎng)絡(luò)中的某一節(jié)點(diǎn)Node i來說,在功能上該節(jié)點(diǎn)既是Client端,亦是Server端。
(1)P2P路由模塊:利用現(xiàn)有的(TCP、UDP、HTTP)通信協(xié)議建立P2P路由通道,完成冪次逼近的路由過程,向上層模塊提供可調(diào)用的P2PAPI接口函數(shù);
(2)路由表維護(hù)模塊:維護(hù)P2P節(jié)點(diǎn)間的邏輯鄰居關(guān)系,即節(jié)點(diǎn)路由表的更新操作,適應(yīng)P2P網(wǎng)絡(luò)節(jié)點(diǎn)在自組織管理模式下的動(dòng)態(tài)(加入、退出)行為;

圖2 總體實(shí)現(xiàn)框架模塊劃分
(3)共享資源管理模塊:資源在該層以resource_object的形式抽象,該模塊負(fù)責(zé)P2P節(jié)點(diǎn)之上所維護(hù)的資源穩(wěn)定性的管理操作,包括節(jié)點(diǎn)動(dòng)態(tài)加入、退出時(shí),該節(jié)點(diǎn)所維護(hù)的resource_object的重新分配過程,等;
(4)Server端圖形界面模塊:Chord Ring Visualizer,用于查看P2P網(wǎng)絡(luò)環(huán)中每個(gè)節(jié)點(diǎn)狀態(tài)的工具,它能夠檢測(cè)當(dāng)前環(huán)中的節(jié)點(diǎn)數(shù)、每個(gè)節(jié)點(diǎn)的前驅(qū),后繼列表,finger節(jié)點(diǎn)等等。可觀察到節(jié)點(diǎn)的加入退出,鄰居節(jié)點(diǎn)調(diào)整的過程。
(1)可用性增強(qiáng)擴(kuò)展模塊:結(jié)構(gòu)化P2P網(wǎng)絡(luò)路由效率的提高是增強(qiáng)P2P網(wǎng)絡(luò)可用性,推動(dòng)其進(jìn)一步發(fā)展的關(guān)鍵所在。
(2)安全性增強(qiáng)模塊:端節(jié)點(diǎn)的自私行為勢(shì)必導(dǎo)致P2P網(wǎng)絡(luò)資源的可用性存在極大的變數(shù),在自組織管理模式下的P2P網(wǎng)絡(luò)中,正因?yàn)橹T如此類的節(jié)點(diǎn)自私行為是大量存在的,因此需要研究相應(yīng)的機(jī)制來約束節(jié)點(diǎn)的自私行為,從而增強(qiáng)整個(gè)P2P網(wǎng)絡(luò)的可用性及穩(wěn)定性。
(1)文件共享服務(wù)模塊:整合聯(lián)入系統(tǒng)的節(jié)點(diǎn)的文件資源,提供文件資源共享服務(wù),實(shí)現(xiàn)資源的查詢及下載服務(wù);
(2)計(jì)算力資源整合模塊:整合聯(lián)入系統(tǒng)的節(jié)點(diǎn)的CPU資源,完成特定領(lǐng)域的科學(xué)計(jì)算過程,適合于輸入集松耦合、不同節(jié)點(diǎn)所使用算法大致相同或者獨(dú)立的科學(xué)計(jì)算過程,應(yīng)用實(shí)例舉例——特大質(zhì)數(shù)的判別;
(3)網(wǎng)絡(luò)存儲(chǔ)服務(wù)模塊:整合聯(lián)入系統(tǒng)的節(jié)點(diǎn)的存儲(chǔ)資源,提供海量數(shù)據(jù)存儲(chǔ)服務(wù),應(yīng)用實(shí)例舉例——網(wǎng)絡(luò)硬盤的實(shí)現(xiàn);
(4)極速傳輸服務(wù)模塊:整合聯(lián)入系統(tǒng)的節(jié)點(diǎn)的帶寬資源,提供高速的數(shù)據(jù)傳輸服務(wù)。其工作原理如下,采用文件分片傳輸?shù)姆椒ㄟM(jìn)行文件傳輸,發(fā)送方借助P2P網(wǎng)絡(luò)鄰居節(jié)點(diǎn)的帶寬,使多個(gè)節(jié)點(diǎn)同時(shí)向接收方發(fā)送文件,從而乘數(shù)級(jí)增加數(shù)據(jù)傳輸時(shí)的帶寬。應(yīng)用實(shí)例舉例——極速傳輸工具。
P2P路由模塊及路由表維護(hù)模塊(JavaChord模塊)是完全自主地利用Java開發(fā)的一個(gè)P2P路由模塊,同時(shí)參考文獻(xiàn)[8]所提及的15個(gè)open問題,對(duì)算法作了必要的修改和補(bǔ)充。主要工作包括P2P路由報(bào)文的設(shè)計(jì)及約定。JavaChord模塊使用JavaRMI[9]實(shí)現(xiàn),主要包括sigp2p.chord.datatypes,sigp2p.chord.protocol,sigp2p.chord.protocol.rmi這3個(gè)包,每個(gè)包的詳細(xì)說明略。其中在rmi包中使用了RMICache機(jī)制,即Cache將最近訪問過的RMI服務(wù)保存在列表中,如果程序馬上訪問,可以直接從列表中得到。目的就是為了提高P2P資源查找效率而設(shè)的。
本部分主要介紹通用平臺(tái)的用戶界面Server部分的控制界面,如圖3所示。

圖3 通用平臺(tái)用戶界面:Server端控制界面
下面分區(qū)域介紹Server部分的控制界面的功能:
(1)本地節(jié)點(diǎn)信息區(qū):這一部分設(shè)置本節(jié)點(diǎn)的IP地址,基本端口號(hào)和虛擬節(jié)點(diǎn)號(hào)。本機(jī)IP地址可以點(diǎn)擊Refresh按鈕獲得,端口號(hào)和虛擬節(jié)點(diǎn)號(hào)可以自行設(shè)定,也可以點(diǎn)擊 “Randomly select port and vid”隨機(jī)選取。
(2)啟動(dòng)模式控制區(qū):控制啟動(dòng)模式。選中 “Start bootstrap mode”將本機(jī)作為啟動(dòng)節(jié)點(diǎn)(即環(huán)中第一個(gè)節(jié)點(diǎn))。點(diǎn)擊Join now可以加入環(huán)中已存在的節(jié)點(diǎn)。如果沒有選中將本機(jī)作為啟動(dòng)節(jié)點(diǎn)的模式,啟動(dòng)節(jié)點(diǎn)后將自動(dòng)執(zhí)行Join操作。
(3)節(jié)點(diǎn)控制區(qū):控制節(jié)點(diǎn)。包括啟動(dòng),關(guān)閉,參數(shù)設(shè)置,顯示finger表,退出程序等。
(4)應(yīng)用層服務(wù)控制區(qū):控制應(yīng)用服務(wù)器。程序啟動(dòng)后,下拉列表框中會(huì)出現(xiàn)所有已安裝的應(yīng)用插件。port是報(bào)告給應(yīng)用程序的端口號(hào),不是基本端口號(hào)。
(5)日志區(qū):顯示程序日志。
(6)性能計(jì)數(shù)器區(qū):顯示程序的性能計(jì)數(shù)器。
P2P通用平臺(tái)以開放API函數(shù)的形式提供給第三方進(jìn)行新型應(yīng)用的開發(fā)。接口函數(shù)說明如下:
(1)接口:服務(wù)器端應(yīng)用程序以插件的形式加入到SPIS中。所有服務(wù)器端應(yīng)用程序都要實(shí)現(xiàn)ApplicationServer接口,該接口在sigp2p.spis.appserver包中定義。共有如下3個(gè)方法:
·voidstartup(finalChordServercs,intport);
該方法用于啟動(dòng)應(yīng)用層服務(wù),由SPIS Server調(diào)用。參數(shù)cs是對(duì)當(dāng)前Chord服務(wù)器的引用,參數(shù)port為SPIS Server報(bào)告給應(yīng)用層服務(wù)的端口,此端口的含義由應(yīng)用層服務(wù)器自行約定,也可以忽略它。
·voidshutdown();
該方法用于關(guān)閉應(yīng)用層服務(wù),由SPIS Server調(diào)用。SPIS不保證調(diào)用此方法時(shí)應(yīng)用層服務(wù)器正在運(yùn)行。因此,應(yīng)用層服務(wù)器應(yīng)自行維護(hù)自身狀態(tài)。
·StringgetAppName();
該方法用于獲取應(yīng)用層服務(wù)的名稱,由SPIS Server調(diào)用。
(2)處理Chord結(jié)點(diǎn):每一個(gè)Chord結(jié)點(diǎn)由IP地址,基本端口號(hào),虛擬結(jié)點(diǎn)號(hào)組成。Chord基本端口指的是SPIS服務(wù)器向客戶端或其它服務(wù)器報(bào)告SPIS結(jié)點(diǎn)時(shí)采用IP地址加Chord基本端口的方式。如果應(yīng)用層服務(wù)自身協(xié)議沒有約定端口,則必須在Chord基本端口上進(jìn)行監(jiān)聽,以接受服務(wù)請(qǐng)求。Chord結(jié)點(diǎn)用ChordNode類來表示,該類中對(duì)應(yīng)用層服務(wù)開發(fā)有幫助的成員函數(shù)介紹(略)。
(3)Chord Server API:一般情況下,對(duì)于應(yīng)用層服務(wù)開發(fā)而言,不會(huì)用到j(luò)oin,SetParams,startup,shutdown這4個(gè)方法。因此,這里只介紹其余的5個(gè)方法。
·publicabstractChordNodegetSucessor();
獲取當(dāng)前結(jié)點(diǎn)的后繼,在環(huán)未穩(wěn)定的情況下,后繼可能沒有找到,此時(shí)返回null。
·publicabstractChordNodegetPredecessor();
獲取當(dāng)前結(jié)點(diǎn)的前驅(qū),在環(huán)未穩(wěn)定的情況下,前驅(qū)可能沒有找到,此時(shí)返回null。
·publicabstractChordNodegetFinger(intindex);
獲取當(dāng)前結(jié)點(diǎn)的finger,參數(shù)index是finger本身,可取的范圍是0<=index<=159。finger 0即結(jié)點(diǎn)本身。
·publicabstractbooleanisRunning();
判斷Chord服務(wù)器是否在正運(yùn)行。若正在運(yùn)行,返回true,否則返回false。
·publicabstractChordNodegetNode();
獲取當(dāng)前結(jié)點(diǎn)。
一個(gè)客戶端可以用ChordClient抽象類來表示,Chord-Client提供基本服務(wù)有兩項(xiàng),一是向結(jié)點(diǎn)查找,二是向環(huán)發(fā)送UDP數(shù)據(jù)報(bào)。
(1)創(chuàng)建和初始化Chord客戶端:為了使用Chord客戶端提供的服務(wù),首先需要?jiǎng)?chuàng)建ChordClient對(duì)象。可以通過調(diào)用ChordClientFactory工廠類的靜態(tài)工廠方法產(chǎn)生,ChordClient創(chuàng)建后,對(duì)環(huán)一無所知。需要使用addNode將環(huán)中的一個(gè)結(jié)點(diǎn)告訴ChordClient。通過多次調(diào)用addNode加入更多的結(jié)點(diǎn)。
(2)結(jié)點(diǎn)查找API:
·publicabstractFindResultlookup(ChordIdkey,int retryCount,intretryInterval,booleanstickToNode);
根據(jù)提供的key查找結(jié)點(diǎn),retryCount為重試次數(shù),retryInterval為兩次重試間隔的毫秒數(shù),stickToNode指明是否只通過列表中的第一個(gè)結(jié)點(diǎn)開始查找。如果stickTo-Node為false,每次重試將依次使用列表中的下一次結(jié)點(diǎn)啟動(dòng)查找。retryCount,retryInterval,stickToNode參數(shù)的含義在所有的ChordClient API中都相同。
·publicabstractFindResultlookup(byte[]bytes,intretryCount,intretryInterval,boolean
根據(jù)提供的字節(jié)數(shù)組查找結(jié)點(diǎn)。ChordClient將自動(dòng)在字節(jié)數(shù)組上施加SHA-1散列算法,以生成160bit的key。
(3)向Chord環(huán)發(fā)送UDP數(shù)據(jù)報(bào):ChordClient客戶端提供的第二項(xiàng)基本服務(wù)是向環(huán)發(fā)送UDP數(shù)據(jù)報(bào)。Chord Client首先根據(jù)key找到Chord環(huán)中的結(jié)點(diǎn),然后向該結(jié)點(diǎn)發(fā)送UDP數(shù)據(jù)報(bào)。
·publicabstractvoidsendUDP(byte[]msg,intretryCount,intretryInterval,booleanstickToNode);
字節(jié)數(shù)組為要發(fā)送的UDP數(shù)據(jù)報(bào),ChordClient自動(dòng)在其上施加SHA-1算法以生成160bit的key。該方法是不阻塞的,如果發(fā)送失敗了,客戶將得不到任何提示。
·publicabstractbooleanblockSendUDP(byte[]msg,intretryCount,intretryInterval,booleanstickTo-Node);
這個(gè)方法是sendUDP的阻塞版本。如果成功,返回true,否則返回false。這里的成功僅表示結(jié)點(diǎn)已被找到,UDP數(shù)據(jù)報(bào)已發(fā)送。并不保證數(shù)據(jù)報(bào)被正確接收。
公共工具集是為在通用平臺(tái)的開發(fā)、調(diào)試過程中,所構(gòu)建的公共工具集。
Chord Ring Visualizer(圖4)是一個(gè)用于查看Chord環(huán)中每個(gè)節(jié)點(diǎn)狀態(tài)的工具,它能夠檢測(cè)當(dāng)前環(huán)中的節(jié)點(diǎn)數(shù)、每個(gè)節(jié)點(diǎn)的前驅(qū),后繼列表,finger節(jié)點(diǎn)等等。可觀察到節(jié)點(diǎn)的加入退出,鄰居節(jié)點(diǎn)調(diào)整的過程。
Benchmark Chord(圖5)是用于測(cè)試Chord環(huán)性能的工具,可用于測(cè)試Chord環(huán)的平均查找時(shí)間,查找跳數(shù)等參數(shù)。


網(wǎng)絡(luò)測(cè)試環(huán)境如圖6所示。 主機(jī) 172.18.7.7~172.18.7.10通過交換機(jī)連接成局域網(wǎng)絡(luò)。我們利用公共工具集完成了通用平臺(tái)的功能測(cè)試,包括節(jié)點(diǎn)的加入、退出過程中P2P網(wǎng)絡(luò)的穩(wěn)定性測(cè)試等。

圖6 CHORD測(cè)試硬件環(huán)境
在4臺(tái)PC上分別運(yùn)行10個(gè)節(jié)點(diǎn)。同時(shí)使用Benchmark Chord記錄每秒完成的查找的數(shù)量。由于底層網(wǎng)絡(luò)及節(jié)點(diǎn)處于動(dòng)態(tài)變化中,瞬間值波動(dòng)比較大。為了消除瞬間波動(dòng)帶來的誤差,圖中每個(gè)數(shù)據(jù)點(diǎn)代表該點(diǎn)前60s內(nèi)平均每秒完成的查找數(shù)量。在開啟RMI Cache和關(guān)閉RMI Cache兩種情況下,分別做上述實(shí)驗(yàn),得到如圖7所示結(jié)果。使用RMI Cache后,查找的速度提高了30%左右,性能得到了很大的改善。在節(jié)點(diǎn)數(shù)量進(jìn)一步增加的情況下,節(jié)省的TCP連接數(shù)更多,性能還可進(jìn)一步提高。

圖7 開啟RMI Cache和關(guān)閉RMI Cache通用平臺(tái)查找資源次數(shù)對(duì)比
本文提出了一種結(jié)構(gòu)化P2P網(wǎng)絡(luò)支撐平臺(tái)參考模型,并在該參考模型的指導(dǎo)下,設(shè)計(jì)開發(fā)出一種通用的結(jié)構(gòu)化P2P網(wǎng)絡(luò)支撐平臺(tái),并詳細(xì)介紹了通用平臺(tái)的具體設(shè)計(jì)及實(shí)現(xiàn),詳細(xì)闡述了可提供給第三方進(jìn)行新型應(yīng)用開發(fā)的API函數(shù),同時(shí)給出了通用平臺(tái)的相關(guān)測(cè)試結(jié)果。同非結(jié)構(gòu)化P2P網(wǎng)絡(luò)相比較,結(jié)構(gòu)化P2P網(wǎng)絡(luò)技術(shù)所擁有的強(qiáng)大的可縮放特性,為在廣域網(wǎng)范圍內(nèi)實(shí)現(xiàn)海量規(guī)模的資源整合及共享提供了可能性,由于我們?cè)谕ㄓ闷脚_(tái)中提供了ApplicationServer接口,很容易利用插件開發(fā)的形式完成應(yīng)用層服務(wù)的開發(fā)。本論文的工作對(duì)于促進(jìn)基于結(jié)構(gòu)化P2P網(wǎng)絡(luò)的新型應(yīng)用的開發(fā)和推廣有著廣泛的應(yīng)用前景的。
[1]Chen Zhijia,Zhao Yang.P2Paccelerated mass data distribution over booming internet:Effectiveness and bottlenecks[C]//Montreal,Québec,Canada:Proceedings of the 29th IEEE International Conference on Distributed Computing Systems Workshops,2009:239-244.
[2]Xiong Naixue,Liu Yuhua,Wu Shishun.An efficient search algorithm without memory for Peer-to-Peer cloud computing networks[C]//Anchorage,Alaska,USA:Proceedings of the IEEE International Symposium on Parallel and Distributed Processing Workshops and PhD Forum,2011:1452-1457.
[3]Mohsen Sharifi,Seyedeh Leili Mirtaheri.A dynamic framework for integrated management of all types of resources in P2P systems[J].The Journal of Supercomputing,2010,52(2):149-170.
[4]Pierre Fraigniaud,Philippe Gauron.D2B:A de Bruijn based content-addressable network[J].Theoretical Computer Science,2006,355(1):65-79.
[5]Maenpaa J,Camarillo G.Study on maintenance operations in a chord-based Peer-to-Peer session initiation protocol overlay network[C]//Rome,Italy:Parallel & Distributed Processing,2009:1-9.
[6]Guo D,Liu Y,Ki X.Bake:A balanced Kautz tree structure for peer-to-peer networks[C]//Phoenix,AZ,USA:Proc 27th IEEE INFOCOM,2008.
[7]LIU Ye,LIU Linfeng,ZHUANG Yanyan.An interactive service-oriented P2Pnetworks architecture reference model[J].Engineering Sciences,2007(9):72-77(in Chinese).[劉業(yè),劉林峰,莊艷艷.面向服務(wù)的P2P網(wǎng)絡(luò)體系結(jié)構(gòu)層次參考模型的研究[J].中國工程科學(xué),2007(9):72-77.]
[8]Joseph D,John D Kubiatowicz.Routing algorithms for DHTs:Some open questions[C]//Cambridge,MA,USA:Electronic Proceedings for the 1st International Workshop on Peerto-Peer Systems,MIT Faculty Club,2002.
[9]JavaRMI[CP/OL].http://docs.oracle.com/javase/6/docs/technotes/guides/rmi.Jan 2012.