版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第二章相关研究综述.2CCN设计目标和原则CCN的主要设计目标是更好地支持当今的主要应用:内容存取。只这一个目标就决定了CCN的体系结构不会是一个会话模型,而应该是一个以信息为中心的模型(兼顾资源共享式的通信)。另外,PARC的VanJacobson和UCLA的LixiaZhang教授等提出了设计CCN的6个原则[6]G.Carofiglio,L.Muscariello,andM.Gallo,Bandwidthandstoragesharingperformanceininformationcentricnetworking,ACMSigcommWorkshoponInformation-CentricNetworking(ICN)2011[6]G.Carofiglio,L.Muscariello,andM.Gallo,Bandwidthandstoragesharingperformanceininformationcentricnetworking,ACMSigcommWorkshoponInformation-CentricNetworking(ICN)2011这六个设计原则分别是:保留沙漏模型。这种“细腰”特性保证了互联网的迅猛增长,因为他允许下层和上层不断革新变化,在CCN设计中也保留了这一模型。考虑安全性。当今互联网的设计是没有考虑安全的,所有的安全都是事后增加的,这种修补式的安全,对互联网造成很大的负面影响。而CCN要把安全放在体系结构的设计中。保留端到端原则。端到端原则考虑系统性能和代价的均衡,一般分层系统的设计都应该考虑,CCN系统也继承了这一原则。流量自调节。流量均衡对一个稳定的网络运行是必不可少的。当今互联网的流量调节要依靠端的传输协议,网络本身的设计没有考虑。保留了路由和转发平面的分离。保证了最好的转发技术和路由技术并行发展。保证体系结构的中立,使得用户选择和竞争尽可能简单。2.3、CCN工作机制2.3.1、CCN节点结构 图2-2CCN节点结构CCN节点包括路由器和端接点,节点内部结构如上图所示。ContentStore相当于路由器中的缓冲存储器,缓存数据以备以后使用,采用的缓存策略为LRU或LFU。PendingInterestTable(PIT)的作用是存储已发送的数据请求或这些请求各自的到达接口。转发信息表FIB可以通过在节点间传播名字前缀公告建立,然后利用FIB中记录的信息转发兴趣包。ContentStore、PIT、FIB是CCN节点中三个最重要的组件。2.3.2、CCN包类型图2-3CCN包类型如图3-3所示CCN的包有兴趣包和数据包两种类型,兴趣包的名字由三个部分(component)组成,Nonce为随机数,用于检测重复的包并将其丢弃。数据包由签名、名字、签名信息和内容四个部分组成。CCN直接保护数据的安全,所有的内容都经过数字签名认证。名字部分与兴趣包相同,有三个component构成。签名信息中包含内容发布者公钥的摘要、时间标签和内容类型,其中公钥摘要用于获取密钥和内容鉴权,时间标签可作为确定失效时间的依据。2.3.3CCN包处理流程CCN通信由数据消费者驱动,数据可以进行块级传输,有两个包类型:Interest和Data,消费者广播Interest包,请求内容,监听节点如果有该内容则响应。兴趣包和数据包与位置无关,在一个广播介质上,如果有一个兴趣包请求,则其它对同一内容感兴趣的消费者可以共享该请求。兴趣包的Contentname是数据包的Contentname的前缀,则该数据包满足该请求。内容的名字是复杂的,内容的名字可以动态生成,即让不存在该应用请求内容的应用接收该兴趣包,而临时产生该内容。像现在的动态Web(静态内容和动态产生混合支持)。当一个包到达一个face,利用名字进行最长前缀匹配查找NOTEREF_Ref325901554\f\h⑥,有三个关键数据结构完成转发(FIB、内容缓存、PIT)。FIB类似于IP的FIB,但允许一列出口,而不限于一个。内容缓存可以尽可能长时间地缓存转发的包,以供其它消费者使用。PIT记录已经转发的兴趣包,为了让响应的数据包能到达其请求者。当响应兴趣的数据包利用PIT的某条目转发后或者超出时间设定,该条目被删除。当一个Interest包到达,首先匹配内容缓存(如果有,则响应并丢弃Interest),其次匹配PIT(如果有,则在PIT响应条目中增加Face,并丢弃Interest),最后匹配FIB(按照所有匹配的Face(除Interest到达Face)进行转发Interest,并存在PIT中记录)。如果没有匹配则丢弃。Data包的处理相对简单,当数据包到达时,先对数据包的ContentName字段进行最长前缀匹配,先在Contentstore中匹配(如果有,则丢弃),再在PIT中匹配条目,如果有,转发到请求者,然后缓存在Contentstore,如果没有匹配则丢弃。 图2-4兴趣包和数据包到达节点的数据流程图如图3-4所示CCN节点对兴趣包和数据包的处理流程,以兴趣包为例当Interest到达某个节点的face端口时,节点首先检查自己的contentstore中是否有与interest匹配的content,若有则返回content给请求节点;若没有则检查PIT中是否存有这个Interest的条目,若有则将这个请求接口记录到该条目中;若没有则检查FIB,若有记录这个Interest的条目,则根据转发接口将Interest转发出去,并将该Interest和转发出去的接口一起作为一个新条目加入PIT中;若没有则丢弃该Interest。图2-5CCN节点转发模型举例2.4CCN的研究热点缓存IP和CCN路由器都缓存数据包,不同的是,IP路由器在完成数据转发就会将存储的数据清空,即MRU策略,而CCN路由器能够重复使用数据,方便请求相同数据的用户。缓存在CCN中很重要,它可以帮助减少内容下载时延和网络带宽占用。NDN采用LRU或LFU替换策略来最大限度地存储重要的信息[7]V.Jacobson,D.K.Smetters,J.D.Thorntonetal.,“NetworkingNamedContent,”inproc.ofCoNEXT2009,Rome,Italy,pp.1-12,Dec.2009.[7]V.Jacobson,D.K.Smetters,J.D.Thorntonetal.,“NetworkingNamedContent,”inproc.ofCoNEXT2009,Rome,Italy,pp.1-12,Dec.2009.在NDN路由器中使用缓存来减少不必要带宽需求和初始服务器负载。主要考虑的问题有:(1)研究缓存替换政策研究表明LRU(least-recently-used)或者LFU(least-frequently-used)策略合适NDN路由器,同时也会研究更为简单的随机替换策略。(2)避免存储过时的数据采取让发布者为每个数据分配一个TTL的方法(DNS中采用)。(3)阻止缓存攻击(cachepollutionattacks)为了阻止这种攻击,路由器需要认证每一个数据签名,计划研究快速认证机制,减少攻击的成功率,且不需要对所有的不良签名进行检测。(4)抵御DDoS攻击在NDN中,对缓存进行DDoS攻击相较于IP困难很多,因为攻击者在没有收到兴趣包的前提下无法通过网络大量发送无用的数据。路由和转发为了显示CCN能够实现全球规模的部署,首先要解决的问题是可扩展的路由和线速的转发引擎。CCN长期部署关注的是路由可扩展性,互联网规模不断扩大,相应路由表大小呈指数增加,形成未来互联网可扩展路由“瓶颈”。下一代网络中理想的路由一定是规模可扩展的,随着网络规模的不断扩大能够自适应的路由。路由设计要解决的问题主要有两个:(1)如何用有限的状态路由无限的命名空间;(2)多路径转发策略。NDN工程组建议最初的部署,可以使用扩展的OSPF和BGP,用来支持名字前缀和多路径转发。至于转发,NDN采用的也是最长名字前缀匹配查找算法进行转发操作,虽然NDN的名字长度是变长的,且通常长于IP地址,但是利用无循环,状态可近似的bloomfilter也同样能够保证查找效率。Bloomfilter广泛用于网页存储、入侵检测和基于内容的路由,它是一种空间效率很高的随机数据结构,可用来判断地址前缀是否属于某个按前缀长度分类的前缀集合。目前针对转发平面,主要问题是:(1)可变长的分级名字的最长前缀匹配;(2)当路由协议重新计算或Interest/Data包到达后,FIB,PIT和内容存储的快速更新。(3)cache策略和存储管理。S.Arianfar等人第一个研究了内容路由器的设计问题,他们分析了怎样扩展今天的路由器,以及支持包级别的Cache问题。安全和隐私CCN保护内容安全的方法是让内容发布者对名字和内容进行联合签名而不是分别对名字或内容签名[8]MarkAin,ATechnicalReport,“AcademicDisseminationandExploitationofaClean-slateInternetworkingArchitecture:ThePublish-SubscribeInternetRoutingParadigm,”2008.。即所谓的“Authenticatingthelinkbetweennamesandcontent”。若发布者P发布内容时说N是内容C的名字,则可以这样表示:让P对N到C的映射签名。因此,内容是一个映射三元组M(NPC)=(NCSignP(NC))。用户请求任意的名字N,鉴权获得的内容和它与N的联系,无需预先知道内容C的唯一且自认证的标识,以及P的具体身份。保证了validity,provenance和relevance[8]MarkAin,ATechnicalReport,“AcademicDisseminationandExploitationofaClean-slateInternetworkingArchitecture:ThePublish-SubscribeInternetRoutingParadigm,”2008.安全关注的研究内容如下:(1)签名的效率为了对每个包进行签名和认证,需要在签名的产生、传输、认证和存储方面提高效率。RSA签名是可以借鉴的方法。还可以研究的技术有快速签名机制、Merkle哈希树、批认证机制等。NDN团队也在研究如何在多个包中传播签名元数据的技术。计算效率、带宽效率和认证成本都是研究签名机制要考虑的因素。(2)信任管理NDN的信任模型是端到端的,能够保护发布者到用户的安全。不同的用户和不同的内容对安全的需求是不一样,NDN可由用户根据具体的应用来判断所收到的内容是否安全,或者是否可信。信任管理可借鉴方法有分级的公钥体系架构(PKI)和PGP及两者的改进方法。SDSI/SPKI是NDN重点研究的模型。(3)网络安全和防御NDN的设计原理可以预防很多种类的网络攻击[9]PARCTechnicalReportNDN-0001“NamedDataNetworking(NDN)Project,”October2010.Availableat:。因为NDN包对内容“寻址”而不是终端设备,让针对特定目标主机的攻击难以实现。其次,NDN节点响应兴趣回应数据包,这种一个数据包对应一个用户兴趣请求的特点,使得攻击者不可能通过NDN网络大量发送未被请求的数据,防止了非法内容的传播。需要处理的两类攻击是InterestFloodingAttacks(类似[9]PARCTechnicalReportNDN-0001“NamedDataNetworking(NDN)Project,”October2010.Availableat:(4)内容保护和隐私NDN采用基于内容的方法来进行接入控制,常见的方法是内容加密。对内容的加密是端到端的,对网络层透明,由应用程序或支持库完成。NDN并不要求必须是安全的服务器才能接入网络,或者强制执行安全策略。但无论谁截获了经过的信息都是没用的,只有授权的用户才能解密。2.5CCN应用举例(1)实时通话应用。为了验证CCN网络不只是能较好地支持内容分发应用,也能支持实时会话等当前IP上使用的其它普遍功能,VanJacobson实现了一个基于CCN的实时会话应用——VoCCN。发现它和VoIP在性能和功能上是相当的,但更简单、更安全、可扩展性更强。但是,原型系统的环境是在局域网环境的概念证明系统(Proof-of-Concept),实际应用还需要进一步验证NOTEREF_Ref325899797\f\h②。(2)音频会议工具[10]ZhenkaiZhu,SenWang,XuYang,VanJacobson,LixiaZhang,“AudioConferenceToolOverNamedDataNetworking,October,2010.。为了推进CCN[10]ZhenkaiZhu,SenWang,XuYang,VanJacobson,LixiaZhang,“AudioConferenceToolOverNamedDataNetworking,October,2010.图2-6语音会议的模型图(3)全媒体交互(Omedia-CCN)。清华大学网络安全实验室一直从事覆盖网络的研究,开发了非结构化的P2P覆盖网CROS系统(CooperativelyOverlayRoutingService),能支持大规模网络节点,并在Planet-lab上进行了交互多媒体通信加速实验。同时开发了基于CROS系统的P2P流媒体系统CROSTV,对比研究了普通P2P流媒体系统和基于网络编码的P2P流媒体系统,研究基于网络编码的P2P流媒体数据传输、调度算法,以及通过降低系统的数据包冗余率,以改善播放质量和播放时延等性能。目前,清华大学网络安全实验室正在积极开展内容中心网络的研究,已经搭建了CCN实验环境,并迁移正在开发的面向社交媒体、交互媒体和流媒体的三媒一体Omedia全媒体通信系统到基于CCN网络的环境,试验环境如下图所示。实验环境中用三台运行ccnd服务的Linux系统作为CCN的网络节点,提供路由、转发和内容缓存功能。下一步将利用若干终端设备发布和订阅全媒体资源,以验证各方面性能。图2-7基于CCN传输的全媒体交互实验环境第三章基于CCNx开发平台的文件下载享实验3.1CCNx平台介绍CCNx平台是由美国PaloAlto研究中心开发的开源项目[11]CCNxproject,[12]谢希仁.计算机网络.第五版.电子工业出版社.2011年[11]CCNxproject,[12]谢希仁.计算机网络.第五版.电子工业出版社.2011年.12月致谢随着论文工作的结束,本科学习生活也即将成为过去。在此要衷心感谢毕设指导老师黄韬老师,从论文的选题到最后的完成,都少不了黄老师的悉心指导。同时也非常刘江师兄,刘师兄在我论文写作中给予了非常诚恳和宝贵的意见和建议。同时,感谢夏宇和李凌晗等同学,感谢你们在这段紧张充实的日子里给予我的帮助、支持和肯定。最后再次感谢所有关心和支持过我的人!附录/***@fileccnseqwriter.c*Streamsdatafromstdinintoccn**ACCNxcommand-lineutility.**Copyright(C)2010-2012PaloAltoResearchCenter,Inc.**Thisworkisfreesoftware;youcanredistributeitand/ormodifyitunder*thetermsoftheGNUGeneralPublicLicenseversion2aspublishedbythe*FreeSoftwareFoundation.*Thisworkisdistributedinthehopethatitwillbeuseful,butWITHOUTANY*WARRANTY;withouteventheimpliedwarrantyofMERCHANTABILITYor*FITNESSFORAPARTICULARPURPOSE.SeetheGNUGeneralPublicLicense*formoredetails.YoushouldhavereceivedacopyoftheGNUGeneralPublic*Licensealongwiththisprogram;ifnot,writetothe*FreeSoftwareFoundation,Inc.,51FranklinStreet,FifthFloor,*Boston,MA02110-1301,USA.*/#include<stdlib.h>#include<time.h>#include<errno.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<ccn/ccn.h>#include<ccn/uri.h>#include<ccn/seqwriter.h>typedefstructPACKED1//cpu_occupystruct{charname[20];unsignedintuser;unsignedintnice;unsignedintsystem;unsignedintidle;}CPU_OCCUPY;typedefstructPACKED2 //mem_occupystruct{charname[20];unsignedlongtotal;charname2[20];unsignedlongfree;}MEM_OCCUPY;typedefstructPACKED3 //netoccupystruct{charlo[20];unsignedlonglo_in;unsignedlonglo_out;chareth[20];unsignedlongeth_in;unsignedlongeth_out;}NET_OCCUPY;get_memoccupy(MEM_OCCUPY*mem) //readtotalmemoryandunusedmemoryfrommeminfo{FILE*fd;charbuff[256];MEM_OCCUPY*m;m=mem;fd=fopen("/proc/meminfo","r");fgets(buff,64,fd);sscanf(buff,"%s%lu",m->name,&m->total);fgets(buff,64,fd);sscanf(buff,"%s%lu",m->name2,&m->free);fclose(fd);}get_netoccupy(NET_OCCUPY*net)//getnetworkthroughput{FILE*fd;charbuff[256];inta,b,c,d,e,f,g,h,i,j,k,l,m,n;NET_OCCUPY*t;t=net;fd=fopen("/proc/net/dev","r");fgets(buff,128,fd);fgets(buff,128,fd);fgets(buff,128,fd);sscanf(buff,"%s%lu%d%d%d%d%d%d%d%lu%d%d%d%d%d%d%d",t->lo,&t->lo_in,&a,&b,&c,&d,&e,&f,&g,&t->lo_out,&h,&i,&j,&k,&l,&m,&n);fgets(buff,128,fd);sscanf(buff,"%s%lu%d%d%d%d%d%d%d%lu%d%d%d%d%d%d%d",t->eth,&t->eth_in,&a,&b,&c,&d,&e,&f,&g,&t->eth_out,&h,&i,&j,&k,&l,&m,&n);fclose(fd);}intcal_cpuoccupy(CPU_OCCUPY*o,CPU_OCCUPY*n) //calculatecpuusage{unsignedlongod,nd;unsignedlongid,sd;intcpu_use=0;od=(unsignedlong)(o->user+o->nice+o->system+o->idle); nd=(unsignedlong)(n->user+n->nice+n->system+n->idle); id=(unsignedlong)(n->user-o->user); sd=(unsignedlong)(n->system-o->system); if((nd-od)!=0)cpu_use=(int)((sd+id)*10000)/(nd-od); elsecpu_use=0;returncpu_use;}get_cpuoccupy(CPU_OCCUPY*cpust) //cpuusagerate{ FILE*fd; intn; charbuff[256]; CPU_OCCUPY*cpu_occupy; cpu_occupy=cpust; fd=fopen("/proc/stat","r"); fgets(buff,sizeof(buff),fd); sscanf(buff,"%s%u%u%u%u",cpu_occupy->name,&cpu_occupy->user,&cpu_occupy->nice,&cpu_occupy->system,&cpu_occupy->idle); fclose(fd);}staticvoidusage(constchar*progname){fprintf(stderr,"%s[-h][-b0<blocksize<=4096][-r]ccnx:/some/uri\n""Readsstdin,sendingdataunderthegivenURI""usingccnversioningandsegmentation.\n""-hgeneratethishelpmessage.\n""-bspecifytheblock(segment)sizeforcontentobjects.Default1024.\n""-rgeneratestart-writeinterestsoarepositorywill""storethecontent.\n""-snsetscopeofstart-writeinterest.\n""n=1(local),2(neighborhood),3(everywhere)Default1.\n",progname);exit(1);}/**make_template:constructaninteresttemplatecontainingthespecifiedscope*Anunlimitedscopeispassedinas3,andtheomissionofthescope*fieldfromthetemplateindicatesthis.*/structccn_charbuf*make_template(intscope){structccn_charbuf*templ=NULL;templ=ccn_charbuf_create();ccn_charbuf_append_tt(templ,CCN_DTAG_Interest,CCN_DTAG);ccn_charbuf_append_tt(templ,CCN_DTAG_Name,CCN_DTAG);ccn_charbuf_append_closer(templ);/*</Name>*/if(0<=scope&&scope<=2)ccnb_tagged_putf(templ,CCN_DTAG_Scope,"%d",scope);ccn_charbuf_append_closer(templ);/*</Interest>*/return(templ);}char*stringJoin(constchar*first,constchar*last)//StringJoin函数负责连接两个字符串,将参数列表中的first字符串和last字符串连接起来{ char*result; intlen=strlen(first)+strlen(last)+1; result=(char*)malloc(len*sizeof(char)); memset(result,0,len*sizeof(char)); strcpy(result,first); strcat(result,last); returnresult;}intmain(intargc,char**argv){constchar*progname=argv[0];structccn*ccn=NULL;structccn_charbuf*name=NULL;structccn_seqwriter*w=NULL;intblocksize=1024;inttorepo=0;intscope=1;inti;intstatus=0;intres;ssize_tread_res;size_tblockread;char*cpuTemp=malloc(20);char*memTemp=malloc(20);char*netTemp=malloc(20);char*output=malloc(100);structccn_charbuf*templ;torepo=1;//flag标志位,torepo为1表明系统输出要输出到repositary中char*statusUrl="ccnx:/server2";//repository输出路径name=ccn_charbuf_create();res=ccn_name_from_uri(name,statusUrl);if(res<0){fprintf(stderr,"%s:badCCNURI:%s\n",progname,statusUrl);exit(1);}ccn=ccn_create();if(ccn_connect(ccn,NULL)==-1){perror("Couldnotconnecttoccnd");exit(1);} CPU_OCCUPYcpu_stat1;//声明存储cpu占用率、内存占用率、网络连接占用率变量 CPU_OCCUPYcpu_stat2; MEM_OCCUPYmem_stat; NET_OCCUPYnet_stat; intcpu=0; while(1) { w=ccn_seqw_create(ccn,name); if(w==NULL){ fprintf(stderr,"ccn_seqw_createfailed\n"); exit(1); } ccn_seqw_set_block_limits(w,blocksize,blocksize); if(torepo){ structccn_charbuf*name_v=ccn_charbuf_create(); ccn_seqw_get_name(w,name_v); ccn_name_from_uri(name_v,"%C1.R.sw"); ccn_name_append_nonce(name_v); templ=make_template(scope); res=ccn_get(ccn,name_v,templ,60000,NULL,NULL,NULL,0); ccn_charbuf_destroy(&templ); ccn_charbuf_destroy(&name_v); if(res<0){ fprintf(stderr,"Noresponsefromrepository\n"); exit(1); } } blockread=0; get_cpuoccupy((CPU_OCCUPY*)&cpu_stat1);//通过get_cpuoccupy函数,调用linux系统函数获得cpu使用情况 sleep(10);//令进程睡眠10秒 get_cpuoccupy((CPU_OCCUPY*)&cpu_stat2);//获得十秒后的cpu使用情况 cpu=cal_cpuoccupy((CPU_OCCUPY*)&cpu_stat1,(CPU_OCCUPY*)&cpu_stat2);//借助于两组cpu使用情况,计算cpu利用率 sprintf(cpuTemp,"%d\t",cpu);//将cpu这个整形变量赋给cpuTemp,并转换为string类型 get_memoccupy((MEM_OCCUPY*)&mem_stat);//获得内存使用情况 sprintf(memTemp,"%lu\t%lu\t",mem_stat.total,mem_stat.free);//将内存使用情况int值转为memTemp,sting类型 get_netoccupy((NET_OCCUPY*)&net_stat);//获得网络数据包流量 sprintf(netTemp,"%lu\t%lu\t%lu\t%lu",net_stat.lo_in,net_stat.lo_out,net_stat.eth_in,net_stat.eth_out);//将数据包int值转换为string,赋给netTemp output=stringJoin(cpuTemp,memTemp); output=stringJoin(output,netTemp);//通过两次字符串连接,将所有数据转换为一个string类型。 blockread=strlen(output);//计算最终输出string变量长度 res=ccn_seqw_write(w,output,blockread);//将字符串append到ccn_seqwriter结构体w的buffer上 while(res==-1){ ccn_run(ccn,100); res=ccn_seqw_write(w,output,blockread);将 } if(res!=blockread)abort();//hmm,ccn_seqw_writedidashortwriteorsomethingblockread=0;//flushoutanyremainingdataandcloseif(blockread>0){res=ccn_seqw_write(w,output,blockread);while(res==-1){ccn_run(ccn,100);res=ccn_seqw_write(w,output,blockread);}}ccn_seqw_close(w);//将ccn_seqwriter结构体w中的buffer中数据写入到repositary中ccn_run(ccn,1);sleep(5); }free(output);//释放一系列资源free(cpuTemp);free(memTemp);free(netTemp);output=NULL;cpuTemp=NULL;memTemp=NULL;netTemp=NULL;ccn_charbuf_destroy(&name);ccn_destroy(&ccn); printf("%d",res);//exit(status);}CCNx包括以下主要模块:(1)ccnd:核心守护进程,支持缓存、转发和包鉴权功能,由C代码实现。(2)repository:用于永久存储应用程序数据,由Java语言实现。(3)大量概念验证型的应用:由C或Java语言编写,如用于聊天的工具ccnchatCCNx支持的平台有UbuntuLinux、MacOS、Solaris和FreeBSD,不支持Windows操作系统。在安装CCNx前,还需要创建好C和Java的编译环境,以支持C和Java源代码编译。 图3-1当前CCN架构在网络中所处的位置及其发展趋势如上图所示,最左边的是CCN在当前网络体系中所处的位置,即实验中所进行的CCN文件下载还必须的基于IP地址,而随着CCN网络体系架构的不断完善,CCN可以逐渐部分地抛开TCP/IP进行通信,最终CCN设计成与当今网络的使用方式相匹配,既能与TCP/IP协议并行,也能独立运行,而且不会破坏现有的网络。3.2运行环境的搭建本实验选择在Ubuntu10.10上安装CCNx-0.5.0,首先安装好Ubuntu10.10操作系统,然后进行以下操作:(1)下载CCNx源代码,从网站/上下载最新版本的CCNx源代码,本次实验使用的是CCNx-0.5.0,下载后解压到指定的文件夹(2)下载编译所需的库文件,打开Ubuntu终端输入一下指令,sudoApt-getinstallgit-corepython-devlibssl-devlibpcap-devlibexpat1-devAthena-jot。(3)安装ant,先下载ant-1.8.2-bin.tar.gz,然后执行如下指令:sudocpapache-ant-1.8.2-bin.tar.gz/usr/local/复制到/usr/local/sudotarxzfapache-ant-1.8.2-bin.tar.gz解压然后设置环境变量,在终端输入命令:sudogedit/etc/profile,在最后加入如下代码:#setANTenvironmentexportANT_HOME=/usr/local/ant exportPATH=/usr/local/ant/bin:$PATH使环境变量生效:source/etc/profile测试ant是否安装成功:ant–version如果输出ApacheAntversion1.8.2compiledonSeptember302011则说明ant安装成功图3-2ant安装成功在终端下的截图(4)安装jdk,先下载jdk-6u27-linux-i586.bin,然后执行如下命令sudocpjdk-6u27-linnux-i586.bin/usr/bin复制到/usr/localcd/usr/local进入local路径sudochmodu+xjdk-6u27-linux-i586.bin赋予当前用户解压权限sudo./jdk-6u27-linux-i586.bin执行bin文件开始安装,jdk会自动被安装在/usr/local/jdk1.6.0_22目录中然后设置环境变量,在终端输入命令sudogedit/etc/profile,在最后加入如下代码: #setJDKenvironmentexportJAVA_HOME=/usr/local/jdk1.6.0_27exportPATH=$PATH:$JAVA_HOME/binexportCLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexportJRE_HOME=$JAVA_HOME/jre使环境变量生效:source/etc/profile测试环境变量设置是否正确:java–version如果输出如下:Javaversion“1.6.0_27”Java(TM)SERuntimeEnvironment(build1.6.0_27-b07)JavaHotSpot(TM)ClientVM(build17.1-b03,mixedmode,sharing)则表明JDK已经安装成功图3-3JDK安装成功在终端下的截图(5)、安装ccnx先从终端进入ccnx-0.5.0目录下,检查java1.60与ant1.8.2是否正确配置,(java-versionant-version)检查成功配置后再进行ccnx的安装。执行如下安装指令:sudotar–xvfccnx-0.5.0.tar.gz在当前目录下生成ccnx-0.5.0目录cdccnx-0.5.0进入该目录sudo./configure检查系统环境,如检测通过则生成编译脚本sudomake编译,编译成功在当前目录生成二进制可执行文件sudomakeinstall进行安装,该命令将ccnx中的一些指令如ccnstart等加入到shell的指令集中,这样可以不必进入/ccnx-0.5.0/bin中执行命令安装成功后会出现如下目录结构:bin/——包含可运行的命令工具lib/——包含应用程序需要的库include/——应用程序需要的C头文件javasrc/build——包含与ant和java相关的文件(6)、测试ccnx在终端下输入ccndstart(执行过makeinstall情况下)开启ccnx守护进程。打开浏览器,输入http://localhost:9695此时应能看到检测ccnx运行状态的网页,若能看到说明ccnx正常工作。至此运行环境搭建完成!图3-4ccnd正常运行的网页截图3.3实验描述本实验使用已有的ccnxjavaapi及capi,在ccnx的框架下,实现能根据节点及链路状态参数智能选择下载源的文件下载功能。实验中所搭建的文件传输拓扑结构图如下:CCADBADB EE图3-5实验所搭建的拓扑结构图如图所示,五台电脑相连,其中一台作为客户端(client),另外三台C、D、E作为服务节点。由于CCN路由器还未能在硬件上实现,所以此处用主机B作为CCN路由器,实现CCN路由转发的功能。首先client以广播的方式依次发送针对三个服务节点及链路状态信息的Interest请求,经过路由器B的转发请求到达服务节点C、D、E,各服务节点在收到请求后沿着逆路径经过路由B将自己的状态信息回馈给Client。Client通过分析各服务节点的状态信息确定一个最优的下载节点,然后以单独向该服务节点发送针对所需文件的interest请求,最终获得所需文件。原始的CCN文件传输工作方式原始的ccnx文件传输工作方式如下C、D、E为三个服务节点,他们在相同的路径ccnx:/server下维护一个相同的文件filetest。Client节点想要下载filetest文件。首先client会通过广播的方式向和它相连的所有节点发出针对于filetest的interest请求当三个服务节点接收到interest请求后会首先在其ContentStore中搜索是否存在ccnx:/server/filetest这个ContentObject,(本实验比较简单,设定的三个服务节点都存有filetest这个文件),则三个服务节点都会向client返回它们本地filetest文件,client会存储最先到达的文件,然后丢弃后续到来的文件,至此文件传输结束。具体流程如下图所示:各服务节点搜索其ContentStore各个服务节点收到各服务节点搜索其ContentStore各个服务节点收到Interest请求Clien广播针对文件filetest的Interest请求Client收到最先收到的Client收到最先收到的content,丢弃后续到达的向client返回与Interest相对应的content图3-6原始的CCN文件下载流程以上是CCNx上提供的文件传输功能,我们的目标是改进这个文件传输系统,通过利用平台上提供的javaapi及Capi使客户端能够动态地选择(最优)下载路径。3.3.2初步改进后的CCN文件传输工作方式初步改进后的CCNx文件传输工作方式改进后的系统,服务节点C、D、E除了默认的ccnx:/server/filetest路径外还会维护一个ccnx:/server/status的路径,每过一定时间,服务节点就会对statuscontentobject进行更新,更新的内容为该服务节点的当前状态信息,比如CPU利用率、contentstore负载、IP数据包的流量等等。※在发出针对文件filetest的interest请求之前,client会广播针对各服务节点status的请求,同样C、D、E都会将自己的status回馈给client,但因为发布者的签名不同,client不会认为是同样的content,因此不会在收到第一个status后删除后续到来的两个status※client对接收到的status进行分析比较,判断从哪个服务节点来获取文件最佳※在确定最优下载节点后,client单独向最佳服务节点发送针对filetest的interest请求※最佳服务节点向client返回相应的filetest文件。至此文件下载结束。具体流程图如下所示:Cilent分析statusCilent分析status确定一条最优下载路径各服务节点将自己的status返回给clientClient依次广播对各服务节点的status请求最优服务节点向client返回最优服务节点向client返回filetest文件最优服务节点搜索其contentstoreClient单独向最优服务节点发送针对filetest的请求图3-7初步改进后的CCN文件下载流程3.3.3改进前后的对比相比于原始的ccnx文件传输方式,改进后的文件传输方式会在一定程度上降低链路的负载。因为原始方式首先广播对filetest的interest请求,然后三个服务节点都会回馈本地的filetest文件,客户端只会留下最先收到的文件,后续的文件都会被丢弃,被丢弃的那些文件在传输过程中明显浪费了不少带宽(尤其是当要传输的文件很大时),同时也使传输这些文件的服务节点被不必要的占用;而改进后,client首先进行一系列判断最终只有一个节点回馈本地的filetest文件,因此改进后可以减少传输文件时消耗的带宽,减少链路的拥堵。注意到改进方式多了一套请求分析status的过程,可能会增加一定的时间浪费,但由于本实验的拓扑结构比较简单,当有几百台甚至上千台的主机相连时,状态分析所消耗的时间相比于原始的文件传输因链路拥堵所消耗的时间完全可以忽略不计(另外针对的status所发送的Interest包也很小,不会占用太多的带宽),改进方式的优势会更加明显的表现出来。3.4操作步骤(1)首先按照如图所示用ccndc将五台主机的IP建立连接,并用ping命令检查是否连通注:当前的CCN还是运行在TCP/IP这套协议之上,文件传输还得依靠IP地址在五台主机上运行ccnd、ccnr,在服务节点C、D、E上运行ccnseqwriter注:ccnseqwriter是一个负责将服务节点的状态信息定期更新到repository中的进程,设定的C、D、E的状态信息分别存放在路径ccnx:/server1、ccnx:/server2和ccnx:/server3下图3-8运行中的ccnd进程图3-9运行中的ccnr进程服务节点C、D、、E分别在路径ccnx:/server1、ccnx:/server2和ccnx:/server3下维护一个相同的文件filetest用ccncat分别查看各服务节点在路径ccnx:/server1、ccnx:/server2和ccnx:/server3下保存的状态信息,根据自己在客户端预先设定好的算法分析判断哪一个服务节点是当前最优节点。在client端用ccngetfile取filetest文件,注意观察最终取得的filetest文件是否来自于最优节点。注:本实验中在服务节点中所存放的文件名字都是filetest,但filetest中所写入的数据有区别,这主要是为了区分最后client取出的filetest是来自哪一个服务节点。3.5实验结果图3-10控制台文件下载截图如图所示是控制台下显示的文件成功下载的截图,由图中可知客户端A最终确定的最优节点是C,这与通过命令ccncat查看服务节点状态信息确定的最优节点相同。3.6实验分析与总结在设定好的状态信息的分析算法下,最终client从最优下载节点取到filetest文件。本实验客户端智能选择最优下载节点是基于CCN的通信机制设计的,CCN中是以发布和获取信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论