高聪
五邑大学 广东 529020
P2P(Peer-to-Peer)是一种点到点的对等网络架构。在这种体系结构中的每台计算机都可以同时充当客户机和服务器两种角色。P2P技术除去了集中式服务器,使节点之间可以直接交换资源和服务,由于这种技术可以重构分布式系统,因而被视为当前最有潜力的网络技术之一,涌现出了诸如Guntella, BitTorrent, BitComet, eMule, PPlive等文件共享系统。
为了使P2P文件共享系统得到更好的下载速度,开发者采取了各种策略。从程序设计者角度采用了多线程编程方法,并支持断点续传。在含有文件服务器的基于分区结构的集中式管理模式下,在P2P检索到资源后,索引服务器会把拥有被请求资源的Peer的列表返回给请求者,此时该请求者便可以开始下载该资源文件。在实际应用中,资源拥有者往往很少,极端情况下仅有一个,此时下载速度就相当慢。一旦客户开始下载,如果在下载完成之前资源拥有者离开了系统,下载者便不能得到完整的资源,必须来解决这个问题。
线程是进程的一个实体,是被处理器调度和分配的基本单位。线程自己不拥有系统资源,但它可以与同属一个进程的其他线程共享进程的全部资源。多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个线程执行不同的任务。也就是说在一定程度上实现了一个进程内部并行运行的效果。
文件下载软件一般采用多线程下载技术。这是因为网络的传输速率相对于处理器的处理能力来说实在太慢了,如果采用单线程来下载,大量时间会花在等待文件传输上。而采用多线程下载在某种程度上实现了并行下载。而不会由于等待文件的传输白白浪费了处理器时间。是否具有多线程下载技术,能支持多少个线程同时下载成为了衡量一个下载软件性能的重要因素。
本测试程序分为服务器和客户端两部分,在Windows 下采用MFC中的CAsyncSocket类和CWinThread 编写。服务器类主要负责监听Socket等待客户的连接,每当有新的客户连接进来请求下载文件的时候就创建新的线程,与其通信传送文件的相应部分。主要由三个类构成,CListenerSocket,CConnecorSocket, CSocketThead。CListenSocket 负责监听,等待客户的连接,在OnAccept 函数中接受客户的连接并建立新的线程进行通信。CConnectSocket 负责通信,根据客户请求的文件块传送相应的文件。CSocketThread是继承自CWinThread 的线程类,用来创建一个Windows 的UI线程类。
客户端的程序则是根据用户设定的线程数目,建立相应的线程来连接服务器程序,并通过同时下载不同的文件块部分,共同协作完成整个文件的下载。主要由两个类构成CConnectSocket、CSocketThread。CConnectSocket 负责通信,根据需要请求相应的文件块代号传送给服务器。CSocketThread是继承自CWinThead的线程类,用来创建一个Windows的UI线程类。
通过利用外网从校园网的服务器下载文件,所得结果如表1所示。
表1 多线程下载表
从表中可以看出,随着线程数目的增多,下载速度也是相应增大。基本上两者关系成正比。正好体现了TCP连接对链路使用的公平性。如果使用的线程的数目相对于该链路上的总连接数目来说很小,所呈现的正是我们的实验所呈现的结果,即使用N个线程创建N个连接,将得到约为单线程下载时候N倍的速度。
经过上面的分析可以看出,线程数目越多的下载速度越快,但是考虑到在P2P系统中一般都限制了Peer提供服务时的线程数,另外线程的切换也要耗费 CPU时间,更为重要的是由于P2P系统的随意性,独一无二的资源提供者的离开,会给下载者造成不能得到完整资源的后果,由此提出复制资源策略。
该策略的思想是在P2P网络模型中,当某个资源的提供者很少的时候,该资源提供者自动选择系统中距离其很近的空闲peer,并把它所共享的资源或者资源的相应的块传送到它选的空闲Peer上,下载者同时从它和它所选的Peer 上下载。由此增多了可用于下载的线程,并把它们分布在不同的Peer上,减少了线程的切换所耗费的时间,提高了下载的速度,大大减少了下载者不能下载完整资源的可能,图1展示了一个基于本地子网的实现过程。
图1 资源复制过程
首先资源下载者 Peer C通过 Internet 连接资源提供者Peer S,请求相应的文件,并告知资源提供者需要提供复制资源服务,接着 Peer S通过在本地子网内发送一个广播请求,获得本地连接相对空闲的 Peer列表,并传送 Peer C所请求的文件到这些空闲的Peer 上,在本图中为A,G,E。然后S发送拥有该资源的Peer列表给C,最后由C连接 A,G,E,以及资源提供者S一起完成文件的传送。下载结束时由C告知这些参与节点下载完毕的信息,所选的空闲节点删除相应的复制资源。
当资源提供者不处于一个子网时,例如它是一个独立的站点,此时它的实现过程就不是发送一个广播请求,而是直接向服务器发送一个获取临近peer列表的请求。当获得列表后,该提供者向列表中的节点发送连接空闲查询,获取空闲peer列表,并将资源整体或者分块传送到相应的节点上,并通知请求者,从自己和它选定的节点上下载完整的资源文件。
该测试程序依然分为服务器和客户端,采用 MFC中的CAsyncSocket类和CWinThread类编写。服务器端基本没变化,只是在客户端里面建立线程连接不同的服务器,并行获取不同的文件块,以完成整个文件的下载。
在实际应用中,资源共享者应根据周围 Peer的实际情况,选择较为空闲的Peer,并传送资源给这些空闲Peer,然后把这些Peer的信息发送给下载者,下载者便可以与资源拥有者,以及它选定的peer进行连接下载资源。下载完成后,选定的 Peer 删除掉资源拥有者传送的文件。由于大文件会占用很多的存储空间,所以也可采取将文件分块地传送到所选择的空闲Peer上,但是要保证这些文件块可以组成完整的文件,以防资源拥有者的退出对下载者造成的影响。
为了便于与多线程的相比较,特意把同一文件的下载结果放在表2中。
表2 资源复制下载信息表
从表2可以看到,相对于多线程下载,进行资源复制后下载速度有了大大提高。这里首先是因为在一般的P2P系统中对Peer的服务端的连接数目的限制,即限制了客户在单个Peer上可以开的线程数目,而在复制资源策略中,由于增加了可以连接的Peer的数目,所以相当于无形地增加了客户可以下载线程的数目。下载速度也相应于所提供服务的 Peer的数目成正比。当下载线程数目增大到一定数量的时候,在继续增加线程的数量并不能提高下载速度。这是由于在该网络中,减少线程切换的时间与网络传送的时间相比来说实在是太小了。如果在选定的网络环境中,例如局域网环境中,当线程切换所花费的时间与网络传送所花费的时间不再是可忽略时,该策略必将大大提高下载速度。
资源复制策略很好的解决了在P2P应用中由于资源提供者过少,下载速度慢的问题。由于多线程的频繁切换会占用一定的时间,以及一般的P2P系统中对于P eer端的用于提供服务的线程数目的限制,因而下载速度并不会很理想,而该策略等于在某种程度上加多了下载线程的数目,并减少了频繁的线程切换,因而大大改善了下载速度。
本文提出了一种P2P系统中复制资源策略,解决了因为P2P系统中资源提供者太少而引起的下载速度过慢的问题,以及资源提供者在下载者完成下载之前就离开系统,造成下载者不能得到完整资源文件的问题。
[1]张宇翔,杨冬.P2P网络中 Churn 问题研究[J].软件学报.2009.
[2]杨彬.分布式P2P网络中基于索引的资源发现研究[J].网络与通信.2009.
[3]熊伟,谢冬青.一种非DHT查找方式的结构化文件共享模型[J].计算机研究与发展.2009.
[4]任小金,古志明.RR-Chrod:一个基于Chord的低开销快查询P2P系统[J].软件学报.2008.