在我的新周末项目中,我决定从头开始编写一个 BitTorrent 客户端,根本没有准备好使用库。经过两天寻找文档后,我已经准备放弃了:smile:。我知道有BEPs http://www.bittorrent.org/index.html,但它们还远远不足以理解所有规范。在阅读了更多内容之后,我认为跟踪器和对等协议似乎很旧并且易于理解/实现(是的,我知道,要编写具有平衡、对等选择、优化的良好代码,这并不容易,正如我刚才所说的,但我只想做基础知识来学习,而不是与那里的数十个优秀客户竞争。)
因此,我决定从 DHT 开始,这似乎是更复杂的部分,而且文档也更少。当您停止寻找 bittorrent DHT 或主线 DHT 并开始寻找 kademlia DHT 时,您会获得更多信息,但如何将它们组合在一起并不那么明显。
以下是我到目前为止的理解(还有一些我希望填补的空白):
- 我从我的 DHT 树开始为空
- use
find_nodes
在我的引导节点上
- 将接收到的节点添加到我自己的树中,这样我就可以选择更接近我自己的 ID 的节点
- 开始发行
find_nodes
到选定的人并将他们的回应添加到我的树中
- 返回 3 直到我停止接收未知/新节点
- 如果我收到
announce_peer
与info_hash
我应该将其信息保存在本地数据库上(发送者的 info_hash 和 ip/端口)
- 如果一个节点使用
get_peers
与info_hash
我在我的数据库中有,然后我发送信息,否则我应该发送我自己的树中更接近的节点列表(最接近该 info_hash)
- 当我使用
get_peers
在其他节点上,我将收到对等点或节点,在后一种情况下,我认为节点更接近info_hash
而不是我自己的nodeId
那么,我应该将这些节点添加到我的树中还是基于它们开始一个新树?
- 当我想宣布我对某个事物感兴趣时
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(使用前将#替换为@)