什么是P2P?很难有一个确切的解释,也许是由于有着不同的观点或理解。
BW(JXTA book的作者)给出这样一个定义:P2P使得任何网络设备可以为其他网络设备提供服务(Peer-to-peer technology enable any network-aware device to provide services to another network-aware device)。
我个人的理解是P2P网络是:一个网络中的所有节点(设备)的角色、行为、责任和义务都是平等的(对等的)。
看一下我们现今的网络结构:
大多数情况下,我们使用一种称之为客户机/服务器(Client/Server,简称C/S)的网络模式。比如流行的WWW,各种网络游戏等。它们的共同特点是
都需要有一个中央服务器来处理绝大部分的运算工作。
客户端和服务段处在完全不同的角色中。客户端更被动,通常是发送一个请求。而服务端处在一个支配的地位,获取这个请求,进行计算,然后返回一个结果来相应这个请求。
即便如Email这种看上去比较不同的网络应用,也对Client和Server有着明显得分工。
这类网络应用模型有着一个明显的缺点就是:随着服务的客户数目的增多,服务端所需要占用的资源也随之增加,显而易见最终制约了client的数目的增长。
(这种集中式的模型似乎违背了Internet的初衷,the ARPANET)。
并且,我们需要许多隐藏在Internet深处的服务的支持才能获取我们需要的服务,如DNS,如路由。这也就是为什么即便每台机器都开设一个web server,也无法被全部被访问到。(由于IP地址的限制,不可能每台机器都有一个静态的IP。或是由于内部网络的原因,也许即便你有一个静态不变的内部地址,也可能没有一个路由到达你的机器或是访问被防火墙过滤9)。
并且由于现在的Internet过分的依赖于DNS和网关,只要其中有一个服务出了"问题",相应的其他任何服务就都无法获得。
"Edge of Internet":
另一个有趣的现象是:由于刚才所说的DNS和路由的限制,可能有数以亿计的连在Internet上的计算机无法被其他机器访问。这些计算机组成了所谓的"Edge of Internet"。(它们属于Internet的一部分,却不被整个Internet认可,就像处在社会边缘一般充满着矛盾和孤寂)。我们来做个计算:
假设同时只有1千万台100MHz的计算机连接在网络上(事实上远不只这些),每台可以提供100兆的空余空间、1000bps的空余带宽和10%的空余CPU时间。因此这些机器总共提供了10PB(10^15bytes)的存储空间,100亿bps的带宽(大约是1.25GBps)和10万MHz的计算能力!这是多么可观的数字,如果都能加以利用,或是只是开发其中的一部分…….
Google的麻烦:
我们通常使用的Google就是一个著名的集中式网络服务的例子。Google中检索的信息依赖着一个巨大的数据库(大于1.6 billion,即便如此Google所保存的数据也只占整个Internet的很小一部分,几个数量级的差别)。这个数据库必须每天更新,以保证信息的即时性,即便如此Google便利一遍整个Internet也需要十几天的时间。如何能更好的提供搜索服务是很多现今的搜索引擎始终没有办法解决的问题。除此之外,Google还有很多麻烦:
Google的服务是建立在一个庞大数目的Linux集群上的(超过10000台)。维护这么庞大的一群主机就够受的了。
一旦Google发生了故障,所有的服务就都玩完了。不要说Google发生故障,如果DNS,路由等除了或者或那的问题……。
由于Internet中数据的数量庞大且种类多样。Google不仅无法提供一个精确的索引,也无法提供一个完整的索引。
Google只能看到"静态"的数据,它无法访问到处在数据库里的数据。
P2P的承诺(宣言)
提供一个真正的完全平等,自由的互联网。
使用很少的资源消耗而提供高可靠性的服务。
这似乎非常抽象,事实上连我自己也不太清楚我在说些什么。举个例子先:
音乐爱好者kert想在Internet上找一首歌,"Sex Pistol"的"My way"。通常他使用Google来搜索相关的关键字"Sex Pistol" +"My way"。由于只是简单的依赖关键字匹配的方式,Google通常会返回几百或是几千条匹配的记录,当然包括不相关的那些(绝大多数,尤其是当你的关键字中出现诸如Sex之类的词汇)。作为一个音乐爱好者,kert通常会耐着性子在这几千条记录中仔细寻找(头晕),有时找到一个可能性极大的链接却因为链接失效而伤心。想象一下,Google已经是世界上最好的搜索引擎之一了。
如果换成一个P2P网络应用又会如何?P2P网络会将kert的搜索请求发送给每一个连接在网络上的节点(peer),每个节点会在自己所管理的资源中查找是否含有匹配的对象,然后对kert的请求做出回答。和那种集中式的搜索服务相比,将相应交给每一个节点的好处是显而易见的:
由于响应由节点即时完成,而不是像集中式的服务那样将在可能已经过期的数据中寻求答案。这种方式更准确,不会出现让人沮丧的过期连接。另外由于是由节点自由处理请求,而非传统的在静态网页中寻找答案,精确程度更高。
请求分布到了Internet的每个角落,信息更完整,当然得到结果的可能性就越大。
请求分布到了Internet的每个角落,不需要大量的主机群,不会有网络阻塞。
kert很肯定这个世界上有与他爱好相同的fans,因此他信心十足:)。
刚才我们提到,一个请求会发送至P2P网络中的每个节点。这似乎很不可思议,但是事实上(至少在理论上)这是P2P网络的特性之一。因此在P2P网络中,你所享受的服务的是一个由成千上万台计算机组成的cluster提供的。多么神奇而令人兴奋!
即便是最基本的"路由"服务,也是有所有节点共同提供的。因此不在会有因为某个结点的故障或是人为原因而造成的无法链接的现象了。你面对的是一个友善、自由、平等的群体。而非强权(路由)和专制(DNS)。