什么是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的请求做出回答。