BitTorrent DHT 详细规范

2024-05-20

在我的新周末项目中,我决定从头开始编写一个 BitTorrent 客户端,根本没有准备好使用库。经过两天寻找文档后,我已经准备放弃了:smile:。我知道有BEPs http://www.bittorrent.org/index.html,但它们还远远不足以理解所有规范。在阅读了更多内容之后,我认为跟踪器和对等协议似乎很旧并且易于理解/实现(是的,我知道,要编写具有平衡、对等选择、优化的良好代码,这并不容易,正如我刚才所说的,但我只想做基础知识来学习,而不是与那里的数十个优秀客户竞争。)

因此,我决定从 DHT 开始,这似乎是更复杂的部分,而且文档也更少。当您停止寻找 bittorrent DHT 或主线 DHT 并开始寻找 kademlia DHT 时,您会获得更多信息,但如何将它们组合在一起并不那么明显。

以下是我到目前为止的理解(还有一些我希望填补的空白):

  1. 我从我的 DHT 树开始为空
  2. use find_nodes在我的引导节点上
  3. 将接收到的节点添加到我自己的树中,这样我就可以选择更接近我自己的 ID 的节点
  4. 开始发行find_nodes到选定的人并将他们的回应添加到我的树中
  5. 返回 3 直到我停止接收未知/新节点
  6. 如果我收到announce_peerinfo_hash我应该将其信息保存在本地数据库上(发送者的 info_hash 和 ip/端口)
  7. 如果一个节点使用get_peersinfo_hash我在我的数据库中有,然后我发送信息,否则我应该发送我自己的树中更接近的节点列表(最接近该 info_hash)
  8. 当我使用get_peers在其他节点上,我将收到对等点或节点,在后一种情况下,我认为节点更接近info_hash而不是我自己的nodeId那么,我应该将这些节点添加到我的树中还是基于它们开始一个新树?
  9. 当我想宣布我对某个事物感兴趣时info_hash我应该使用announce_peer到处或只是到节点nodeId更接近目标info_hash?距离多少才算足够近?

此时我有很多ID与我自己的ID更接近的节点,而有关info_hash的信息我并不真正感兴趣。

我担心我有一个巨大的愚蠢问题:我为什么这么做?

我的意思是:我做所有这些工作的自私原因是找到我感兴趣的 info_hash 的对等点。我知道一个 info_hash 的信息可能保存在 ID 更接近该 info_hash 的节点上。因此,如果我创建一棵更接近 info_hash 而不是更接近我自己的 ID 的节点树,我找到其信息的机会就会更大(此时,如果您知道主题,您已经注意到我有多么迷失)。

我应该创建多棵树吗?一棵适合我(保存人们发送给我的更接近我的nodeID的info_hashes信息),另一棵树更接近我的每个目标info_hashes,以便我可以检索他们的信息?

我是否应该创建一棵更接近我的节点 ID 的树,并在查询该树以获得我需要的 info_hashes 时希望得到最好的结果?

既然我完全误解了 DHT 背后的想法,我应该放弃吗?

好吧,任何真实的文档、流程图,任何东西都将受到欢迎!


因此,我决定从 DHT 开始,这似乎是更复杂的部分,而且文档也更少。

Peter Maymounkov 和 David Mazieres 撰写的原始 kademlia 论文“Kademlia:基于 XOR 度量的点对点信息系统”是必读内容。它在 BEP-5 中很早就被引用了

如果我收到带有info_hash的announce_peer,那么我应该将其信息保存在本地数据库上(info_hash和发送者的ip/端口)

您仅接受包含之前通过以下方式分发的令牌的公告:get_peers.

当我在其他节点上使用 get_peers 时,我将收到对等点或节点,在后一种情况下,我认为节点更接近 info_hash 而不是我自己的 nodeId,所以,我应该将这些节点添加到我的树中还是基于他们?

您可以使用临时树(或按相对于目标 ID 的联系人 ID 排序的列表)进行迭代查找,因为它们与您的节点 ID 不平衡。

当我想宣布我对 info_hash 感兴趣时,我应该在任何地方使用announce_peer 还是只对nodeId 更接近目标info_hash 的节点使用?距离多少才算足够近?

你执行一个get_peers查找,完成后,您向返回写入令牌的最近节点集宣布并验证响应以确保您确实获得了 ????。如果是 BitTorrent,???? = 8。

我做所有这些工作的自私原因是找到我感兴趣的 info_hash 的对等点。我知道一个 info_hash 的信息很可能保存在 ID 更接近该 info_hash 的节点上。因此,如果我创建一棵更接近 info_hash 而不是更接近我自己的 ID 的节点树,我找到其信息的机会就会更大(此时,如果您知道主题,您已经注意到我有多么迷失)。

进行查找时,您不仅访问路由表中的节点,还访问响应中包含的节点。这使得他们不断迭代。每个节点的路由表对其自身 ID 的偏向确保了响应中包含越来越接近目标的邻居。

因此,协议是,您负责与您的节点 ID 接近的信息,而其他节点将提供与您感兴趣的节点 ID 接近的信息。因此,您的路由表布局为其他节点服务,他们的路由表布局为您服务。

请注意,此答案中包含的所有信息都可以在 BEP 或 Kademlia 论文中找到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BitTorrent DHT 详细规范 的相关文章

  • [Tracker] linux 搭建 BitTorrent

    虚拟机 vmware 15 虚拟机系统 ubuntu 20 04 本机系统 win10 注 所有操作都在 root 下进行 Ubuntu 搭建 BitTorrent 本文是在虚拟机中搭建 bitrtorrent 和 web 平台 生成BT种
  • BitTorrent协议规范(BitTorrent Protocol Specification)系列之B编码(Bencoding)-第一部分

    鉴定 BitTorrent是由布莱姆 科恩设计的一个端对端 peer to peer 文件共享协议 此协议使多个peers通过不可信任的网络的文件传输变得更容易 目的 此规范的目的是详细介绍 BitTorrent 协议规范 v1 0 Bra
  • 如何用 Java 生成 .torrent?

    我想用 Java 生成一个 torrent 文件 但我不想要一个大型 API 来执行诸如抓取跟踪器 播种等操作 这仅适用于生成元数据的客户端 存在哪些轻量级解决方案 我只生成单个 zip 文件的 torrent Thanks 我已经将这段独
  • Ruby BitTorrent 库 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在考虑用 ruby 编写定制的 torrent 客户端 我找到了以下库 正如马特下面指出的那样 它们相当古老 不过 我想听听我可能错过的任何图书馆 并且我很想听听社区对以下图书馆的
  • 如何将从 sha1 字节数组生成的字符串返回到该字节数组?

    首先很抱歉英语不好 好吧 我想从 torrent 文件中读取片段哈希信息 目前 我正在使用https github com hyPiRion java bencode这个 Bencode 库来解码信息 但我的问题是当我想将片段字符串转换为字
  • 在 Python 中使用 Rasterbar libtorrent 挑选同级

    有谁知道是否可以选择使用 libtorrent 进行连接的对等点 也就是说 在跟踪器返回对等 IP 和端口的列表后 只有选定的几个将根据某些定义的标准进行连接 Thanks 您可以使用以下命令从集合中删除对等点set ip filter 您
  • 最新的 BitTorrent DHT 实施建议是什么?

    我正在努力实现另一个 BitTorrent 客户端 目前正在与 DHT 作斗争 是按照这个规范来实现的http www bittorrent org beps bep 0005 html但开始调试它时 我注意到网络上其他节点的响应有所不同
  • Ruby Torrent 库

    Ruby 有什么好的库可以与 BitTorrent 跟踪器一起使用吗 下载或种子文件 rubyforge 上有一个 ruby torrent 库 但它最后一次更新是在 2005 年 似乎不再工作了 参见 lib torrent ruby h
  • 在 Kademlia 中,为什么建议使用 160 位节点 ID 和密钥而不是 128 位?

    Kademlia 论文指出 节点被分配了随机的 160 位 ID 和密钥 这是一个严格的限制吗 如果我觉得足够好 我还可以继续使用 128 位密钥空间吗 选择这个长度是因为用作哈希表键的哈希函数的 SHA1 输出 160 位 这是当时使用最
  • 创建 torrent 哈希信息

    如何在 torrent 文件上生成 torrent 哈希信息 我一直在看这个例子 如何使用 Java 计算 torrent 的哈希值 https stackoverflow com questions 3436823 how to calc
  • 当 DHT 中的节点死亡时,数据会发生什么?

    问题取自这里 https groups google com forum topic byu cs 460 computer networking hpESI0NapmY https groups google com forum topi
  • Bittorrent 协议如何处理数据块?

    BitTorrent 协议中如何处理数据块 当客户想要下载时 例如Linux 发行版中 跟踪器是否返回对等点列表 然后客户端连接到该列表并向每个对等点请求块 或者跟踪器是否返回对等点列表以及哪个对等点具有哪些数据的信息 数据块在哪里管理或处
  • 使用 libtorrent-python 下载 Torrent

    我有以下 python 代码 import libtorrent as lt import time ses lt session ses listen on 6881 6891 params save path home download
  • 种子中的 DHT

    我正在编写一个 P2P 实现 我希望将其去中心化 然而我在掌握如何做时遇到了一些困难DHT https en wikipedia org wiki Distributed hash table在像 BitTorrent 这样的协议中是有效的
  • 解码 Torrent 追踪器抓取的 Torrent 哈希值?

    我在用BEncoded PHP 库 http proger i forge net BEncoded E2 80 93 handling torrent files in PHP 7Tn解码来自 Bittorrent 跟踪器的编码响应 Tr
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 向Kademlia添加新节点,构建Kademlia路由表

    我无法完全理解 Kademlia DHT 的加入过程 我在网上看过一些教程和演示文稿 但它们似乎都以相同的方式说事 并且所有伪代码等在大多数情况下都是相同的 实际复制 粘贴 有人可以对此进行高水平的演练吗 我假设您已经阅读过木兰纸 http
  • 为什么 Kademlia 使用 UDP?

    为什么Kademlia 分布式哈希表 http en wikipedia org wiki Kademlia使用 UDP 作为其网络传输协议 即使它不可靠 主要原因是您快速查询了许多以前从未建立过联系并且可能在查找过程中永远不会再看到的节点
  • 如何在 PHP 中知道种子/对等点的数量

    当您放置一个 torrent文件在您的网站上下载 您如何获取该 Torrent 的种子和同级数量并通知用户 您必须联系 torrent 文件中显示的跟踪器 如果跟踪器支持 抓取 这可能就是您想要的请求 否则 由跟踪器决定要返回多少个对等点给
  • Kademlia 密钥用于识别节点和数据是什么意思?

    好的 我一直在读articles http gleamly com article introduction kademlia dht how it works和paper https pdos csail mit edu petar pa

随机推荐