P2P仿真實習(xí)報告_第1頁
P2P仿真實習(xí)報告_第2頁
P2P仿真實習(xí)報告_第3頁
P2P仿真實習(xí)報告_第4頁
P2P仿真實習(xí)報告_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

西安電子科技大學(xué)一種典型分布式對等網(wǎng)絡(luò)的設(shè)計與模擬姓名:王濤指導(dǎo)人:馮景瑜完成時間:2010-8-16

目錄第一章緒論 第一章緒論1.1課題背景P2P的研究熱度呈逐年增長的趨勢,作為一種完全分布的計算模型,可以脫離中央服務(wù)器實現(xiàn)對等節(jié)點間的直接通信,從而充分利用每個網(wǎng)絡(luò)節(jié)點自身的資源,實現(xiàn)整個網(wǎng)絡(luò)計算資源的充分利用和信息資源的高效共享。當(dāng)前P2P的研究圍繞著一系列的算法,包括構(gòu)建高效P2P網(wǎng)絡(luò)拓撲的分布式協(xié)議,無結(jié)構(gòu)P2P網(wǎng)絡(luò)的搜索算法,用以應(yīng)對搭便車現(xiàn)象(FreeRide)的激勵機制等等。由于P2P網(wǎng)絡(luò)的迅速發(fā)展,網(wǎng)絡(luò)節(jié)點數(shù)巨大,已經(jīng)不能靠將這些算法應(yīng)用于一個已經(jīng)成熟應(yīng)用的P2P網(wǎng)絡(luò)去驗證算法的性能。應(yīng)此,P2P網(wǎng)絡(luò)中的算法和協(xié)議通常在仿真中驗證,仿真器根據(jù)網(wǎng)絡(luò)模型構(gòu)建并模仿節(jié)點的行為以及網(wǎng)絡(luò)的傳輸模式等等。1.2課題意義作為在現(xiàn)實中已經(jīng)廣泛使用的技術(shù),P2P已經(jīng)累積了大量需要亟待解決的問題。搭便車者(FreeRider)現(xiàn)象的出現(xiàn),在很大程度上影響著P2P系統(tǒng)的繼續(xù)推廣。在分布式計算P2P系統(tǒng)中,如果沒有結(jié)點的積極參與,分布式的群集功能就無法體現(xiàn)出來;流媒體P2P系統(tǒng)中,如果大量結(jié)點斷絕上傳服務(wù),那么整個網(wǎng)絡(luò)的緩存信息就不足以使得畫面流暢。同樣問題也出現(xiàn)在文件分享型P2P系統(tǒng)中,搭便車者極大的打擊著結(jié)點分享的積極性,甚至能夠損害網(wǎng)絡(luò)原有拓撲穩(wěn)定。分析搭便車對網(wǎng)絡(luò)的影響,檢驗激勵機制的穩(wěn)定性和可靠性,都需要對P2P節(jié)點的行為進行專門的模擬測試。而且,安全問題越來越受到重視。2002年日本一種病毒在Winny這種P2P網(wǎng)絡(luò)中傳播,造成大范圍的用戶私人信息泄露,Winny的作者也被刑拘。這一事件進一步引起了對P2P網(wǎng)絡(luò)安全的關(guān)注。據(jù)最新網(wǎng)絡(luò)安全研究表明,蠕蟲病毒能夠在具有小世界特性的P2P網(wǎng)絡(luò)中更加快速的傳播。所以,P2P網(wǎng)絡(luò)的安全研究勢在必行,而一個能夠模擬真實攻防環(huán)境的平臺可以極大的輔助安全策略的制定。P2P網(wǎng)絡(luò)還有其他很多原因?qū)е卤仨毥Y(jié)合P2P網(wǎng)絡(luò)的獨有特性,為P2P網(wǎng)絡(luò)量身定做一個仿真平臺。比如不同的P2P系統(tǒng)具有不同的應(yīng)用場合,每一種應(yīng)用都有單獨的技術(shù)規(guī)范和檢驗標(biāo)準(zhǔn)。如果沒有統(tǒng)一的仿真環(huán)境,想要添加新的應(yīng)用模擬平臺就變得不容易,而且仿真的結(jié)果也沒有可比性,因為不能保證試驗是在統(tǒng)一的參數(shù)環(huán)境下的進行的。1.3課題目標(biāo)本次課題的目標(biāo)是:找到一種通用的P2P網(wǎng)絡(luò)的仿真器,它必須有良好的可擴展性,支持較多的節(jié)點,有較高的運行效率;該仿真器必須使用Java編寫,這樣就可將很多現(xiàn)成的協(xié)議移植進仿真器,也可便于與其他研究人員交流代碼;自行設(shè)計一種典型的基于信任模型的P2P協(xié)議,編寫代碼并調(diào)試使其在仿真器上運行,保存運行數(shù)據(jù)。

第二章PeerSim簡介本章是對PeerSim這一P2P專用網(wǎng)絡(luò)仿真工具的原理和流程的介紹,PeerSim是在本次實習(xí)調(diào)研階段發(fā)現(xiàn)的P2P仿真軟件,由于它很好地滿足了課題要求,所以實習(xí)接下來的內(nèi)容都是圍繞對他的研究展開的。2.1PeerSim概述PeerSim是一個模擬P2POverlay網(wǎng)絡(luò)的軟件,支持結(jié)構(gòu)化和非結(jié)構(gòu)化P2P網(wǎng)絡(luò)模擬。PeerSim有兩種模擬方式,Cycle-based和Event-driven。Event-driven模式相對精確,Eycle-based模式缺少傳輸層的模擬而且不能起到并發(fā)控制的作用,但占用資源少以適合于大規(guī)模的模擬,根據(jù)官方所發(fā)表的一篇最新論文,在擁有4GB內(nèi)存的情況下,Event-driven模式目前最多支持十萬節(jié)點級別,而Cycle-based模式則支持千萬個節(jié)點級別。PeerSim是一個極易擴展的仿真環(huán)境,支持動態(tài)網(wǎng)絡(luò)的仿真,協(xié)議需要執(zhí)行特定的PeerSimAPI,但是只需很少的努力,就可以發(fā)展成為真正的執(zhí)行。在指定的參數(shù)空間進行檢測也是被支持的。PeerSim開始時只是被當(dāng)作一項特定研究的工具,而在它獲得LGPL開源許可,并被發(fā)布以來,它吸引了很多獨立的研究團體,到目前為止,PeerSim已經(jīng)被下載了超過12000次,在150篇論文中被引用,而其中只有很少一部分引用是來自PeerSim的作者。2.2Cycle-based模式仿真Cycle-based模型是一個簡化的模型,擁有更好的伸縮性及性能,但是Cycle-based模型缺少對傳輸層的仿真和并行處理,節(jié)點之間是直接通信的,仿真核心以一定的順序周期性地給以節(jié)點控制。在運行時,可以進行任意的操作,如調(diào)用其它對象的方法并執(zhí)行一些計算。PeerSim鼓勵基于接口的模塊化編程,每一個組件都能被其它實現(xiàn)了相同接口的組件代替,一般的仿真過程如下:選擇網(wǎng)絡(luò)大?。垂?jié)點數(shù)量);選擇要實驗的一個或多個協(xié)議并進行初始化;選擇一個或多個Control對象來監(jiān)視感興趣的屬性,并在仿真時修改一些參數(shù)(比如,網(wǎng)絡(luò)大小,協(xié)議的內(nèi)部狀態(tài),等等);根據(jù)配置文件,調(diào)用Simulator類運行仿真。在仿真時創(chuàng)建的對象都是實現(xiàn)了一個或多個接口的類的實例,主要的接口如表2-1所示。表2-1Cycle-based下的主要接口NodeP2P網(wǎng)絡(luò)是由節(jié)點組成的,節(jié)點是協(xié)議的容器。Node接口提供了對節(jié)點所包含的協(xié)議的訪問方法,并為節(jié)點提供了固定的ID。CDProtocol這是一個特定的協(xié)議,被設(shè)計用來在Cycle-based模型中運行,它只定義了在每一個周期中要運行的操作。Linkable一般都由協(xié)議來實現(xiàn),這個接口為其它協(xié)議提供了訪問鄰居節(jié)點集合的服務(wù),節(jié)點間相同的Linkable協(xié)議類的實例定義了一個覆蓋網(wǎng)絡(luò)。Control實現(xiàn)了這個接口的類可以在仿真期間的某個時間點調(diào)度執(zhí)行,這些類一般用于觀察或修改仿真過程。圖2-1Cycle-based下的調(diào)度時序Cycle-based仿真的生命周期是這樣的:讀取配置文件(通過命令行參數(shù)傳遞進來),然后仿真器初始化網(wǎng)絡(luò)中的節(jié)點和節(jié)點中的協(xié)議,每個節(jié)點都擁有相同的協(xié)議棧。節(jié)點和協(xié)議的實例是通過克隆來創(chuàng)建的,只有一個原型是通過構(gòu)造方法創(chuàng)建,其它的節(jié)點和協(xié)議都是從這個原型中克隆而來?;谶@個原因,協(xié)議類中Clone()方法的實現(xiàn)是很重要的。初始化操作,設(shè)置每個協(xié)議的初始狀態(tài)。初始化階段是由Control對象控制運行的,僅在實驗開始時運行一次。在配置文件中,初始化的組件可以由init前綴識別,在下面討論的Initializer對象也是Controls,但為了標(biāo)記其功能以區(qū)別于一般的Control對象,它被配置用來在初始階段運行。在初始化完成后,Cycle-based引擎在每一個周期中調(diào)用所有組件(Protocols和Controls)一次,直到完成了指定的周期數(shù),或者某個組件決定終止仿真為止。在PeerSim中每一個對象(Controls和Protocols)都被賦以一個Scheduler對象,它定義了什么時候本組件將會被執(zhí)行。在默認情況下,所有對象都會在每個周期中運行。但我們也可以配置一個Protocol或Control只在某些特定的周期中運行,也可以在每一個周期中指定組件的執(zhí)行順序。圖2-2配置文件圖2-1展示了對Controls和Protocols的調(diào)度,其中C代表Control而P代表一個協(xié)議。圖下方的數(shù)字代表PeerSim的周期,在最后一個周期后,可以運行一個Control來獲取最后的快照(Snapshot)。在一個Control收集數(shù)據(jù)時,數(shù)據(jù)將會被格式化并發(fā)送到標(biāo)準(zhǔn)輸出或重定向到一個文件以進行后續(xù)的處理。配置文件只是一個普通的ASCII文本,本質(zhì)上就是java.util.Properties,以#開頭的行代表注釋。配置文件的信息將以鍵值對的形式被程序讀入,如在圖2-2所示的配置文件中,random.seed就是一個鍵,它的值為1234567890。仿真器在初始化時,在需要初始化隨機數(shù)產(chǎn)生器時,就會在配置文件中搜索random.seed并讀取它的值,用它的值初始化隨機數(shù)生成器。再如,當(dāng)初始化節(jié)點時,需要給節(jié)點裝入?yún)f(xié)議實例,具體去裝入哪個類的實例,就必須在配置文件中查找,例如當(dāng)節(jié)點有一個名字叫avg的協(xié)議時,配置文件就查找protocol.avg鍵的值,就能找到實現(xiàn)了這個協(xié)議的類??偟膩碚f,配置文件就是由用戶設(shè)置的參數(shù)以及用戶自定義的類的路徑的集合。2.3小結(jié)要利用PeerSim循環(huán)驅(qū)動模式進行仿真,首先必須理解配置文件的作用,要清楚協(xié)議組件和控制組件的作用以及被調(diào)度的時機。在循環(huán)驅(qū)動模式下,一些實際P2P系統(tǒng)中的細節(jié)被忽略,帶來的回報是支持更多的節(jié)點以及更快的執(zhí)行速度。

第三章基于信任模型的文件共享P2P協(xié)議本章主要講述一個典型的基于信任模型的P2P協(xié)議的思想以及運行流程,它的配置文件的內(nèi)容如下:#設(shè)置偽隨機數(shù)生成器的種子random.seed1234567890#設(shè)置循環(huán)次數(shù)為30次simulation.cycles30#在每輪循環(huán)后對網(wǎng)絡(luò)節(jié)點進行洗牌的控制組件control.shfShuffle#設(shè)置節(jié)點個數(shù)為5000network.size5000#節(jié)點中的Linkable協(xié)議設(shè)為IdleProtocolprotocol.lnkIdleProtocol#節(jié)點中的第二層協(xié)議設(shè)為pdSim.TrustManage并設(shè)置相關(guān)參數(shù)protocol.trustpdSim.TrustManageprotocol.trust.linkablelnkinit.con.badPeerPercentage0.1#對節(jié)點進行連線以構(gòu)造拓撲的初始化組件WireKOut及相關(guān)參數(shù)的設(shè)定init.rndWireKOtocollnkinit.rnd.k20#設(shè)置負責(zé)填充節(jié)點資源向量的pdSim.InitContent為初始化組件init.conpdSim.InitCtocoltrust#設(shè)置初始化組件的調(diào)度順序,先調(diào)度init.rnd再調(diào)度init.coninclude.initrndcon#設(shè)置一個在30輪循環(huán)過后觀察數(shù)據(jù)的控制組件control.obspdSim.Otocoltrust3.1節(jié)點模型在本協(xié)議中,節(jié)點是由一個類實現(xiàn)的,當(dāng)被實例化后,每個節(jié)點將擁有獨立的內(nèi)存空間和協(xié)議棧,節(jié)點由ID和INDEX兩個量來標(biāo)識,其中ID是在節(jié)點初始化后不會發(fā)生變化的,所以在任何時候ID都可以唯一地標(biāo)識一個節(jié)點,它可以被理解為代表了現(xiàn)實中節(jié)點的IP地址,而INDEX則是和網(wǎng)絡(luò)動態(tài)演進相關(guān)的一個標(biāo)識,當(dāng)仿真一輪結(jié)束后,執(zhí)行“洗牌”(Shuffle)動作后,節(jié)點的INDEX可能會變化。當(dāng)在網(wǎng)絡(luò)中查找某個節(jié)點時,總是按照INDEX遍歷所有節(jié)點,以搜尋ID為某個特定值的節(jié)點。在PeerSim中節(jié)點在默認情況下使用peersim.core.GeneralNode類,當(dāng)然,用戶也可以定義自己的節(jié)點類,做法是編寫一個實現(xiàn)peersim.core.Node接口的類,并在配置文件中加以說明。節(jié)點在網(wǎng)絡(luò)中的動作是由協(xié)議來定義的,節(jié)點在初始化時,將按照配置文件裝入指定協(xié)議的實例,每個節(jié)點的每個協(xié)議實例都擁有相互獨立的內(nèi)存空間。在本例中,每個節(jié)點裝入了兩個協(xié)議分別是負責(zé)管理拓撲的lnk協(xié)議和負責(zé)管理節(jié)點相互信任的trust協(xié)議,它們是從配置文件的protocol.lnk和protocol.trust兩個鍵讀入相應(yīng)的類的。3.2拓撲模型在PeerSim中,當(dāng)節(jié)點建立起來以后,他們之間是沒有連接的,也就是說它們僅僅是孤立的節(jié)點,在本協(xié)議中,拓撲是由peersim.dynamics.WireKOut類來建立的,在配置文件中可以看到,它的鍵名為為init.rnd,init表明該類是一個初始化組塊。它的主要作用為,為每個節(jié)點連接K個鄰居節(jié)點,K的值是讀取配置文件中init.rnd.k的鍵值得到的,在本協(xié)議中,這個值是20,即每個節(jié)點有二十個鄰居節(jié)點。可以看到配置文件中關(guān)于拓撲的描述中還有tocollnk,這表明WireKOut是通過節(jié)點中的lnk協(xié)議的實例來建立連接的,具體做法為:向IdleProtocol協(xié)議實例的鄰居節(jié)點數(shù)組中添加相應(yīng)的節(jié)點,而IdleProtocol協(xié)議正是節(jié)點中負責(zé)維護鄰居節(jié)點數(shù)組的協(xié)議。每個節(jié)點的IdleProtocol協(xié)議實例中的鄰居節(jié)點數(shù)組中存有該節(jié)點的所有鄰居節(jié)點。3.3信任模型思想在P2P網(wǎng)絡(luò)中,由于任何節(jié)點都是可以加入的,同時也為網(wǎng)絡(luò)中的其他節(jié)點提供的轉(zhuǎn)發(fā)服務(wù),從網(wǎng)絡(luò)攻擊的角度來看,一個“惡意”節(jié)點故意將正常的數(shù)據(jù)替換成偽造的數(shù)據(jù),轉(zhuǎn)發(fā)的整個P2P網(wǎng)絡(luò)中,完全可以欺騙其他P2P的節(jié)點而不被發(fā)現(xiàn)。P2P網(wǎng)絡(luò)中由于缺乏統(tǒng)一的管理,在發(fā)現(xiàn)偽造的數(shù)據(jù)后,不能控制P2P節(jié)點不下載偽造的數(shù)據(jù)或者阻止P2P網(wǎng)絡(luò)中偽造數(shù)據(jù)的傳輸,從而導(dǎo)致偽造的數(shù)據(jù)在P2P網(wǎng)絡(luò)中肆意傳播。而且會處于完全失控狀態(tài)。P2P使得網(wǎng)絡(luò)熱門資源能夠在網(wǎng)絡(luò)中迅速傳播,這給病毒和惡意軟件提供了傳播的捷徑。當(dāng)然,P2P軟件本身有可能是無害的,但共享的文件中卻可能因為存在漏洞而被利用。流行的RMVB格式存在一個廣告彈出的漏洞,這被許多不法分子所利用作散布不良信息的渠道。熱門影片的用戶關(guān)注程度總是比較高,不法分子在影片中攜帶彈出式廣告,使得有害信息在P2P網(wǎng)絡(luò)上爆炸式地傳播,遠遠超過了在傳統(tǒng)C/S模式下的傳播速度?;谛湃文P偷腜2P協(xié)議認為,信任是主體對客體特定行為的主觀可能性預(yù)期,取決于經(jīng)驗并隨著客體行為的結(jié)果變化而不斷修正,在本次仿真的文件共享型P2P網(wǎng)絡(luò)中,節(jié)點之間互相評價,評價的依據(jù)為該節(jié)點提供的正常的下載次數(shù)。每個節(jié)點都擁有一些資源,當(dāng)節(jié)點需要一個資源時,它向所有鄰居節(jié)點發(fā)送資源請求消息,當(dāng)一個節(jié)點收到資源請求消息后,它首先檢查自己是否擁有請求的資源,如果有,則發(fā)回一個資源應(yīng)答消息,如果沒有,則將消息的TTL值減1后向自己的所有鄰居節(jié)點轉(zhuǎn)發(fā)。一個節(jié)點在收到一條資源應(yīng)答消息后,首先檢查自己是否已經(jīng)擁有該資源,如果該資源應(yīng)答消息正是自己所需要的資源,則該節(jié)點將首先檢查發(fā)出應(yīng)答的節(jié)點的信譽值,當(dāng)該值高于閥值時就下載該節(jié)點上的資源,若該值低于閥值,則以一個較小的概率下載該節(jié)點上的資源,當(dāng)下載成功時,將給予提供下載的節(jié)點進行評價,一般是將其信譽值加一。惡意節(jié)點是對看到的網(wǎng)絡(luò)中的任何資源請求消息都進行應(yīng)答的節(jié)點,但這類節(jié)點只提供非法資源的下載,例如病毒,木馬等。當(dāng)一個節(jié)點收到一個非法資源的應(yīng)答時,將會對發(fā)出非法資源應(yīng)答的節(jié)點的信譽值減1。這種機制的結(jié)果是:兢兢業(yè)業(yè)提供正常資源下載的節(jié)點的信譽值將會隨著時間的推進趨于正無窮大,而那些發(fā)出虛假資源應(yīng)答消息,提供非法資源下載的節(jié)點的信譽值將會趨于負無窮大。圖3-1資源請求消息和應(yīng)答消息的傳播3.4小結(jié)本章是對一個簡單的信任模型的思想的闡述,該協(xié)議比較簡單,它的主要意義還是在于展示PeerSim的流程,測試PeerSim性能,但其可以進行擴充,以完成更加復(fù)雜的功能。

第四章信任模型協(xié)議在PeerSim中的仿真實現(xiàn)本章將以代碼為主線,講述如何將上一章的這個簡單的信任協(xié)議寫成Java代碼,內(nèi)容會涉及到各種細節(jié)問題。4.1仿真前的必要準(zhǔn)備首先在sourceforge上下載PeerSim原始文件,最原始的PeerSim仿真器僅僅是一些文本代碼和jar包的集合,要想方便的向PeerSim中添加自己的類,最好先將它導(dǎo)入到eclipse中去,通過實踐,我總結(jié)出導(dǎo)入過程必須包括以下幾步:新建一個java工程,可以取名為PeerSim;將下載的文件中的src中的文件拷貝到項目的src目錄中;拷貝配置文件(例如config-example1.txt)到項目目錄;在eclipse中刷新,在左側(cè)找到config-example1.txt點擊右鍵runasrunconfigrations;新建一個javaapplication。MainClass中選擇peersim.Simulator,arguments中填寫配置文件的路徑(例如D:\java\PeerSim\config-example1.txt);在eclipse選中工程,右鍵PropertiesJavaBuildPathLibrariesAddExternalJars,添加在peersim-1.0.5文件夾下的四個Jar包;在左側(cè)找到config-example1.txt點擊右鍵runasrunconfigurationsclasspath刪去默認路徑,將peersim-1.0.5文件夾下的四個Jar包的路徑添加進來此時就可以成功運行了,如果配置文件選為peersim-1.0.5文件夾中自帶的config-example1.txt,則一個簡單的求各節(jié)點平均值的仿真結(jié)果就會出現(xiàn)在eclipse中。4.2PeerSim仿真流程在一次仿真中所遇到的代碼可分為PeerSim內(nèi)核代碼和用戶代碼,內(nèi)核代碼就是從網(wǎng)站上下載下來的原始文件夾中包含的代碼,用戶代碼是用戶自己編寫的協(xié)議代碼、控制代碼以及用戶自己定義的類,對于內(nèi)核代碼,我們只需大致了解其運行流程、了解內(nèi)核提供的接口以及如何使用內(nèi)核,圖4-1就是PeerSim內(nèi)核代碼的大致流程。載入配置文件是通過讀取先前設(shè)置的runconfigrationsarguments中的文件來達到的,在該仿真器中,外部的配置文件被讀入后組織成了TreeMap的形式,即以(鍵,鍵值)的形式組織,有一些專門的方法用來查找配置文件的具體項。檢測仿真模式是通過檢查配置文件來實現(xiàn)的,如果配置文件中包含simulation.cycles鍵,則模式為循環(huán)驅(qū)動模式,這個過程由peersim.cdsim.CDsimulator類中的isConfigurationCycleDriven()方法來具體實現(xiàn)的,事件驅(qū)動模式也以類似的方式通過檢測配置文件中是否含有simulation.endtime鍵來判斷。在明確了仿真模式后,就調(diào)用該模式的仿真引擎,在本次實習(xí)中用到的是循環(huán)驅(qū)動模式,所以接下來就調(diào)用CDSimulator.nextExperiment()方法。各仿真引擎在運行的第一步就是讀取配置文件中設(shè)置的循環(huán)次數(shù)。接下來將會初始化網(wǎng)絡(luò)中的節(jié)點,即調(diào)用Network.reset(),在本次實習(xí)中,用到的是PeerSim內(nèi)核中自帶的節(jié)點模型,也就是peersim.core.GeneralNode類,下面是Network.reset()的代碼: if(prototype!=null) { //notfirstexperiment while(len>0)remove();//thisistocallonKillonallnodes prototype=null; node=null; } len=Configuration.getInt(PAR_SIZE); intmaxlen=Configuration.getInt(PAR_MAXSIZE,len); if(maxlen<len)thrownewIllegalArgumentException( PAR_MAXSIZE+"islessthan"+PAR_SIZE); node=newNode[maxlen]; //creatingprototypenode Nodetmp=null; if(!Configuration.contains(PAR_NODE)) { System.err.println( "Network:nonodedefined,usingGeneralNode"); tmp=newGeneralNode(""); } else { tmp=(Node)Configuration.getInstance(PAR_NODE); } prototype=tmp; prototype.setIndex(-1); //cloningthenodes if(len>0) { for(inti=0;i<len;++i) { node[i]=(Node)prototype.clone(); node[i].setIndex(i); } }節(jié)點的初始化過程是首先建立一個prototype即原型節(jié)點,然后依照配置文件中指定的個數(shù),克隆出len個節(jié)點,克隆出來的節(jié)點除了ID外一切與原型節(jié)點相同??寺∵^程如下:for(inti=0;i<len;++i){node[i]=(Node)prototype.clone();node[i].setIndex(i);}其中l(wèi)en是通過語句len=Configuration.getInt(PAR_SIZE);從配置文件中讀入的。原型節(jié)點是通過tmp=newGeneralNode("");創(chuàng)建的過程是按配置文件中的說明,找到相應(yīng)的協(xié)議類,將該類實例化,然后將該實例存儲到原型節(jié)點的協(xié)議數(shù)組中去,原型節(jié)點的創(chuàng)建代碼如下:

圖4-1PeerSim內(nèi)核代碼的流程

publicGeneralNode(Stringprefix){ String[]names=Configuration.getNames(PAR_PROT); CommonState.setNode(this); ID=nextID(); protocol=newProtocol[names.length]; for(inti=0;i<names.length;i++){ CommonState.setPid(i); Protocolp=(Protocol) Configuration.getInstance(names[i]); protocol[i]=p; }}其中String[]names=Configuration.getNames(PAR_PROT)是從配置文件中讀取所有協(xié)議的名字,在本次信任模型仿真中,用到的配置文件是3.1節(jié)前面列出的配置文件,則讀取的names字符串?dāng)?shù)組中包含protocol.lnk和protocol.trust兩個值。代碼中的protocol是一個Protocol類型的數(shù)組。Protocolp=(Protocol)Configuration.getInstance(names[i])這一句完成的功能是在配置文件中查找names[i]鍵所對應(yīng)的類,調(diào)用該類的構(gòu)造方法,返回一個該類的實例。在本次仿真中names[1]是protocol.trust,在配置文件中該鍵對應(yīng)的鍵值為pdSim.TrustManage,調(diào)用pdSim.TrustManage類的構(gòu)造方法,將返回的對象賦給p。調(diào)用Configuration.getInstance(names[i])的效果就是返回了一個names[i]對應(yīng)的協(xié)議實例,并將該實例賦予p,隨后p又將被賦予該節(jié)點的協(xié)議數(shù)組的第i個元素。在PeerSim中,所有實現(xiàn)了Control接口的類都有一個execute()方法,PeerSim仿真引擎就是通過調(diào)用它來執(zhí)行該控制組件的。所有實現(xiàn)了CDProtocol接口的類都有一個nextCycle()方法,仿真引擎通過調(diào)用它來執(zhí)行該協(xié)議的動作。在CDSimulator類的nextExperiment()方法中各個控制組件被依次調(diào)用,代碼如下:for(intj=0;j<controls.length;++j){ if(ctrlSchedules[j].active(i)) stop=stop||controls[j].execute(); }其中controls是控制組件數(shù)組,在之前已將control.shf和control.obs的實例填入,這兩個控制組件在配置文件中是可以看到的,而該數(shù)組還有一個元素,也就是controls[2],它被初始化為FullNextCycle的實例,這些細節(jié)是通過CDSimulator類中的loadControls()方法實現(xiàn)的。每個execute()方法都將返回一個布爾型變量,規(guī)則為:如果某個控制組件將終止循環(huán),則它返回true,否則返回false,在上面的代碼中stop是一個布爾型變量,被初始化成false如果某個控制組件返回了true,則stop就會變成true,在后面的代碼中通過檢測stop的值就可判定是否有控制組件終止循環(huán)。FullNextCycle類下的execute()方法將依次調(diào)用每個節(jié)點的每個協(xié)議的nextCycle()方法。4.3信任協(xié)議TrustManagePdSim.TrustManage類實現(xiàn)CDProtocol接口,所以它是一個協(xié)議組件,它被填充到節(jié)點的協(xié)議數(shù)組的第二個元素(protocol[1]),這個協(xié)議負責(zé)管理節(jié)點的資源(Content)、信譽值(Trust)以及完成資源下載,相互評價等動作。下面將結(jié)合代碼詳細講述。每個TrustManage實例都擁有PeerBehaviourType、Content、QueryContent、MessageQueue、ResponseMessageQueue、Trust、TheNode等變量。PeerBehaviourType是一個整型變量0代表goodpeer,1代表badpeer;Content是一個Vector型變量,該變量在初始化時會被初始化組件InitContent填充100個0-100之間的整型隨機數(shù)(可能重復(fù)),每個數(shù)代表一個該節(jié)點擁有的資源;QueryContent也是一個Vector型變量,該變量存有在Content中沒有出現(xiàn)的0-100之間的數(shù)字,代表了該節(jié)點沒有的資源,也就是需要向其他節(jié)點請求的資源,它的內(nèi)容也是由InitConent填充的;MessageQueue是一個Vector型變量,它用于保存本節(jié)點收到的所有消息;ResponseMessageQueue是一個Vector變量,用于保存MessageQueue中類型為PAR_RESPOND的消息也就是應(yīng)答消息;Trust是一個整型變量,是本節(jié)點的信譽值,信譽值在兩種情況下會改變,當(dāng)一個節(jié)點的資源被另一節(jié)點成功下載了一次,該節(jié)點的信譽值加1,當(dāng)一個惡意節(jié)點發(fā)出一個非法資源應(yīng)答消息,該消息被另一個節(jié)點收到后,惡意節(jié)點的信譽值減1;TheNode是一個Node類型的引用,它指向了擁有該協(xié)議實例的節(jié)點。這些變量都在TrustManage的構(gòu)造方法被調(diào)用時完成初始化。當(dāng)TrustManage類的NextCycle方法被調(diào)用時本節(jié)點首先向所有鄰居節(jié)點發(fā)送QueryContent中的資源的請求消息,具體代碼如下:IntegerContentr=(Integer)QueryContent.elementAt(CommonState.r.nextInt(QueryContent.size())); for(inti=0;i<size;i++)//向所有鄰居節(jié)點發(fā)送資源請求消息 { longdestination1; neighbour1=linkable.getNeighbor(i); destination1=neighbour1.getID(); MessagequeryMsg=newMessage(source,destination1,3,PAR_QUERY,CValue()); Send(queryMsg); }其中的linkable是IdleProtocol協(xié)議的實例,它管理著本節(jié)點的鄰居節(jié)點,例如,鄰居節(jié)點的個數(shù)可由size=linkable.degree()得到,第i個鄰居節(jié)點可由neighbour1=linkable.getNeighbor(i)得到。之后處理消息隊列(MessageQueue),依次取出消息隊列中的每一個消息,首先判斷消息的類型,如果是一個資源請求消息,則好節(jié)點(goodpeer)會檢查自己的Content向量,如果有該消息中請求的資源,則發(fā)回一個應(yīng)答消息,如果沒有該資源,則將消息的TTL值減1后向所有鄰居節(jié)點發(fā)送,惡意節(jié)點則會直接發(fā)回一個虛假的應(yīng)答消息;如果該消息是一個應(yīng)答消息,則將該消息添加到ResponseMessageQueue中去。然后處理應(yīng)答消息隊列(ResponseMessageQueue),依次取出每一個應(yīng)答消息,首先判斷應(yīng)答消息中包含的資源本節(jié)點是否已經(jīng)擁有,如果該消息正是對沒有的資源(QueryContent中的資源)的應(yīng)答,則首先檢查發(fā)出應(yīng)答節(jié)點的Trust值,如果高于閥值,則下載該節(jié)點的資源,同時將該節(jié)點的Trust值加1,如果低于閥值,則以一定的概率下載該節(jié)點的資源,同樣在下載完成后將該節(jié)點的Trust值加1。如果發(fā)現(xiàn)應(yīng)答消息中包含的資源是非法資源(-1代表非法資源),則將發(fā)出該消息的節(jié)點的Trust值減1。在處理完兩個消息隊列后,將它們清空。4.4Observer類PdSim.Observer類用于在仿真循環(huán)結(jié)束后保存各種感興趣數(shù)據(jù),主要會保存圖4-2BadPeerTrustValue.dat中數(shù)據(jù)的繪圖結(jié)果以下幾個數(shù)據(jù)文件:BadPeerNumCount.dat:包含兩個值:總的節(jié)點個數(shù)和壞節(jié)點的個數(shù);BadPeerTrustValue.dat:記錄每一個壞節(jié)點的Trust值,形式為(節(jié)點ID,Trust值);GoodPeerTrustValue.dat:記錄每一個好節(jié)點的Trust值,形式為(節(jié)點ID,Trust值);MaliceAttackCount.dat:記錄每個節(jié)點受到惡意資源應(yīng)答的次數(shù),形式為:(節(jié)點ID,受攻擊次數(shù));TrustMonitor.dat:記錄每個節(jié)點的Trust值;AverageTrustValuePerCycle.dat::記錄每次循環(huán)結(jié)束后所有節(jié)點的平均Trust值;BadPeerAverageTrustValuePerCycle.dat:記錄每次循環(huán)結(jié)束后所有壞節(jié)點的平均Trust值;GoodPeerAverageTrustValuePerCycle.dat:記錄每次循環(huán)結(jié)束后所有好節(jié)點的平均Trust值;PeerSuccessfulDownloadPercentage.dat:記錄在30輪循環(huán)過后,每個節(jié)點的成功下載占所有下載次數(shù)的百分比。這些保存有實驗數(shù)據(jù)的文件將保存在TrustModelSimulation\data文件夾下。4.5仿真數(shù)據(jù)分析本節(jié)將分析在上一節(jié)中提到的9個數(shù)據(jù)文件中的數(shù)據(jù),對其繪圖并逐一分析。仿真實驗是在一臺擁有2GB內(nèi)存,CUP為AMD5000+的臺式機上進行的。從圖4-2可以看出初始設(shè)置為0的Trust值在經(jīng)歷了30輪的循環(huán)后,各節(jié)點的的值已經(jīng)變得參差不齊,最大的Trust值達到了120,而最小的僅為1,而在Trust值為20附近聚集了最多的節(jié)點。圖4-2對GoodPeerTrustValue.dat進行繪圖的結(jié)果圖4-3對BadPeerTrustValue.dat進行繪圖的結(jié)果從圖4-3可以看出,在經(jīng)歷30輪循環(huán)后,壞節(jié)點的Trust值變得非常的小,而且變化范圍很大,從-1000到-10000都有值分布,由于壞節(jié)點的唯一任務(wù)就是發(fā)送非法資源應(yīng)答,所以它的Trust值僅可能下降。圖4-4MaliceAttackCount.dat的繪圖結(jié)果圖4-4表明的是在30輪循環(huán)結(jié)束后,各個節(jié)點收到的非法資源應(yīng)答的次數(shù),由于ID為0-499的節(jié)點為壞節(jié)點,他們不會對非法資源應(yīng)答作出反應(yīng),所以它們的MaliceAttackCount值為0。圖4-5AverageTrustValuePerCycle.dat的繪圖結(jié)果圖4-5表明隨著循環(huán)輪數(shù)的增加,節(jié)點的平均Trust值會從0下降到-450左右,造成這種現(xiàn)象的原因是壞節(jié)點的Trust值增加的速率大于好節(jié)點的Trust值上升的速度。圖4-6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論