3

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

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

以下是我目前所了解的(我希望填补一些空白):

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

在这一点上,我有很多节点的 ID 更接近我自己的 ID,而关于 info_hash'es 的信息我并不真正感兴趣。

恐怕我有一个巨大的愚蠢问题:我为什么这样做?

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

我应该创建多个树吗?一个给我(在那里将 info_hashes 的信息保存到更靠近我的 nodeID 人们发送给我的位置),以及另一个更靠近我的每个目标 info_hashes 的树,以便我可以检索他们的信息?

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

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

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

4

1 回答 1

4

所以,我决定从 DHT 开始,这似乎是更复杂的部分,而且记录也更少。

需要阅读由 Peter Maymounkov 和 David Mazieres 撰写的原始 kademlia 论文“Kademlia: A Peer-to-peer Information System Based on the XOR Metric”。它在 BEP-5 中很早就被引用了

如果我收到带有 info_hash 的announce_peer,那么我应该将其信息保存在本地数据库中(发件人的 info_hash 和 ip/port)

只有当它们包含先前通过 分发的令牌时,您才接受通知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 论文中找到。

于 2017-05-26T13:51:46.337 回答