点对点*(P2P*)网络是一类分布式系统,其中对等体(计算机或 "节点")在没有中央服务器的情况下一起工作,提供和使用一种或多种服务。因此,在对等网络中,对等体通常既是客户又是服务器--意味着其他对等体的客户,以及其他对等体的服务器。 这就是对等网络中的节点被称为对等体的原因--因为节点之间是平等的(对等体),--不像客户-服务器拓扑结构中,客户和服务器有不同的角色和责任。
P2P网络也是去中心化系统。 然而,并非所有的去中心化系统都是P2P系统。例如,像Cassandra这样的数据库可以在内部使用P2P技术,Cassandra集群中的所有节点既是客户又是彼此的服务器。然而,一个Cassandra集群也会有一组外部客户,它们只是集群的客户,而不是提供数据库服务的参与者。因此,使用Cassandra数据库的客户系统不被归类为P2P网络。 然而,P2P技术在这种系统中仍然可以非常有用。
在P2P中,网络就是服务
在普通的客户/服务器应用中,服务器通常向客户提供服务,客户被称为 "消费 "该服务。在P2P网络中,每个对等体都提供和消费服务,你可以说,"网络就是服务"。
全球规模的P2P网络
在本教程中,我将重点介绍全球规模的P2P网络--如何在没有中央服务器的情况下,让数百万个对等体一起工作。全球规模的P2P网络通常也可用于小型工作组,但小型工作组的P2P技术不一定适合全球规模的P2P网络。这就是为什么我关注大规模的P2P技术。
现有的P2P网络和P2P技术
现在已经有很多活跃的P2P网络,以及一些P2P技术。一些以P2P网络为中心的产品有:
- LBRY
- IPFS
- 贝克浏览器
- Skype
- BitTorrent
- Gnutella
还有一个名为libp2p的开源工具包,提供Kademlia P2P算法的一些实现。
P2P网络算法
我所说的P2P网络算法是指围绕P2P网络中的对等体如何相互连接、相互寻找以及相互之间的信息路由的核心算法,如下面的P2P网络挑战一节中所述。
P2P网络算法通常以特定的P2P拓扑结构为中心。这些P2P拓扑结构基本上可以分为两类P2P网络:
- 结构化P2P拓扑
- 非结构化的P2P拓扑结构
我将在下面的章节中更详细地解释这两种情况。
结构化P2P拓扑
结构化P2P拓扑试图将网络中的所有对等体组织成一个单一的结构化拓扑。 这种结构化拓扑提供了合理的对等体可预测性和信息可路由性。 结构化P2P拓扑也试图避免网络碎片化。
我所知道的一些结构化P2P网络算法是:
- Chord
- Kademlia
- Tapestry
- 糕点
- Polymorph Polyring(见后文)。
所有这些P2P算法都是类似的。它们都将对等体组织成一个单一的虚拟环,每个对等体持有一个路由表,指向网络中其他对等体的一个子集。换句话说,所有对等体都是同一个环的一部分。环中每个对等体之间的主要区别是它在其路由表中引用了哪些其他对等体。
Chord和Kademlia使用类似类型的路由表和算法。 另外,Pastry和Tapestry使用类似类型的路由表。更具体地说,Pastry和Tapestry使用的是一种路由表设计,你可以调整每个对等体的路由表中保存的对等体数量。 路由表中的对等体越多,找到一个特定对等体所需的枢纽就越少,但在每个对等体中保存路由表所需的内存/存储也越多。
其他算法可以在基本的连接、定位和路由算法之上分层,如分布式共识、分布式哈希塔(DHT)、广播、组播、缓存等。 然而,在这个P2P教程中,我将主要关注基本的P2P网络组织算法。
非结构化的P2P拓扑结构
非结构化P2P拓扑结构并不试图将所有对等体组织成单一的结构化拓扑,而是每个对等体试图在其路由表中保留一组 "合理的 "其他对等体--这对对等体的可寻性和信息路由可能有合理的效果,但并不提供任何保证。 理论上,非结构化P2P网络可以分割成多个独立的网络,从而使整个网络的可寻性和路由性变得不可能。
一些常见的非结构化P2P网络拓扑结构有:
- Gnutella
- 蒲公英
- 蒲公英++
- 游泳
Polymorph中的P2P网络算法
我目前正在做一个叫Polymorph的 "艺术 "项目,它也可以用来实现P2P网络(以及其他网络拓扑结构)。下面是我关于Polymorph P2P拓扑结构和算法的文章。
与Chord、Kademlia、Pastry和Tapestry相比,Polymorph网络拓扑结构旨在实现对网络拓扑结构和性能的更大控制。Polymorph并不像Chord、Kademlia、Pastry和Tapestry那样追求统一的拓扑结构,而是努力实现多态的拓扑结构,即为不同的目的提供不同的拓扑结构。
Polymorph的目的是创建一个智能媒体平台,旨在简化更多标准类型媒体的包装、分发和消费,如文本文件、图像、动画、视频、音频、演示文稿等。 P2P网络算法针对的是信息分发部分。
我称Polymorph为 "艺术 "项目,因为它不是一个旨在快速成长的创业公司的项目。 我在Polymorph项目中的主要目标是看我的想法在实践中是否可行--如果可行,看它们的效果如何。
即使Polymorph中的想法运作良好,也不能保证有人会在实践中真正使用Polymorph。即使有些人在实践中使用它,也不能保证他们愿意为使用它的任何部分付费。但采用和货币化并不是Polymorph的主要目标。概念证明才是主要目标。除此以外的任何东西都是 "附带的"。
Polymorph项目是在2021年开始的--在我的业余时间。请耐心等待,因为这需要很长的时间来设计、验证、进行概念验证和记录整个项目。
P2P网络的挑战
一个P2P网络必须解决一系列的挑战,才能发挥作用。具体的挑战取决于P2P网络试图提供什么服务。然而,有一些基本挑战是所有P2P网络都需要解决的。这些挑战是:
- 连接性
- 可寻址性
- 可查找性和/或可路由性
下面将对这些挑战进行详细解释。一旦这些挑战都得到解决,你就可以开始在P2P网络之上建立服务。根据服务的不同,可能会出现其他的挑战,例如:
- 广播和组播
- 缓存
- 查询(DHT)
- 负载平衡
- 认证和授权
- 隐私
- 等等。
我的项目Polymorph最终也要解决这些挑战中的几个。
连接性
为了使P2P网络中的对等人能够进行交流,他们必须能够相互连接。由于许多对等体在NAT或防火墙后面运行,P2P网络必须提供一些解决方案,使其能够与这些NAT/防火墙后面的对等体进行通信。
我在这篇文章中更详细地介绍了对等体的连接。对等体连接。
可寻址性
为了使P2P网络中的对等体能够进行通信,他们还必须能够对彼此进行唯一的寻址。 否则,对等体就不能指定它想与哪个对等体交谈。P2P网络通常通过每个对等体的唯一地址或GUID来解决这个问题。
我在这篇文章中更详细地介绍了对等体的可寻址性。对等体可寻址性
可查找性和可路由性
一旦一个对等体拥有了它想与之通信的对等体的地址,它就需要能够在网络中找到该对等体,以便能够与之建立连接。另外,对等体需要能够通过P2P网络将信息路由到目标对等体。
通常,P2P网络通过对等体地址(GUIDs)和路由表的组合来解决这些挑战。 GUIDs的结构方式使GUIDs的一些组织系统能够实现对等体的查找和信息的路由。因此,你会经常看到对等体GUID的结构和用于组织网络并提供可查找性和可路由性的路由表的结构之间有密切联系。
我在这篇文章中介绍了对等体的可查找性和消息的可路由性。对等体的可查找性和消息的可路由性
P2P教程视频
几年前,我制作了一个视频,解释P2P网络算法的基本原理,如Chord和Kademlia的工作原理,在这里它是:
我可能会在更新这个教程系列时,为P2P网络算法制作一套新的视频(从2021年开始,往后)。