第1章 绪论
1.1 P2P网络概述
1.1.1 P2P网络的起源与发展
P2P概念与Internet的历史一样悠长,Internet设计的初衷就是对等共享,但受限于计算能力,其对等性一般体现在 Internet 核心部分。近年来,主机计算、存储能力和网络带宽的不断提高使P2P重新成为人们关注的焦点,P2P概念有了更为广阔的延伸,使位于网络边缘的主机都能参与网络构建与共享,极大地推动了Internet的发展。
但P2P概念并没有形成一个统一而严格的定义,研究者仅对其进行如下的定性描述与概括。
P2P是一类利用位于网络边缘的存储、计算、内容、人工资源的网络应用[1]。P2P分布式访问意味着P2P应用运行在一个无稳定连接、无预知IP的高度动态环境中,必须具有相当的自治能力。
一个没有等级和中心控制的分布式系统,是位于IP层之上并提供一系列如广域路由、数据查询、近邻选择、冗余存储、信任机制、匿名、容错等特性的自组织网络[2]。简而言之,P2P是一个处于应用层的对等共享的分布式系统,其抽象的体系结构如图1-1所示。位于最底层的网络层描述节点间的网络性质;节点层负责节点的管理、发现和路由;特性层实现安全、资源整合、可靠、容错等特性的P2P网络管理;服务层针对不同的应用提供并行的任务、内容和文件管理支持;最终应用层在底层的构建基础之上实现具体的应用。
所有参与系统的节点处于完全对等的地位,没有客户端和服务器之分,既向别人提供服务,也享受来自别人的服务[3]。
真正促进P2P概念快速发展的推动力来自第一代P2P网络的典型代表Napster[4],其采用中央索引服务器记录所有用户共享的资源,并为用户提供检索服务。中央服务器的存在使其检索极为高效,但也使Napster在后续发展中遭受版权的困扰,并最终被迫关闭。为了应对版权诉讼威胁,第二代P2P网络应运而生,如早期的Gnutella[5],其设计者试图采用无中心的方式组织节点避免单点失效,但其简单的洪泛(Flooding)查询方式极大地降低了P2P网络的可用性。在前两代P2P的基础上,第3代P2P网络主要从两个方面进行改进。一方面,节点组织采用动态分层方式,部分节点被动态选取扮演局部中心节点,如Ka Za A[6];另一方面,节点组织采用分布式散列表(Distributed Hash Table)技术,节点以结构化方式组织提高查询效率,如Kadmilia[7]。而新一代P2P网络不仅关注自身的优化,也开始考虑Internet底层基础设施因素[8],尝试与ISP相互协作进一步优化P2P网络,降低P2P网络对底层设施的冲击。
图1-1 抽象P2P覆盖网络体系结构
从P2P的发展历程可以看出,P2P网络经历了盲目发展—激烈对抗—和谐共存的3个发展阶段,无论P2P网络的整体行为还是客户端的个体行为,在这个过程中均产生了不同的变化。如今,一个客户端的网络边界已趋于模糊,单个客户端可以跨越多个不同类型的P2P网络,P2P网络的行为变得更加复杂、有趣。
1.1.2 P2P系统的拓扑结构
拓扑结构是P2P设计过程的核心问题,直接决定了整个网络的基本形态,并且影响着系统中大量对等节点的命名、组织管理、节点加入/退出方式、容错机制和资源定位机制的设计。由于P2P网络的拓扑维护和路由是在叠加于IP层之上的应用层进行的,因此也被称为覆盖网络(Overlay Network)。P2P网络的发展史实际上就是P2P覆盖网络拓扑结构的发展史,其发展过程是伴随着节点间的链路连通方式以及共享资源的定位技术的不断变革而进行的。到目前为止,P2P 网络的拓扑结构如图1-2~图1-5所示,大致经历了以下几个过程:中心式P2P网络、无结构P2P网络、结构化P2P网络以及混合式P2P网络。
(1)中心式P2P网络。最初的P2P程序Napser诞生于1998年美国的波士顿大学,由当时还是一年级学生的肖恩·范宁编写,其拓扑结构如图1-2所示。服务器对用户共享的资源建立索引并提供查询服务,下载用户从服务器获得文件所有者的信息后直接与相应节点进行数据传输。由于资源的查询和传输过程是分离的,与传统的C/S模式相比,大大降低了服务器的负载。随后,发展起来的很多P2P文件共享系统都沿用了Napser的拓扑结构,包括当前著名的BitTorrent[9]、eDonkey2000[10]和FS2You[11]等。虽然中心化拓扑很好地保证了网络的性能,但是,由于中心组件的存在,制约了整个系统的扩展性和顽健性,同时也容易受到法律诉讼的威胁[12]。
图1-2 中心式P2P拓扑结构
(2)无结构P2P网络。为了消除中心组件所带来的系统瓶颈,随后出现的Gnutella[5]系统去掉了中心索引服务器,将资源文件的索引信息分散到所有网络节点上。其网络拓扑如图1-3所示,在这一拓扑结构中,网络中所有节点在功能和访问权限上是完全对等的,当一个节点需要查询所需要的资源时,会向所有的邻居节点发送查询请求,收到请求的节点会以泛洪[13]、BFS[14]或随机漫步[15]的方式将消息向下转发。为了限制消息的转发次数,在每个查询消息中携带了TTL参数,当TTL减为0时,查询停止,用户会基于每次的查询结果选择合适的文件进行下载。由于网络节点在组织上的自由性和随意性,这种拓扑结构被称为无结构 P2P网络。虽然消除了网络中的中心组件,提高了系统的顽健性,但由于网络中节点仅知道自己邻居节点的信息,只能采取盲目扩散的搜索方式,速度慢且对网络带宽消耗很大,造成了网络扩展性差,查询结果不完全,无法提供服务性能保障。这些都是造成无结构P2P系统不适合商业化的原因,目前,典型的无结构P2P系统的实现有Gnutella和Freenet[16]。
图1-3 无结构P2P拓扑结构
(3)结构化P2P网络。为了消除无结构P2P网络搜索盲目性的缺点,提高资源定位的准确性,分布式散列表(DHT,Distributed Hash Table)技术被应用到了P2P网络的拓扑设计中。这种网络具有相对稳定和规则的拓扑结构,如图1-4所示。DHT是由网络中所有节点共同维护的一个巨大的散列表,每个节点被分配了一个逻辑地址来标识自己,同时全局散列表也按照逻辑地址区域分配给不同节点。每个节点只对散列值落入自己负责区域的资源提供存储和查询服务,搜索过程也按照相应的路由算法在整个网络中进行。在DHT网络中,节点的散列值就像街道和门牌号一样,将不相关的节点组织在一起,使在网络中的任何操作都有址可查。因此,这种基于DHT的P2P网络也被称作结构化P2P。结构化P2P网络能够保证查询结果在一定跳数内收敛,可以自适应地维护节点进出和均衡节点负载,具有良好的可扩展性和顽健性。但是,由于资源和节点间的精确映射关系使DHT结构只适用于精确资源对象的定位和查找,而不适用于一般性的语义查询,这也阻碍了结构化P2P的大规模商业使用。目前,研究领域提出的有代表性的DHT结构有CAN(Content-Addressable Network)[17]、Chord[18]、Pastry[19]、Tapestry[20]、P-Grid[21]和Kademlia[7]等。
图1-4 结构化P2P拓扑结构
(4)混合式P2P网络。这是结合中心式拓扑与分布式拓扑特点的一种折中的选择,通过在完全分布式的P2P网络中引入超级节点 (Supernode)来实现的。网络拓扑如图1-5所示,节点分为叶子节点和超级节点,其中,叶子节点同超级节点之间通过星形结构相连,而超级节点之间则采用无结构的随机组织方式相连接。超级节点负责存储所辖叶子节点的索引信息,处理和转发叶子节点的查询请求。在这种结构中,节点之间不再是完全对等的实体,超级节点负责了大部分的工作,大大降低了叶子节点的负载,使网络流量负荷大幅减小,查询速度加快。但是,混合式P2P网络的健壮性一定程度上依赖于超级节点,当超级节点受到攻击时,网络可能部分瘫痪,但与中心式拓扑相比,这种威胁的强度已经被大大降低了。当前,大多数P2P软件都开始采用这种混合式拓扑结构,包括KaZaA、Skype和eMule等。
图1-5 混合式P2P拓扑结构
表1-1是对中心式P2P、无结构P2P以及结构化P2P优缺点的对比。如何利用不同拓扑的优点,回避其缺点是P2P网络拓扑结构发展的主线。而P2P网络也正是这样经历了一个从绝对集中到绝对分散再到混合结构的演变过程。
表1-1 不同拓扑结构的优缺点对比
1.1.3 P2P系统的特点
P2P网络从字面上可以理解为参与到网络中的所有主体都是平等的,具体到某一通信过程,就是指交互双方为了达到某种目的而进行的双向的、直接的信息和服务交换,所有个体既可以是服务的提供者,也可以是服务的索取者[3]。从网络模型上来看,节点地位对等这一P2P网络模型的基础思想也是与Internet设计的初衷一致的,在最基本的TCP/IP协议中,并没有明确的客户端与服务器的概念,可以说P2P并不是一个新的概念,而是互联网整体架构的基础。但是,由于早期的互联网受限于计算机性能和网络资源等因素,大多数互联网节点不具备服务提供能力,于是逐步形成了以服务器节点为中心,连接众多客户端的C/S架构。近年来,随着主机计算存储能力和网络性能的不断提升,以及网络用户对更直接、更广泛和更自由的信息交流产生需求,P2P架构重新成为了人们关注的焦点。P2P的概念也得到了广阔的延伸,互联网的计算和存储模式正在由集中式向分布式偏移,由中心服务器向网络边缘的终端设备扩散。无论是服务器、个人电脑还是移动终端设备都能直接加入到网络的构建当中,极大地推动了Internet的发展。
与传统的C/S架构相比,P2P架构具备了如下特点。
(1)对等性。在P2P网络中的所有节点都身兼服务器和客户端两个职责,对等连接和直接交换资源,不需要集中式服务器的参与。这有效地解决了传统网络的单点瓶颈问题,同时也提高了网络的可扩展性和顽健性。
(2)可扩展性。由于网络中每个节点都是服务的提供者,所以随着系统中节点数目的增加,系统的服务能力也不断增强,始终能够满足不断增加的用户需求。从理论上讲,P2P 系统就像一个无限大的信息仓库,其扩展性几乎可以认为是无限的。
(3)顽健性。由于P2P网络不存在对集中式服务器的依赖,所以不存在由单一节点性能引起的系统瓶颈。P2P 网络中的数据和资源分散在所有网络节点上,具有天生的高容错的优点。由于P2P网络具有自组织的能力,网络始终能够保持高连通性,即便少数节点失效,对整个系统的影响也是微乎其微的。在节点不断动态加入和离开网络的同时,系统还能够保证极高的性能。
(4)高效性。随着硬件水平的不断提高,个人计算机的计算存储能力和网络带宽也在不断提高。P2P 网络充分利用了个人计算机闲置资源,以更低的成本消耗换取了更高的计算和存储能力。
表1-2是P2P结构和C/S结构多角度的对比,可以看出P2P结构无论是在成本、服务能力还是在网络扩展性方面都具有很大优势。
表1-2 P2P与C/S网络架构对比