摘 要: 非結(jié)構(gòu)化P2P網(wǎng)絡具有資源搜索效率不高,容易產(chǎn)生大量冗余信息等問題,為此,提出了一種改進的資源搜索策略。通過為網(wǎng)絡中的節(jié)點建立朋友節(jié)點來改進傳統(tǒng)的非結(jié)構(gòu)化對等網(wǎng)絡資源搜索,并在此基礎上設計了一種新的資源搜索算法。仿真試驗證明,該策略在一定程度上提高了非結(jié)構(gòu)化P2P資源搜索的效率,同時減少了網(wǎng)絡中的冗余信息量。
關鍵詞: 非結(jié)構(gòu)化P2P網(wǎng)絡;資源搜索;朋友節(jié)點;冗余信息
效地組織和利用Internet上大量分布的計算、存儲以及信息等資源,充分釋放互聯(lián)網(wǎng)蘊含的巨大的邊緣資源,以實現(xiàn)信息共享、即時通信、超級計算等目標。P2P技術在當今互聯(lián)網(wǎng)中有著廣泛的應用,美國財富雜志更是將P2P技術列為未來影響IT技術的四大關鍵技術之一[1]。然而,計算機網(wǎng)絡是一個用戶分布廣泛、數(shù)量巨大,節(jié)點行為不可控、計算能力和網(wǎng)絡連接不均勻的復雜網(wǎng)絡,如何實現(xiàn)資源高效地搜索服務是P2P技術面臨的一個難題。
本文針對現(xiàn)有非結(jié)構(gòu)化P2P網(wǎng)絡資源搜索效率不高,容易產(chǎn)生冗余信息等問題,提出了一種改進策略。通過增加節(jié)點的智能性來提高非結(jié)構(gòu)化P2P網(wǎng)絡資源的搜索效率,并采取一定的措施來減少網(wǎng)絡中冗余信息的產(chǎn)生。具體實現(xiàn)方法如下:在資源的搜索過程中,逐漸建立節(jié)點的朋友節(jié)點列表,相對于其他節(jié)點,朋友節(jié)點具有資源豐富及搜索成功率比較高等優(yōu)點;資源搜索請求首先在朋友節(jié)點上進行,當搜索失敗時,再采用最基本的搜索算法。
1 相關工作
目前,P2P網(wǎng)絡按照拓撲結(jié)構(gòu)可以分為結(jié)構(gòu)化P2P網(wǎng)絡和非結(jié)構(gòu)化P2P網(wǎng)絡。前者利用分布式Hash表(DHT),將節(jié)點組織成嚴格的拓撲結(jié)構(gòu),并將共享資源映射到特定的節(jié)點上,在資源搜索時采用相應的定位方法,使得資源搜索能夠在確定的跳數(shù)內(nèi)完成,效率較高[2]。然而,P2P網(wǎng)絡的高動態(tài)性使得結(jié)構(gòu)化P2P網(wǎng)絡的維護開銷巨大;只支持關鍵字的精確查詢,不支持內(nèi)容、語義查詢;網(wǎng)絡節(jié)點的物理結(jié)構(gòu)被破壞,實際延遲大。
非結(jié)構(gòu)化P2P網(wǎng)絡是以Gnutella為代表的一類網(wǎng)絡。這種網(wǎng)絡的結(jié)構(gòu)松散,共享資源的分布具有隨機性和不確定性,其主要采用中心搜索和泛洪(Flooding)搜索算法。中心搜索是指在網(wǎng)絡加入一個主要用于資源搜索的服務器,資源的搜索都在該服務器上完成,其容易產(chǎn)生服務瓶頸問題,一旦服務器失效,整個網(wǎng)絡將崩潰;Flooding算法向所有鄰居節(jié)點廣播查詢信息,搜索根據(jù)預先設置的生命值TTL(Time to Live)來終止廣播查詢請求,其容易產(chǎn)生大量冗余信息,且搜索效率低。在以后的算法改進中出現(xiàn)了Modified-BFS和Random Walk等算法。Modified-BFS算法雖然按照一定的概率隨機地選擇部分的節(jié)點發(fā)送消息,減少了網(wǎng)絡中的路由消息,降低了網(wǎng)絡的負載,但是資源搜索的成功率降低了;而Random Walk算法的最大劣勢在其表現(xiàn)的不穩(wěn)定性上,而且該算法的兩個參數(shù)(漫游消息的數(shù)量n以及漫游消息的步長s)的恰當取值也是個難點[3-4]。
P2P網(wǎng)絡的可用性依賴于網(wǎng)絡中各個節(jié)點貢獻資源,然而有參考文獻[5]顯示,在Gnutella中有70%的用戶節(jié)點從網(wǎng)絡中獲取資源,但它們對網(wǎng)絡的貢獻率卻幾乎為零,這種稱為“搭便車”的現(xiàn)象普遍存在于P2P網(wǎng)絡中,阻礙了網(wǎng)絡的高效運行。因此,在非結(jié)構(gòu)化P2P網(wǎng)絡的資源搜索過程中,訪問一些不存在共享資源或者共享資源很少的節(jié)點本身就是對網(wǎng)絡帶寬和節(jié)點計算能力的一種浪費,完全可以通過一些策略將資源的搜索發(fā)生在那些搜索成功率比較高的節(jié)點上,這樣就大大提高了非結(jié)構(gòu)化P2P網(wǎng)絡資源搜索的效率。
關于提高非結(jié)構(gòu)化P2P網(wǎng)絡資源搜索,參考文獻[6]提出了一種基于學習的搜索算法,其采用分布式的被動學習方式,從歷史搜索結(jié)果中學習節(jié)點之間的興趣相似度,并指出保存歷史記錄可以對后面的節(jié)點發(fā)起的資源搜索產(chǎn)生借鑒意義。參考文獻[7]提出將網(wǎng)絡中的節(jié)點劃分為超級節(jié)點和普通節(jié)點,資源搜索首先在超級節(jié)點上進行,搜索失敗后再通過廣播搜索信息在普通節(jié)點上進行。
2 改進的資源搜索策略
2.1 朋友節(jié)點
在本文中,朋友節(jié)點是指那些對以后的資源搜索具有重要意義的節(jié)點。和其他節(jié)點相比,朋友節(jié)點可能具有以下特點:(1)豐富的資源,很大程度上能滿足資源的搜索請求;(2)和搜索節(jié)點具有相同的興趣[6]。網(wǎng)絡中的任意節(jié)點可以選擇多個節(jié)點作為自己的朋友節(jié)點,并建立起自己的朋友節(jié)點列表。當一個節(jié)點剛加入網(wǎng)絡時,其朋友節(jié)點列表長度為零,在以后的資源搜索過程中,朋友節(jié)點列表逐漸建立起來。朋友節(jié)點列表長度不能無限大,否則就失去了意義。朋友節(jié)點列表需要不斷地更新和維護,以便增加新的更有意義的節(jié)點和淘汰那些舊的逐漸失去意義的節(jié)點。
2.2 朋友節(jié)點列表
本文將朋友節(jié)點列表設計成一個線性鏈表,該線性鏈表除了有一個指示其入口地址的指針*L外,還需要增加size和Maxsize兩個變量。其中,size指示現(xiàn)有的朋友節(jié)點列表的長度;Maxsize指示該線性鏈表不能超過的最大長度。因此,網(wǎng)絡中某一節(jié)點的朋友節(jié)點列表定義為:FriendNode_List(*L,size,Maxsize)。
當網(wǎng)路中某一節(jié)點在某一時刻發(fā)起資源搜索請求并成功后,就將包含該目標資源的節(jié)點視為自己的朋友節(jié)點,并將其加入到自己的朋友節(jié)點列表中。很顯然,在朋友節(jié)點列表中只需要記錄該目標節(jié)點的地址即可,即IP_Address。另外,由于朋友節(jié)點列表需要不斷地更新和維護,因此需要引入一個變量來衡量朋友節(jié)點的意義程度,很顯然,在某一節(jié)點上獲取資源的次數(shù)越多,該節(jié)點就越有意義。因此,引入一個變量num指示成功獲取資源的次數(shù);再增加一個變量Extra表示一些額外的附加信息,例如Extra可以記錄最后一次成功獲取資源的時間。因此,朋友節(jié)點定義為FriendNode(*next,IP_Address,num,Extra)。朋友節(jié)點列表的組織結(jié)構(gòu)如圖1所示。
圖1中,為了取參數(shù)方便,將變量size的值存放在了頭節(jié)點的num值域中。下面給出了定義朋友節(jié)點和初始化線性鏈表(由于文章篇幅限制,只給出部分實現(xiàn)代碼)。
//定義朋友節(jié)點的數(shù)據(jù)結(jié)構(gòu)
#define Maxsize 50//定義朋友節(jié)點列表的最大長度為50
typedef struct FriendNode{
struct FriendNode *next;
DataType IP_Address;
int num;
DataType Extra;
}FriendNode,*Lnode;
//初始化朋友節(jié)點列表,
//返回指向第一個節(jié)點(頭結(jié)點)的指針
Lnode*FriendNode_List(){
L=(Lnode*)malloc(sizeof(Lnode));
//開辟一個存儲朋友節(jié)點信息的空間
L->next=null;//將next域置為空
L->num=0;//朋友節(jié)點列表的初始長度為0
return L;}
2.3 朋友節(jié)點列表的維護
此時,網(wǎng)絡中任意一個節(jié)點A維護自己的朋友節(jié)點列表FriendNode_List(*L,size,Maxsize)的算法如下(文字描述):
?。?)節(jié)點A在某一節(jié)點B成功獲取了資源,則節(jié)點A根據(jù)節(jié)點B的IP地址判斷其是否已經(jīng)存在自己的朋友節(jié)點列表上,如果是,轉(zhuǎn)向(2),否則轉(zhuǎn)向(3);
?。?)修改節(jié)點B的num值,置num+=1,結(jié)束;
?。?)判斷size的值是否小于Maxsize,如果是,則轉(zhuǎn)向(4),否則轉(zhuǎn)向(5);
?。?)增加一個朋友節(jié)點域,將其中的IP_Address的值設為節(jié)點B的IP地址,num的值設為1,朋友節(jié)點列表長度size+=1,結(jié)束;
?。?)找出表中num值最小的元素,將B的IP地址取代原來節(jié)點的IP_Address值,同時將num的值置為1,結(jié)束。
參考操作系統(tǒng)中的缺頁中斷算法,當朋友節(jié)點列表長度已經(jīng)達到最大后,也可以將那些最近最久沒有獲得過資源的朋友節(jié)點刪除。
2.4 改進的資源搜索算法
非結(jié)構(gòu)化P2P網(wǎng)絡資源搜索實質(zhì)上就是將包含目標資源的搜索信息發(fā)送到網(wǎng)絡中其他節(jié)點中去,如果某一節(jié)點中存在目標資源,則兩節(jié)點建立網(wǎng)絡連接完成該資源的傳輸?,F(xiàn)在,網(wǎng)絡中的節(jié)點維護著一張朋友節(jié)點列表,相對于其他節(jié)點,朋友節(jié)點具有資源豐富、資源搜索成功率高的優(yōu)點,因此本文中改進的資源搜索算法敘述如下:
?。?)在某一時刻,節(jié)點A發(fā)起資源搜索請求,設置TTL的值為2,將資源搜索信息按照自己的朋友節(jié)點列表發(fā)送到每一個朋友節(jié)點上。
?。?)TTL的值減1,假設節(jié)點B是A的朋友節(jié)點,如果節(jié)點B滿足該資源搜索請求,則兩節(jié)點建立連接完成該資源的傳輸同時修改自己的朋友節(jié)點列表,結(jié)束;否則轉(zhuǎn)向(3)。
?。?)節(jié)點B將該資源搜索信息根據(jù)自己的朋友節(jié)點列表轉(zhuǎn)發(fā)到所有的朋友節(jié)點中去,重復過程(2),資源搜索信息隨著TTL的值為0時終止傳輸。
(4)如果上述資源搜索失敗,則采用Flooding搜索算法。
也許上述改進的資源搜索算法不適用于網(wǎng)絡中剛加入的節(jié)點,因為其還沒有發(fā)起資源搜索請求,所以其朋友節(jié)點列表的長度為0。這個問題可以很容易解決,例如當一個節(jié)點剛加入網(wǎng)絡時,直接復制其鄰居節(jié)點的朋友節(jié)點列表。
3 性能評估
本文的意義是通過建立朋友節(jié)點列表盡量將資源搜索發(fā)生在一些搜索成功率比較高的節(jié)點上,這樣就盡量避免了Flooding算法的使用,提高資源搜索效率。同時,采用基于朋友節(jié)點列表的資源搜索時,將TTL的值設為2是為了一方面擴大有意義的節(jié)點的搜索范圍,另一方面避免冗余信息的產(chǎn)生,如圖2所示。
圖2中顯示了節(jié)點A、B、E的朋友節(jié)點??梢钥闯?,節(jié)點A和節(jié)點B有一個相同的朋友節(jié)點D;節(jié)點A和節(jié)點E有一個共同的朋友節(jié)點C;節(jié)點B和E有一個共同的朋友節(jié)點D。當節(jié)點A發(fā)起資源搜索時,會把搜索信息發(fā)給節(jié)點B、C、D。如果節(jié)點B上不存在節(jié)點A想要的資源,由于TTL的值設為2,所以節(jié)點B將繼續(xù)轉(zhuǎn)發(fā)搜索信息到節(jié)點D、E、F,可以看出節(jié)點D接受資源搜索信息兩次,這就引起了無效的資源搜索信息轉(zhuǎn)發(fā)。如果將TTL的值設為3或者更高,那么如果當節(jié)點E不滿足節(jié)點A的資源請求時會繼續(xù)將搜索信息發(fā)送給節(jié)點C和D,很顯然,由節(jié)點E轉(zhuǎn)發(fā)的兩次資源搜索信息都是無效的,這就引起了網(wǎng)絡帶寬資源的浪費,這也是Flooding算法的根本缺陷所在。筆者在以前參考的論文中,有的論文提出根據(jù)節(jié)點共享文檔的相似性建立相同興趣節(jié)點,將資源搜索信息首先轉(zhuǎn)發(fā)到具有相同興趣的節(jié)點上,如果該節(jié)點不滿足資源搜索,則繼續(xù)轉(zhuǎn)發(fā)到自己的相同興趣節(jié)點上,可以看出,這種說法是不準確的,在此給出糾正。
從上面的說明中可以看出,當網(wǎng)絡中的節(jié)點逐漸建立起自己的朋友節(jié)點列表后,下次搜索資源時,通過將資源的搜索信息發(fā)送到朋友節(jié)點以及朋友的朋友節(jié)點(即兩級搜索),就基本上可以做到搜索覆蓋了網(wǎng)絡中的大部分有意義的節(jié)點。也就是說,當一個節(jié)點成功建立起自己的朋友節(jié)點列表后,后來的資源搜索基本上就可以在一跳或者兩跳內(nèi)完成。
4 實驗驗證
本次模擬實驗在一臺PC上完成,網(wǎng)絡的拓撲結(jié)構(gòu)由FLOD算法產(chǎn)生,構(gòu)造了一個具有1 000個節(jié)點和10 000份文檔的P2P網(wǎng)絡,文檔在節(jié)點間采用80:20分布(即網(wǎng)絡中20%的節(jié)點擁有全網(wǎng)80%的文檔,剩下80%的節(jié)點只擁有剩下的20%的文檔)。
本次試驗通過設置朋友節(jié)點列表長度與全網(wǎng)所有節(jié)點數(shù)目的比例P,來觀察資源搜索在一跳或兩跳內(nèi)的搜索成功率S(即資源搜索通過轉(zhuǎn)發(fā)朋友節(jié)點列表)。理論上,朋友節(jié)點列表長度最大取值為(n為網(wǎng)絡的節(jié)點數(shù)目)。
搜索結(jié)果如圖3所示。其中,P的取值分別為0.005、0.01、0.015、0.02、0.025、0.03、0.035、0.04、0.045,即朋友節(jié)點長度分別為5、10,、15、20、25、30、35、40、45時的搜索成功率S。
從圖3可以看出,S的值隨著P的值增大而明顯增大,當朋友節(jié)點列表長度接近或略大于40時,S的值接近于1,這也就驗證了預期的設想。
在網(wǎng)絡信息流量方面,由于朋友節(jié)點列表的存在,資源搜索信息的轉(zhuǎn)發(fā)是明確的,即資源搜索信息不會轉(zhuǎn)發(fā)到一個先前不確定的節(jié)點上,這也就解決了Flooding算法產(chǎn)生大量冗余信息的根本問題所在。
本文通過為網(wǎng)絡中的節(jié)點建立朋友節(jié)點列表,將資源的搜索發(fā)生在資源搜索成功率比較高的節(jié)點上,這樣既提高了資源的搜索效率,又避免了大量冗余信息的產(chǎn)生。試驗證明該策略簡單可行,當一個節(jié)點在發(fā)起多次資源搜索請求并成功建立起自己的朋友節(jié)點列表后,以后的資源搜索通過轉(zhuǎn)發(fā)朋友節(jié)點列表就基本上能在一跳或兩跳內(nèi)完成,這樣也驗證了預期的設想。
參考文獻
[1] GONG L. Peer-to-peer networks in action[J]. IEEE Internet Computing, 2002,6(1):37-39.
[2] 王麗莉,孫波,肖永康,等.結(jié)構(gòu)化P2P資源搜索算法研究綜述[J].計算機應用研究,2009,26(10):3621-3624.
[3] 張文,趙子銘,楊天路,等.P2P網(wǎng)絡技術原理與C++開發(fā)案例[M].北京:人民郵電出版社,2008.
[4] 張偉,歐陽松.一種基于非結(jié)構(gòu)化對等網(wǎng)絡的改進搜索算法[J].計算機系統(tǒng)應用,2009,21(1):59-61.
[5] ADAR E, HUBERMAN B A. Free-riding on Gnutella[J]. First Monday, 2000,5(10):1-22.
[6] 陳海濤,龔正虎,黃遵國.一種基于學習的P2P搜索算法[J].計算機研究與發(fā)展,2005,42(9):1600-1604.
[7] 曾曉云.基于Chord協(xié)議的混合P2P模型[J].計算機工程,2010,36(7):112-115.