摘要:P2P网络实际上是一个分布式对象存储、查询及共享的网络架构。本文将展示其现状的一个调查。首先,我们将引入一个简单的P2P的定义,并定义了一些P2P常用操作流程。其次,为了理解和比较实际的P2P架构和协议,我们讨论了P2P运行效率。第三,对现有的P2P架构进行了分类和详细比较。第四,对相应的P2P架构中对象查询协议进行了仔细的讨论。我们也回顾了现有P2P模型的输出并列举了总体的模型解决方案。最后,简要研究了几个基于P2P技术的新应用和P2P网络架构将来的研究方向。这篇文章目的是根据P2P的发展和演变过程,给出一个清晰完整的P2P网络架构的调查研究。

 

1 简介

Oram[1]给出了一个P2P简单的定义:“P2P是一类应用,它利用了网络中闲置的存储、周期、内容、人力的资源。因为使用这些分散资源就意味着要在一个不持续连接、未知IP地址的环境中操作。端对端节点一定是在DNS外操作,而且也在相对集中或完全自治的集中服务器之外”。简而言之,P2P是在应用层上的一个专有分布系统。在此,每对节点都可以通过路由协议在P2P层上直接通信。总体的P2P 网络结构如图1示。每个结点(节点)拥有一个对象(如文件,音乐,MP3MPEG等)数据库。每个节点都可以通过P2P层逻辑连接查询其它节点上它想要的对象。

为了清晰地理解P2P,我们用C/S模型与P2P模型进行比较(表1)。在C/S模型中,每个节点扮演的角色或是客户端或是服务器。诸如存储或计算能力等资源可以在客户端和服务器之间共享。在C/S模型中,服务器事实上是一个集中控制点。在P2P模型中,每个节点都同时是客户端和服务器。作为客户端,它从其它节点查询或下载它想要的对象。同时作为服务器,它也为其它节点提供服务。

根据生命周期,对于P2P节点来说有大致四个术语:连接,查询,下载和分离。首先,一个即将进入的节点必须活跃地连接到P2P系统。在这个过程中,它需要获取一些基本信息(如它的邻点)来启动,同时也要发布它拥有资源的信息。然后,这个节点可以为它需要的资源提交查询。这时,P2P定位协议会帮助这个节点来确定目标节点,同时P2P路由协议会传送查询消息到目标节点上。第三,如果查询成功(通常返回目标节点IP地址),节点可以直接从目标节点下载资源。最后,节点会在理想状态宣布分离。因此,P2P三个重要组成是:邻居发现,定位协议和路由协议。这些组成将会利用P2P拓扑结构,即使结构化或非结构化和P2P节点自治,而不会在开始下载资源时使用。

本文目标是给出一个P2P当前优劣的调查。尽管已经有了一些P2P网络的概述文章[2-4],但我们强调的是P2P架构,资源查询算法和P2P执行评价与模板化。我们尽量给出一个完整清晰的介绍与分析,设计到当今P2P网络及其执行比较、未解决问题和一些今后发展方向。文章后续部分是按如下组织的。第二部分列举了一些P2P执行公式。第三部分中,我们讨论比较了三代P2P架构。然后是资源查找算法,也是P2P网络中最重要组成之一,它在第四部分被认真描述了。第五部分将讨论P2P执行模型的一些发展。最后,在第六部分,我们综述了P2P重要应用和今后发展方向。第八部分给出了一些总结。

2. P2P执行模板

为了评价比较现有P2P网络,我们首先定义一些执行模板。通常的P2P网络的特性一般包括:安全性,匿名性,可扩展性,弹性和查询效率。本文重点在后三者。弹性由查询字比率来确定。我们可以称提交查询的节点为获取者,称拥有被查询资源的节点为提供者(图3)。有两种情况将导致失败:1)提供者关闭。2)在到提供者的线路上有故障(如连接失败或节点超时失败)。但是,查询效率是依赖于平均查询消息数和平均查询路径长度。总的来说,资源查询算法涉及查询消息数,如果使用基于洪泛的转发,查询消息数一定会比使用单点路由转发多。但基于洪泛的转发会产生较短的查询路径长度。其它的一些公式:1)一个节点上通过的控制消息,2)一个节点上处理查询的平均数。

3. P2P架构

3.1 P2P分类

当今的P2P网络有很多,每种P2P网络有着很多不同特性,而它们又没有统一分类标准。我们将思考几种方法来为它们分类,从而更好地理解它们。

根据资源查询机制不同和P2P逻辑拓扑结构,现今P2P架构可以分为这样三类[5]1)集中方式-所有资源索引项目被按照<资源键值,节点地址>形式保存在一个集中服务器上。每个进入的节点需要上传它拥有资源的信息到服务器,然后节点只需要在服务器上查询它所需要资源节点地址。这种类型的P2P架构是很简单的,易于开发。但是它有单点故障的问题,尽管我们可以使用多个并行服务器。这种架构P2P的典型例子是Napster[6]2)非结构化分布方式-资源查询是分布的,而且逻辑P2P拓扑多是随机的非结构化网络。查询在网络中一跳一跳地执行直至成功、失败或是超时。这种类型,如Gnutella[7],没有单点故障问题,但是查询效率是非常低的。3)结构化分布方式-资源查询是分布的,但是逻辑P2P拓扑是一定程度结构化的,如mesh[8]~[10]ring[11]d-dimension torus[12],及butterfly[13]~[15]。这些结构化拓扑一般通过分布的哈希表-DHT技术来组织,如[9]~[12]。资源查询也是在结构化网络中一跳一跳地执行的,在理想情况下通过若干确定的跳转就可以确定成功。

根据产生的时间和目的,我们可以将现有P2P网络分成三代:11G-第一代是最早的P2P网络,如NapsterGnutella,旨在开发简单快捷。它们过于简单,以致没有好的可测量性和好的查询效率。22G-第二代:第二代P2P网络通常使用DHT技术来实现更好的可测量性和查询效率,提供负栽均衡,支持精确查询。但是可扩展性和容错能力不好,尤其是在恶意攻击下更差。33G-第三代[13]~[15]:近来提出的P2P网络想要在假定节点会在某些失败的情况下关闭后提供高的弹性。通常在提供高容错性使用的技术包括资源复制,节点间增加连接数,还有一些特殊的结构化拓扑。2G3GP2P网络通常是分布式的结构化网络。在后面,我们将按照上述的两种分类方法分别详细讨论它们。

3.2 第一代P2P

MapsterCPP[6]

Napster[6] ,一个音乐交互系统,和其它简单系统一样有一个不断更新的资源列表保存在集中的Napster服务器上。节点登录这个服务器并发送它能提供的文件列表,然后向服务器提交查询来查找其它的哪个节点持有它们需要的文件,最后直接从资源所在节点下载需要的文件。尽管Napster集中数据库先天地避免了查询路由和其它的P2P系统上存在的问题,但是很明显这样的集中式解决方案有着单点故障的问题而且有较差的可扩展性。这种架构的另一个特点是它支持模糊查询(例如,查询所有的标题包含两个或多个特殊词的资源)。

Gnutella-DUPP[7]

在这种典型的如Gnutella[7]架构中,它在拓扑上或资源配置上既没有一个集中的方向也没有精确的控制。Gnutella实际上是一个分布式的文件共享系统,它的参与着自我组织成一个虚拟的网络来运行P2P方式的分布式的文件查询。为了进入Gnutella,一个节点必须连接到一个已知的Gnutella节点来获取一些Gnutella节点列表来启动。当要查询一个文件,节点要向它的邻点提交查询。典型的查询方式是洪泛,即查询在一个确定的半径内向所有邻点传播或由P2PTTL机制控制。这种非结构化的架构对于节点进入和离开系统有很好的弹性。但是,现在的基于洪泛的查询机制是不可升级的,因为它给网络的参与者产生了很大的负栽。近来,[5]尽最大的努力去克服这个缺陷,提出了两个机制:“动态TTL设置或扩展环”和“K步的随机漫步”。但是“K步的随机漫步”可能导致大的查询时间(延时)。因此,资源复制机制[16][17](如统一复制,部分复制,平方根复制和Log形式的复制)同时被提出来减少查找时间。我们考虑使用cache机制可以使查询消息和长度可以同时减少,如:在查询路由逆向缓存资源。而且,Gnutella也可以支持模糊匹配。

3.3 第二代P2P

这种类型的架构没有集中服务器,但是有着显著的结构。“结构”意味着P2P网络拓扑是严格控制的(如Mesh[9][10][18]Ring[11][20-22]D-dimension Torus[12]K-ary tree[19]SkipList[23]),而且文件也不是随机的而是特定的放置的,这样使得后续的查询很容易成功。这种结构的P2P系统经常支持一个类似Hash表的接口,这在当前文献中是很普遍的。它使用精确的配置算法和特殊的路由协议是查询高效。但是还不是很清楚在有相当多暂时性节点和多处节点失效情况下,这种结构效率如何(除了Butterfly)。这种拓扑结构不支持模糊查询,只支持精确查询。

Plaxton[18]

Plaxton中,每个节点或机器都可以扮演服务器角色(即存储资源),路由器角色(即转发消息),和客户端(请求方)。在我们的讨论中,我们用这些术语来与节点互换。同时,资源和节点在它们的定位和语义部分在名字上是独立的,以基于普通基数的随机定长比特序列的形式来描述的(如,40个十六进制数描述160比特)。系统假定进入者大约是在节点数和资源命名空间都均匀分布的,它们可以使用hash算法的输出来完成,如SHA-1RFC3174)。Plaxton假定Plaxton网络是静态数据结构,没有节点或资源插入或删除。

Plaxton中,资源定位按照如下工作:1)服务器S1通过路由一个消息到O1的“根节点”来发布消息说明它拥有资源O1。根节点在网络中是唯一节点,这个节点被放置在O1的内嵌树的根部。发布的过程由向根节点发送一个消息组成,消息包含<资源标识,服务器标识>映射。这个映射将被自S1O1根节点的路径上的节点记录下来。2)在资源定位过程中,一个目标为O1的查询消息最初被路由向O1的根节点。3)在每一步中,如果消息遇到一个包含O1位置映射的节点,它立即转向到包含O1的服务器上。否则,这个消息被转发到离根节点更近的节点。如果消息到达根节点,只要O1的根节点没有失效它就要确保找到一个O1位置的映射。

Plaxton路由协议执行如下:1)节点N有一个多层的邻点图,其中每一个层描述了一个ID数字的匹配的后缀。例如,节点325AE在第四层的第九个入口在网络上离325AE近,到95AE终止。2Plaxton在每个节点上使用本地路由映射(邻点图),从而一个数字一个数字地逐步路由消息到目标ID上(例如,****8=>**98=>*598=>4598,其中*代表通配符)。这种方案类似于在CIDR IP地址配置结构中的最长前缀路由方式。