我无法完全理解 Kademlia DHT 的加入过程。我在网上看过一些教程和演示文稿,但它们似乎都以相同的方式说东西,并且所有psedo代码等在大多数情况下都是相同的(实际复制/粘贴)。
有人可以对此进行高级别的介绍吗?
我假设你已经阅读了Kademlia 论文。这是我的文章Kademlia DHT 简介及其工作原理的摘录
一些背景资料:
当您运行 Kademlia 网络时,应该始终有一个其他节点都知道的节点,以便它们加入网络;让我们称之为 Bootstrap 节点BN
。
K
是一个 Kademlia 常量,它决定了节点路由表中 Buckets 的大小以及应该存储一段数据的节点数量。
加盟流程:
NN
使用 NodeId(通过某种方法分配)和 IP 地址(托管它的计算机的 IP)创建一个新节点。
NN
发送LookupRequest(A.NodeId)
到BN
. 查找请求基本上向接收节点询问它知道给定 NodeId 的 K-最近节点。在这种情况下,BN
会将它知道的 K-最近节点返回给NN
.
BN
现在将添加NN
到它的路由表中,因此NN
现在在网络中。
NN
从 接收到自己的 K-最近节点列表BN
。NN
添加BN
到它的路由表。
NN
现在 ping 从 接收到的这些 K 个节点BN
,并且根据距离将回复的节点添加到它的路由表中的必要存储桶中。通过 ping 这些节点,它们还了解NN
存在并添加NN
到它们的路由表中。
NN
现在已连接到网络并为网络上的节点所知。
NN
现在循环遍历它的每个 K-Bucket
foreach(K-Buckets as KB)
1. NN generates a random NodeId `RNID` // A NodeId that will be in KB
2. NN sends LookupRequest(RNID) to the K-Closest nodes it knows to RNID.
3. The response will be K nodes closest to RNID.
4. NN now fills KB.
NN
为每个桶执行此操作以填充这些桶。经过此操作后,NN
可以更好地了解网络上距自身不同距离的节点。
注意:这一步不是强制性的,但是我在我的 Kademlia 实现中这样做了,以便每个节点在加入时对网络有更好的了解。
我在An Introduction to Kademlia DHT & How It Works中写了一篇关于 Kademlia 的完整介绍
我的猜测是它使用一些超级节点和地理空间信息来计算最小生成树。它还可以从超级节点计算 voronoi 图或对偶 delaunay 三角剖分,并使用它来运行邻近搜索。这是一个示例: http: //www.mathworks.de/de/help/matlab/math/spatial-searching.html。