P2P仿真实习报告_第1页
P2P仿真实习报告_第2页
P2P仿真实习报告_第3页
P2P仿真实习报告_第4页
P2P仿真实习报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西安电子科技大学一种典型分布式对等网络的设计与模拟姓名:王涛指导人:冯景瑜完成时间:2010-8-16

目录第一章绪论 第一章绪论1.1课题背景P2P的研究热度呈逐年增长的趋势,作为一种完全分布的计算模型,可以脱离中央服务器实现对等节点间的直接通信,从而充分利用每个网络节点自身的资源,实现整个网络计算资源的充分利用和信息资源的高效共享。当前P2P的研究围绕着一系列的算法,包括构建高效P2P网络拓扑的分布式协议,无结构P2P网络的搜索算法,用以应对搭便车现象(FreeRide)的激励机制等等。由于P2P网络的迅速发展,网络节点数巨大,已经不能靠将这些算法应用于一个已经成熟应用的P2P网络去验证算法的性能。应此,P2P网络中的算法和协议通常在仿真中验证,仿真器根据网络模型构建并模仿节点的行为以及网络的传输模式等等。1.2课题意义作为在现实中已经广泛使用的技术,P2P已经累积了大量需要亟待解决的问题。搭便车者(FreeRider)现象的出现,在很大程度上影响着P2P系统的继续推广。在分布式计算P2P系统中,如果没有结点的积极参与,分布式的群集功能就无法体现出来;流媒体P2P系统中,如果大量结点断绝上传服务,那么整个网络的缓存信息就不足以使得画面流畅。同样问题也出现在文件分享型P2P系统中,搭便车者极大的打击着结点分享的积极性,甚至能够损害网络原有拓扑稳定。分析搭便车对网络的影响,检验激励机制的稳定性和可靠性,都需要对P2P节点的行为进行专门的模拟测试。而且,安全问题越来越受到重视。2002年日本一种病毒在Winny这种P2P网络中传播,造成大范围的用户私人信息泄露,Winny的作者也被刑拘。这一事件进一步引起了对P2P网络安全的关注。据最新网络安全研究表明,蠕虫病毒能够在具有小世界特性的P2P网络中更加快速的传播。所以,P2P网络的安全研究势在必行,而一个能够模拟真实攻防环境的平台可以极大的辅助安全策略的制定。P2P网络还有其他很多原因导致必须结合P2P网络的独有特性,为P2P网络量身定做一个仿真平台。比如不同的P2P系统具有不同的应用场合,每一种应用都有单独的技术规范和检验标准。如果没有统一的仿真环境,想要添加新的应用模拟平台就变得不容易,而且仿真的结果也没有可比性,因为不能保证试验是在统一的参数环境下的进行的。1.3课题目标本次课题的目标是:找到一种通用的P2P网络的仿真器,它必须有良好的可扩展性,支持较多的节点,有较高的运行效率;该仿真器必须使用Java编写,这样就可将很多现成的协议移植进仿真器,也可便于与其他研究人员交流代码;自行设计一种典型的基于信任模型的P2P协议,编写代码并调试使其在仿真器上运行,保存运行数据。

第二章PeerSim简介本章是对PeerSim这一P2P专用网络仿真工具的原理和流程的介绍,PeerSim是在本次实习调研阶段发现的P2P仿真软件,由于它很好地满足了课题要求,所以实习接下来的内容都是围绕对他的研究展开的。2.1PeerSim概述PeerSim是一个模拟P2POverlay网络的软件,支持结构化和非结构化P2P网络模拟。PeerSim有两种模拟方式,Cycle-based和Event-driven。Event-driven模式相对精确,Eycle-based模式缺少传输层的模拟而且不能起到并发控制的作用,但占用资源少以适合于大规模的模拟,根据官方所发表的一篇最新论文,在拥有4GB内存的情况下,Event-driven模式目前最多支持十万节点级别,而Cycle-based模式则支持千万个节点级别。PeerSim是一个极易扩展的仿真环境,支持动态网络的仿真,协议需要执行特定的PeerSimAPI,但是只需很少的努力,就可以发展成为真正的执行。在指定的参数空间进行检测也是被支持的。PeerSim开始时只是被当作一项特定研究的工具,而在它获得LGPL开源许可,并被发布以来,它吸引了很多独立的研究团体,到目前为止,PeerSim已经被下载了超过12000次,在150篇论文中被引用,而其中只有很少一部分引用是来自PeerSim的作者。2.2Cycle-based模式仿真Cycle-based模型是一个简化的模型,拥有更好的伸缩性及性能,但是Cycle-based模型缺少对传输层的仿真和并行处理,节点之间是直接通信的,仿真核心以一定的顺序周期性地给以节点控制。在运行时,可以进行任意的操作,如调用其它对象的方法并执行一些计算。PeerSim鼓励基于接口的模块化编程,每一个组件都能被其它实现了相同接口的组件代替,一般的仿真过程如下:选择网络大小(即节点数量);选择要实验的一个或多个协议并进行初始化;选择一个或多个Control对象来监视感兴趣的属性,并在仿真时修改一些参数(比如,网络大小,协议的内部状态,等等);根据配置文件,调用Simulator类运行仿真。在仿真时创建的对象都是实现了一个或多个接口的类的实例,主要的接口如表2-1所示。表2-1Cycle-based下的主要接口NodeP2P网络是由节点组成的,节点是协议的容器。Node接口提供了对节点所包含的协议的访问方法,并为节点提供了固定的ID。CDProtocol这是一个特定的协议,被设计用来在Cycle-based模型中运行,它只定义了在每一个周期中要运行的操作。Linkable一般都由协议来实现,这个接口为其它协议提供了访问邻居节点集合的服务,节点间相同的Linkable协议类的实例定义了一个覆盖网络。Control实现了这个接口的类可以在仿真期间的某个时间点调度执行,这些类一般用于观察或修改仿真过程。图2-1Cycle-based下的调度时序Cycle-based仿真的生命周期是这样的:读取配置文件(通过命令行参数传递进来),然后仿真器初始化网络中的节点和节点中的协议,每个节点都拥有相同的协议栈。节点和协议的实例是通过克隆来创建的,只有一个原型是通过构造方法创建,其它的节点和协议都是从这个原型中克隆而来。基于这个原因,协议类中Clone()方法的实现是很重要的。初始化操作,设置每个协议的初始状态。初始化阶段是由Control对象控制运行的,仅在实验开始时运行一次。在配置文件中,初始化的组件可以由init前缀识别,在下面讨论的Initializer对象也是Controls,但为了标记其功能以区别于一般的Control对象,它被配置用来在初始阶段运行。在初始化完成后,Cycle-based引擎在每一个周期中调用所有组件(Protocols和Controls)一次,直到完成了指定的周期数,或者某个组件决定终止仿真为止。在PeerSim中每一个对象(Controls和Protocols)都被赋以一个Scheduler对象,它定义了什么时候本组件将会被执行。在默认情况下,所有对象都会在每个周期中运行。但我们也可以配置一个Protocol或Control只在某些特定的周期中运行,也可以在每一个周期中指定组件的执行顺序。图2-2配置文件图2-1展示了对Controls和Protocols的调度,其中C代表Control而P代表一个协议。图下方的数字代表PeerSim的周期,在最后一个周期后,可以运行一个Control来获取最后的快照(Snapshot)。在一个Control收集数据时,数据将会被格式化并发送到标准输出或重定向到一个文件以进行后续的处理。配置文件只是一个普通的ASCII文本,本质上就是java.util.Properties,以#开头的行代表注释。配置文件的信息将以键值对的形式被程序读入,如在图2-2所示的配置文件中,random.seed就是一个键,它的值为1234567890。仿真器在初始化时,在需要初始化随机数产生器时,就会在配置文件中搜索random.seed并读取它的值,用它的值初始化随机数生成器。再如,当初始化节点时,需要给节点装入协议实例,具体去装入哪个类的实例,就必须在配置文件中查找,例如当节点有一个名字叫avg的协议时,配置文件就查找protocol.avg键的值,就能找到实现了这个协议的类。总的来说,配置文件就是由用户设置的参数以及用户自定义的类的路径的集合。2.3小结要利用PeerSim循环驱动模式进行仿真,首先必须理解配置文件的作用,要清楚协议组件和控制组件的作用以及被调度的时机。在循环驱动模式下,一些实际P2P系统中的细节被忽略,带来的回报是支持更多的节点以及更快的执行速度。

第三章基于信任模型的文件共享P2P协议本章主要讲述一个典型的基于信任模型的P2P协议的思想以及运行流程,它的配置文件的内容如下:#设置伪随机数生成器的种子random.seed1234567890#设置循环次数为30次simulation.cycles30#在每轮循环后对网络节点进行洗牌的控制组件control.shfShuffle#设置节点个数为5000network.size5000#节点中的Linkable协议设为IdleProtocolprotocol.lnkIdleProtocol#节点中的第二层协议设为pdSim.TrustManage并设置相关参数protocol.trustpdSim.TrustManageprotocol.trust.linkablelnkinit.con.badPeerPercentage0.1#对节点进行连线以构造拓扑的初始化组件WireKOut及相关参数的设定init.rndWireKOtocollnkinit.rnd.k20#设置负责填充节点资源向量的pdSim.InitContent为初始化组件init.conpdSim.InitCtocoltrust#设置初始化组件的调度顺序,先调度init.rnd再调度init.coninclude.initrndcon#设置一个在30轮循环过后观察数据的控制组件control.obspdSim.Otocoltrust3.1节点模型在本协议中,节点是由一个类实现的,当被实例化后,每个节点将拥有独立的内存空间和协议栈,节点由ID和INDEX两个量来标识,其中ID是在节点初始化后不会发生变化的,所以在任何时候ID都可以唯一地标识一个节点,它可以被理解为代表了现实中节点的IP地址,而INDEX则是和网络动态演进相关的一个标识,当仿真一轮结束后,执行“洗牌”(Shuffle)动作后,节点的INDEX可能会变化。当在网络中查找某个节点时,总是按照INDEX遍历所有节点,以搜寻ID为某个特定值的节点。在PeerSim中节点在默认情况下使用peersim.core.GeneralNode类,当然,用户也可以定义自己的节点类,做法是编写一个实现peersim.core.Node接口的类,并在配置文件中加以说明。节点在网络中的动作是由协议来定义的,节点在初始化时,将按照配置文件装入指定协议的实例,每个节点的每个协议实例都拥有相互独立的内存空间。在本例中,每个节点装入了两个协议分别是负责管理拓扑的lnk协议和负责管理节点相互信任的trust协议,它们是从配置文件的protocol.lnk和protocol.trust两个键读入相应的类的。3.2拓扑模型在PeerSim中,当节点建立起来以后,他们之间是没有连接的,也就是说它们仅仅是孤立的节点,在本协议中,拓扑是由peersim.dynamics.WireKOut类来建立的,在配置文件中可以看到,它的键名为为init.rnd,init表明该类是一个初始化组块。它的主要作用为,为每个节点连接K个邻居节点,K的值是读取配置文件中init.rnd.k的键值得到的,在本协议中,这个值是20,即每个节点有二十个邻居节点。可以看到配置文件中关于拓扑的描述中还有tocollnk,这表明WireKOut是通过节点中的lnk协议的实例来建立连接的,具体做法为:向IdleProtocol协议实例的邻居节点数组中添加相应的节点,而IdleProtocol协议正是节点中负责维护邻居节点数组的协议。每个节点的IdleProtocol协议实例中的邻居节点数组中存有该节点的所有邻居节点。3.3信任模型思想在P2P网络中,由于任何节点都是可以加入的,同时也为网络中的其他节点提供的转发服务,从网络攻击的角度来看,一个“恶意”节点故意将正常的数据替换成伪造的数据,转发的整个P2P网络中,完全可以欺骗其他P2P的节点而不被发现。P2P网络中由于缺乏统一的管理,在发现伪造的数据后,不能控制P2P节点不下载伪造的数据或者阻止P2P网络中伪造数据的传输,从而导致伪造的数据在P2P网络中肆意传播。而且会处于完全失控状态。P2P使得网络热门资源能够在网络中迅速传播,这给病毒和恶意软件提供了传播的捷径。当然,P2P软件本身有可能是无害的,但共享的文件中却可能因为存在漏洞而被利用。流行的RMVB格式存在一个广告弹出的漏洞,这被许多不法分子所利用作散布不良信息的渠道。热门影片的用户关注程度总是比较高,不法分子在影片中携带弹出式广告,使得有害信息在P2P网络上爆炸式地传播,远远超过了在传统C/S模式下的传播速度。基于信任模型的P2P协议认为,信任是主体对客体特定行为的主观可能性预期,取决于经验并随着客体行为的结果变化而不断修正,在本次仿真的文件共享型P2P网络中,节点之间互相评价,评价的依据为该节点提供的正常的下载次数。每个节点都拥有一些资源,当节点需要一个资源时,它向所有邻居节点发送资源请求消息,当一个节点收到资源请求消息后,它首先检查自己是否拥有请求的资源,如果有,则发回一个资源应答消息,如果没有,则将消息的TTL值减1后向自己的所有邻居节点转发。一个节点在收到一条资源应答消息后,首先检查自己是否已经拥有该资源,如果该资源应答消息正是自己所需要的资源,则该节点将首先检查发出应答的节点的信誉值,当该值高于阀值时就下载该节点上的资源,若该值低于阀值,则以一个较小的概率下载该节点上的资源,当下载成功时,将给予提供下载的节点进行评价,一般是将其信誉值加一。恶意节点是对看到的网络中的任何资源请求消息都进行应答的节点,但这类节点只提供非法资源的下载,例如病毒,木马等。当一个节点收到一个非法资源的应答时,将会对发出非法资源应答的节点的信誉值减1。这种机制的结果是:兢兢业业提供正常资源下载的节点的信誉值将会随着时间的推进趋于正无穷大,而那些发出虚假资源应答消息,提供非法资源下载的节点的信誉值将会趋于负无穷大。图3-1资源请求消息和应答消息的传播3.4小结本章是对一个简单的信任模型的思想的阐述,该协议比较简单,它的主要意义还是在于展示PeerSim的流程,测试PeerSim性能,但其可以进行扩充,以完成更加复杂的功能。

第四章信任模型协议在PeerSim中的仿真实现本章将以代码为主线,讲述如何将上一章的这个简单的信任协议写成Java代码,内容会涉及到各种细节问题。4.1仿真前的必要准备首先在sourceforge上下载PeerSim原始文件,最原始的PeerSim仿真器仅仅是一些文本代码和jar包的集合,要想方便的向PeerSim中添加自己的类,最好先将它导入到eclipse中去,通过实践,我总结出导入过程必须包括以下几步:新建一个java工程,可以取名为PeerSim;将下载的文件中的src中的文件拷贝到项目的src目录中;拷贝配置文件(例如config-example1.txt)到项目目录;在eclipse中刷新,在左侧找到config-example1.txt点击右键runasrunconfigrations;新建一个javaapplication。MainClass中选择peersim.Simulator,arguments中填写配置文件的路径(例如D:\java\PeerSim\config-example1.txt);在eclipse选中工程,右键PropertiesJavaBuildPathLibrariesAddExternalJars,添加在peersim-1.0.5文件夹下的四个Jar包;在左侧找到config-example1.txt点击右键runasrunconfigurationsclasspath删去默认路径,将peersim-1.0.5文件夹下的四个Jar包的路径添加进来此时就可以成功运行了,如果配置文件选为peersim-1.0.5文件夹中自带的config-example1.txt,则一个简单的求各节点平均值的仿真结果就会出现在eclipse中。4.2PeerSim仿真流程在一次仿真中所遇到的代码可分为PeerSim内核代码和用户代码,内核代码就是从网站上下载下来的原始文件夹中包含的代码,用户代码是用户自己编写的协议代码、控制代码以及用户自己定义的类,对于内核代码,我们只需大致了解其运行流程、了解内核提供的接口以及如何使用内核,图4-1就是PeerSim内核代码的大致流程。载入配置文件是通过读取先前设置的runconfigrationsarguments中的文件来达到的,在该仿真器中,外部的配置文件被读入后组织成了TreeMap的形式,即以(键,键值)的形式组织,有一些专门的方法用来查找配置文件的具体项。检测仿真模式是通过检查配置文件来实现的,如果配置文件中包含simulation.cycles键,则模式为循环驱动模式,这个过程由peersim.cdsim.CDsimulator类中的isConfigurationCycleDriven()方法来具体实现的,事件驱动模式也以类似的方式通过检测配置文件中是否含有simulation.endtime键来判断。在明确了仿真模式后,就调用该模式的仿真引擎,在本次实习中用到的是循环驱动模式,所以接下来就调用CDSimulator.nextExperiment()方法。各仿真引擎在运行的第一步就是读取配置文件中设置的循环次数。接下来将会初始化网络中的节点,即调用Network.reset(),在本次实习中,用到的是PeerSim内核中自带的节点模型,也就是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); } }节点的初始化过程是首先建立一个prototype即原型节点,然后依照配置文件中指定的个数,克隆出len个节点,克隆出来的节点除了ID外一切与原型节点相同。克隆过程如下:for(inti=0;i<len;++i){node[i]=(Node)prototype.clone();node[i].setIndex(i);}其中len是通过语句len=Configuration.getInt(PAR_SIZE);从配置文件中读入的。原型节点是通过tmp=newGeneralNode("");创建的过程是按配置文件中的说明,找到相应的协议类,将该类实例化,然后将该实例存储到原型节点的协议数组中去,原型节点的创建代码如下:

图4-1PeerSim内核代码的流程

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)是从配置文件中读取所有协议的名字,在本次信任模型仿真中,用到的配置文件是3.1节前面列出的配置文件,则读取的names字符串数组中包含protocol.lnk和protocol.trust两个值。代码中的protocol是一个Protocol类型的数组。Protocolp=(Protocol)Configuration.getInstance(names[i])这一句完成的功能是在配置文件中查找names[i]键所对应的类,调用该类的构造方法,返回一个该类的实例。在本次仿真中names[1]是protocol.trust,在配置文件中该键对应的键值为pdSim.TrustManage,调用pdSim.TrustManage类的构造方法,将返回的对象赋给p。调用Configuration.getInstance(names[i])的效果就是返回了一个names[i]对应的协议实例,并将该实例赋予p,随后p又将被赋予该节点的协议数组的第i个元素。在PeerSim中,所有实现了Control接口的类都有一个execute()方法,PeerSim仿真引擎就是通过调用它来执行该控制组件的。所有实现了CDProtocol接口的类都有一个nextCycle()方法,仿真引擎通过调用它来执行该协议的动作。在CDSimulator类的nextExperiment()方法中各个控制组件被依次调用,代码如下:for(intj=0;j<controls.length;++j){ if(ctrlSchedules[j].active(i)) stop=stop||controls[j].execute(); }其中controls是控制组件数组,在之前已将control.shf和control.obs的实例填入,这两个控制组件在配置文件中是可以看到的,而该数组还有一个元素,也就是controls[2],它被初始化为FullNextCycle的实例,这些细节是通过CDSimulator类中的loadControls()方法实现的。每个execute()方法都将返回一个布尔型变量,规则为:如果某个控制组件将终止循环,则它返回true,否则返回false,在上面的代码中stop是一个布尔型变量,被初始化成false如果某个控制组件返回了true,则stop就会变成true,在后面的代码中通过检测stop的值就可判定是否有控制组件终止循环。FullNextCycle类下的execute()方法将依次调用每个节点的每个协议的nextCycle()方法。4.3信任协议TrustManagePdSim.TrustManage类实现CDProtocol接口,所以它是一个协议组件,它被填充到节点的协议数组的第二个元素(protocol[1]),这个协议负责管理节点的资源(Content)、信誉值(Trust)以及完成资源下载,相互评价等动作。下面将结合代码详细讲述。每个TrustManage实例都拥有PeerBehaviourType、Content、QueryContent、MessageQueue、ResponseMessageQueue、Trust、TheNode等变量。PeerBehaviourType是一个整型变量0代表goodpeer,1代表badpeer;Content是一个Vector型变量,该变量在初始化时会被初始化组件InitContent填充100个0-100之间的整型随机数(可能重复),每个数代表一个该节点拥有的资源;QueryContent也是一个Vector型变量,该变量存有在Content中没有出现的0-100之间的数字,代表了该节点没有的资源,也就是需要向其他节点请求的资源,它的内容也是由InitConent填充的;MessageQueue是一个Vector型变量,它用于保存本节点收到的所有消息;ResponseMessageQueue是一个Vector变量,用于保存MessageQueue中类型为PAR_RESPOND的消息也就是应答消息;Trust是一个整型变量,是本节点的信誉值,信誉值在两种情况下会改变,当一个节点的资源被另一节点成功下载了一次,该节点的信誉值加1,当一个恶意节点发出一个非法资源应答消息,该消息被另一个节点收到后,恶意节点的信誉值减1;TheNode是一个Node类型的引用,它指向了拥有该协议实例的节点。这些变量都在TrustManage的构造方法被调用时完成初始化。当TrustManage类的NextCycle方法被调用时本节点首先向所有邻居节点发送QueryContent中的资源的请求消息,具体代码如下:IntegerContentr=(Integer)QueryContent.elementAt(CommonState.r.nextInt(QueryContent.size())); for(inti=0;i<size;i++)//向所有邻居节点发送资源请求消息 { longdestination1; neighbour1=linkable.getNeighbor(i); destination1=neighbour1.getID(); MessagequeryMsg=newMessage(source,destination1,3,PAR_QUERY,CValue()); Send(queryMsg); }其中的linkable是IdleProtocol协议的实例,它管理着本节点的邻居节点,例如,邻居节点的个数可由size=linkable.degree()得到,第i个邻居节点可由neighbour1=linkable.getNeighbor(i)得到。之后处理消息队列(MessageQueue),依次取出消息队列中的每一个消息,首先判断消息的类型,如果是一个资源请求消息,则好节点(goodpeer)会检查自己的Content向量,如果有该消息中请求的资源,则发回一个应答消息,如果没有该资源,则将消息的TTL值减1后向所有邻居节点发送,恶意节点则会直接发回一个虚假的应答消息;如果该消息是一个应答消息,则将该消息添加到ResponseMessageQueue中去。然后处理应答消息队列(ResponseMessageQueue),依次取出每一个应答消息,首先判断应答消息中包含的资源本节点是否已经拥有,如果该消息正是对没有的资源(QueryContent中的资源)的应答,则首先检查发出应答节点的Trust值,如果高于阀值,则下载该节点的资源,同时将该节点的Trust值加1,如果低于阀值,则以一定的概率下载该节点的资源,同样在下载完成后将该节点的Trust值加1。如果发现应答消息中包含的资源是非法资源(-1代表非法资源),则将发出该消息的节点的Trust值减1。在处理完两个消息队列后,将它们清空。4.4Observer类PdSim.Observer类用于在仿真循环结束后保存各种感兴趣数据,主要会保存图4-2BadPeerTrustValue.dat中数据的绘图结果以下几个数据文件:BadPeerNumCount.dat:包含两个值:总的节点个数和坏节点的个数;BadPeerTrustValue.dat:记录每一个坏节点的Trust值,形式为(节点ID,Trust值);GoodPeerTrustValue.dat:记录每一个好节点的Trust值,形式为(节点ID,Trust值);MaliceAttackCount.dat:记录每个节点受到恶意资源应答的次数,形式为:(节点ID,受攻击次数);TrustMonitor.dat:记录每个节点的Trust值;AverageTrustValuePerCycle.dat::记录每次循环结束后所有节点的平均Trust值;BadPeerAverageTrustValuePerCycle.dat:记录每次循环结束后所有坏节点的平均Trust值;GoodPeerAverageTrustValuePerCycle.dat:记录每次循环结束后所有好节点的平均Trust值;PeerSuccessfulDownloadPercentage.dat:记录在30轮循环过后,每个节点的成功下载占所有下载次数的百分比。这些保存有实验数据的文件将保存在TrustModelSimulation\data文件夹下。4.5仿真数据分析本节将分析在上一节中提到的9个数据文件中的数据,对其绘图并逐一分析。仿真实验是在一台拥有2GB内存,CUP为AMD5000+的台式机上进行的。从图4-2可以看出初始设置为0的Trust值在经历了30轮的循环后,各节点的的值已经变得参差不齐,最大的Trust值达到了120,而最小的仅为1,而在Trust值为20附近聚集了最多的节点。图4-2对GoodPeerTrustValue.dat进行绘图的结果图4-3对BadPeerTrustValue.dat进行绘图的结果从图4-3可以看出,在经历30轮循环后,坏节点的Trust值变得非常的小,而且变化范围很大,从-1000到-10000都有值分布,由于坏节点的唯一任务就是发送非法资源应答,所以它的Trust值仅可能下降。图4-4MaliceAttackCount.dat的绘图结果图4-4表明的是在30轮循环结束后,各个节点收到的非法资源应答的次数,由于ID为0-499的节点为坏节点,他们不会对非法资源应答作出反应,所以它们的MaliceAttackCount值为0。图4-5AverageTrustValuePerCycle.dat的绘图结果图4-5表明随着循环轮数的增加,节点的平均Trust值会从0下降到-450左右,造成这种现象的原因是坏节点的Trust值增加的速率大于好节点的Trust值上升的速度。图4-6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论