您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
如何从头开始构建类似BitTorrent的P2P网络?
节点,文件,过程如何从头开始构建类似BitTorrent的P2P网络?
发布时间:2020-12-06加入收藏来源:互联网点击:
如何从头开始构建类似BitTorrent的P2P网络?
回答于 2019-09-11 08:43:50
回答于 2019-09-11 08:43:50
由于我们对 P2P 网络和分布式系统感兴趣,因此我们决定开始用 Ruby 从头开始构建自己的类似 BitTorrent(BT)的系统。目前可用的版本是我们发布的 alpha 测试版本,提供了一个有效的概念验证:完整的分布式路由表,节点间的通信和基本的文件传输。在本文末列出了未来要新增的功能,我们将会继续改进 Xorro。
本文记录了我们构建 Xorro P2P 的过程。希望读者阅读本文后能对 P2P 系统有更深一层的认识。
Xorro P2P 运行界面
研究
作为严格意义上的 P2P 系统的最终用户,我们开始了开发旅程,面临着非常陡峭的学习曲线。我们必须进行大量的研究来了解 P2P 相关的历史和内部组成。我们进行了搜集和阅读 P2P 相关资料,从旧到新依次有:Napster、Gnutella、Freenet。BitTorrent、IPFS……
集中式系统 vs 去中心化系统
需要理解的一个重要概念是集中式和去中心化系统之间的区别。第一代和第二代网络架构的比较有助于描述这两者之间的区别。
Napster:集中式系统
Napster 是一种 P2P 文件共享服务,主要用于传输音乐文件,在 1999~2001 年非常流行,据估计,在鼎盛时期大约有 8000 万注册用户。Napster 的工作原理是让所有节点都连接到中央索引服务器,该服务器包含所有关于谁拥有哪些文件的信息。
集中式 P2P 网络的一个示例
因为其本身为集中式的结构,Napster 中央服务器很容易遭受到攻击,以及文件传送的方式备受争议,营运两年后在法院的判决下被迫关闭。除此之外,中央索引服务器还意味着存在单点故障,以及缺乏可扩展性。
BitTorrent、Gnutella、Freenet:去中心化系统
下一代 P2P 网络通过采用去中心化的模式避免了与 Napster 相同的命运。
在像 BitTorrent 这样的去中心化系统中,每台计算机 / 节点都充当客户端和服务器,维护自己的文件查找索引片段。节点可以通过其他节点来查找文件的位置,免除了对中央服务器的依赖。
去中心化 P2P 网络的一个示例
P2P 文件共享系统的深入介绍
了解新一代 P2P 系统的优点后,我们继续深入研究它们的特性。幸运的是,P2P 网络是已经发展一段时间的技术,因此网上有许多资源可供我们利用。其中分布式哈希表(distributed hash tables ,DHT)是 P2P 网络中最重要的技术,因此分布式哈希表是当前 P2P 网络的基础。我们花了很多时间进行阅读及研究白皮书、规范文档、博文和 Stackflow 问答,在开始编程之前,我们要确保对分布式哈希表有深刻的了解。
我们找到的有用资源的列表在这里: https://xorro-p2p.github.io/resources/
功能的选择
BitTorrent 主要功能
经过比较许多 P2P 网络之后,我们最终锁定了 BitTorrent 的一组功能,作为我们开发应用的第一个版本的蓝本。这些功能将在下文中将进一步详细描述。
分布式哈希表(DHT)
文件切分
节点既作为客户端又作为服务器
演示
在深入了解 Xorro P2P 的实现细节之前,请先查看下面的动图,该动图解说了文件下载过程的实际情况。
首先,清单文件(即 BT 种子,下同)会被下载,然后依据种子中列出的文件切分信息下载各个文件切片。下载完所有的切片后,将它们重新合并回原始文件。
分布式哈希表的实现
先评估几种分布式哈希表的优缺点:Chord、Pastry、Apache Cassandra、Kademlia 等等,再以此为考量作为我们选择的依据。我们最终决定就其普及率、最简单的远程过程调用和信息的自动传播等优点,选择了 Kademlia。
事实证明,由于大量的新概念:节点、路由表、桶(buckets)、异或距离、路由算法、远程过程调用(remote procedure calls,RPC)……,使得 Kademlia 的实施极具挑战性。虽然当时网上已经有一些 Ruby 的实现,但我们只依据规范和白皮书,因为我们要从头开始构建分布式哈希表。
Kademlia
一个 Kademlia 网络由许多节点组成。
每一个节点都有:
具有唯一的 160 位 ID。
维护包含其他节点联系信息的路由表。
维护较大的分布式哈希表中那些自己的段。
通过 4 个远程过程调用与其他节点通信。
每个节点的路由表被划分为“桶”,每个桶包含与当前节点的特定“距离”的节点的联系信息。我们会在后面更详细介绍关于距离的概念。
每个联系信息都包含其他节点的 ID、IP 地址和端口号。
由于 Xorro 是一个文件共享应用程序,因此分布式哈希表段将包含 key/value 对,其中,每个 key 是一个文件的 ID,对应的 value 是文件的位置。
Kademlia 规范中描述的节点构成。
节点通信
Kademlia 节点发送和响应有四种基本的远程过程调用。
PING
与互联网控制消息协议(Internet Control Message Protocol,ICMP)中的 Ping 非常相似,它是用于验证另一个节点是否仍处于活动状态。
FIND NODE
发送此远程过程调用时要找到特定节点的 ID。此远程过程调用的接收节点在自己的路由表中查找,并返回一组最接近正在查找的 ID 的联系节点。
FIND VALUE
发送此远程过程调用时要带有要定位的特定文件 ID。如果接收节点在自己的分布式哈希表段中找到这个 ID,它将返回响应的 Value(URL)。反之,则接收节点返回最接近文件 ID 的联系节点列表。
STORE
此远程过程调用用于在接收节点的分布式哈希表段中存储 key/value 对(file_id/location)。
每次成功完成远程过程调用后,发送节点和接收节点都会在各自的路由表中插入或更新彼此的联系信息。
寻找对等点和文件
一个节点如何在 Kademlia 网络中找到其他节点或者文件呢?我们可以用现实生活中的例子来举例。
如果某个人想找到另一个不认识的人,他可能会采取以下步骤:
他可以询问离目标人物更近的朋友。也许这些朋友和目标人物在同一个行业工作,或者在同一个城市居住。
如果其中一个朋友知道目标人物在哪里,那么就可以提供目标人物的联系信息,这样查找就完成了。
如果这些朋友都不认识目标人物,他们可以给你提供可能认识目标人物的朋友的联系信息。
然后你再询问这些人,看看他们是否知道目标人物,重复这一过程,直到找到目标人物,或者达到某种停止查找的条件。
Kademlia 节点在执行查找时就遵循类似的模式。
如果一个节点要从网络中检索一条信息(一个文件),它将发送 FIND VALUE 的远程过程调用到它自己的联系节点子集,这些联系节点的 ID 与它要查找的文件的 ID“最为接近”。如果任何接收节点在其分布式哈希表段中有这个 ID,则它们将返回相应的 value,否则,它们将返回更接近所查询的 value 的节点列表。
下一个要讨论的问题是如何在 Kademlia 网络中确定“距离”。
距离的计算
上一篇:两个女孩同时爱上了一个男孩,而且谁也不肯放手,他该怎么办?
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |