
开篇先特别说明:本文中讲到的P2P不是指网贷行业的P2P,是指一种区块链技术所描述的点对点对等网络技术。
一、目前,P2P技术广泛应用于计算机网络的各个领域,如分布式计算、文件共享、流媒体直播与点播、语音即时通讯、在线游戏支撑平台等。
1.分布式计算
P2P技术可以应用于分布式计算领域,将众多终端主机的空闲计算资源进行联合,从而服务于同一个计算量巨大的科学计算。
每次计算过程中,计算任务被划分为多个片,被分配到参与计算的P2P节点机器上。
节点机器利用闲置计算力完成计算任务,返回给一些服务器进行结果整合以达到最终结果。
世界上最著名的P2P分布式科学计算系统非“SETI@home”莫属,它召集具有空闲计算资源的用户组成一个分布式计算网络,共同完成通过分析射电望远镜传来的数据来搜寻地外文明的任务。
2.文件共享
P2P技术最直接的应用就是文件共享。
在这些基于P2P的应用中,每个用户都可以上传文件至网络中,供其他用户下载,不需要借助中心服务器存储这些文件。
用户下载完成后,也可以作为服务端,供更多用户下载。
整个网络中下载人数越多,则下载速度越快。
完全不会发生传统中心架构网络中,下载数量过多,导致资源抢占,速度过慢的问题。
目前国内最为流行的P2P文件共享方案即是比特洪流。
除此之外,还有不少各具特性的文件共享协议,如Gnutella、Chord、Pastry等。
3.流媒体直播
P2P模式应用于流媒体直播也是十分合适的,目前已有许多这方面的研究。
目前较为成熟的流媒体直播解决方案有香港科技大学的Coolstreaming、清华大学的Gridmedia等。
同时,国内也涌现了很多成功的P2P流媒体直播商业产品,如PPLive、PPStream等。
4.IP层语音通信
IP层语音通信(Voice over Internet Protocol, VoIP)是一种全新的网络电话通信业务,它和传统的公共交换电话网(Public Switched Telephone Network,PSTN)电话业务相比,有着扩展性好、部署方便、价格低廉等明显的优点。
目前,最为流行的P2P VoIP应用是Skype,它能够提供清晰的语音和免费的服务,使用起来极其方便快捷。
二、P2P网络技术经过几十年的发展,为适用各种不同类型的应用,催生了大量具有不同特性的网络协议,如比特币及以太坊分别采用的Gossip、Kademlia协议。
1.Gossip协议
Gossip协议由1987年ACM上发表的论文Epidemic Algorithms for ReplicatedDatabase Maintenance提出,主要应用于分布式数据库系统中各个slave节点的数据同步,从而保证各个节点数据的最终一致性。
Gossip算法又被称作“病毒传播算法”、“流言算法”。
这些别名可谓形象地描述了Gossip的工作原理。
Gossip来源于流行病学的研究,类似于病毒传播或者办公室八卦信息的传播过程,一个节点发生状态变化后,开始向邻近节点发送消息,节点收到消息后又会发送给相邻节点,最终所有节点都会收到消息。
Gossip协议共有Anti-Entropy(反熵)、Rumor monge(谣言传播)两种交互模式,两种模式的介绍及相应优缺点如下:
Anti-Entropy: 每个节点周期性地随机选取一定数量的相邻节点,互相同步自己的数据。该方式可以保证数据的最终一致性。 但是,由于在该模式下,节点会不断地交换数据,导致网络中消息数量巨大、网络开销巨大。 Rumor monge: 当一个节点收到消息后,该节点周期性地向相邻节点发送新收到的消息。 由于在该模式中,节点仅在收到新消息后的一段时间内转播新消息,所以相对于Anti-Entropy模式来说,网络开销小很多,但是有一定概率无法达到强一致性。 |
实际上,在Gossip协议中,节点之间的同步率和节点间的通信开销是一组互相矛盾的指标。
在实际应用中,需要对这一对指标进行细致的考量,即根据应用对节点同步率的具体需求和可用的网络情况作出权衡。
在Gossip协议中,每个节点都会维护数据的键(key)、值(value)、版本(version)信息。
信息交换共支持pull、push、pull/push三种通信方式。
例如,A、B两个节点同步信息,三种方式的过程分别如下:
• pull: A点将key、version信息发送给B,B收到消息后返回本地更新比A新的信息。 • push: A点将key、value、version信息发送给B,B收到消息后更新比本地信息新的内容。 • pull/push: 在pull的基础上多了一步,A收到返回后,会再次将本地新的消息发送给B。 |
2.Kademlia协议
Kademlia协议于2002年发布,是由Petar和David为非集中式P2P计算机网络设计的一种通过分布式散列表实现的P2P协议。
在Kademlia网络中,所有信息均以哈希表条目形式加以存储,这些条目被分散地存储在各个节点上,从而在全网中构成一张巨大的分布式哈希表,在不需要服务器的情况下,每个客户端负责一个小范围的路由,并存储一小部分数据,从而实现整个分布式散列表网络的寻址和存储。
Kademila协议中使用的分布式散列表,与其他的分布式散列表技术相比,具有以异或算法(XOR)为距离度量基础的特性,大大提高了路由查询速度。
Kademlia协议也对节点间的信息交换方式进行了规定。
具体来说,Kademlia网络节点之间使用UDP进行通讯。
参与通讯的所有节点形成一张虚拟网(或者叫作覆盖网),这些节点通过一组数字(或称为节点ID)来进行身份标识。
节点ID不仅可以用来做身份标识,还可以用来进行值定位(这里的值通常是文件的Hash值或者关键词)。
例如,节点ID与文件Hash值直接对应,进而表示某个节点存储着能够获取对应文件和资源的相关信息。
当节点作为客户端在网络中搜索某些值对应的节点(即搜索存储文件Hash或关键词的节点)的时候,Kademlia算法需要知道与这些值相关的键,然后分步在网络中开始搜索。
其中,每一步都会找到一些节点,这些节点的ID与键逐步接近,在找到对应键值(ID)的节点或者无法继续寻找更为接近的键值时,搜索便会停止。
这种搜索值的方法是非常高效的:
在一个包含n个节点的系统的值的搜索中,Kademlia仅访问O(log(n))个节点,降低了值的查询开销。


