我无法完全围绕Kademlia DHT的加入过程。我在网上看过一些教程和演示文稿,但它们似乎都以相同的方式说出来,并且所有psedo代码等在大多数情况下都是相同的(实际复制/粘贴)。
有人可以对此进行高级别的讨论吗?
答案 0 :(得分:17)
我假设您已阅读Kademlia paper。这是我的文章An Introduction to Kademlia DHT & How It Works
的摘录一些背景信息:
当您运行Kademlia网络时,应始终存在每个其他节点都知道的节点,以便它们加入网络;我们称之为Bootstrap节点BN
。
K
是一个Kademlia常量,用于确定节点路由表中Buckets的大小以及应存储一个Data的节点数量。
加入流程:
使用NodeId(通过某种方法分配)和IP地址(托管在其上的计算机的IP)创建新节点NN
。
NN
向LookupRequest(A.NodeId)
发送BN
。查找请求基本上向接收节点询问它知道的给定NodeId的K-Closest节点。在这种情况下,BN
会将其知道的K-Closest节点返回到NN
。
BN
现在会将NN
添加到其路由表中,因此NN
现在位于网络中。
NN
从BN
收到自身的K-Closest节点列表。 NN
将BN
添加到其路由表中。
NN
现在对从BN
收到的这些K节点进行ping操作,并根据距离将回复的节点添加到必要存储桶中的路由表中。通过ping这些节点,他们还了解NN
存在并将NN
添加到其路由表中。
NN
现已连接到网络,并为网络上的节点所知。
NN
现在遍历每个K-Buckets
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
可以更好地了解网络上距离自身不同距离的节点。
注意:此步骤不是必需的,但是我在My Implementation of Kademlia中执行了此操作,以便每个节点在加入时都能更好地了解网络。
答案 1 :(得分:-1)
我的猜测是它使用一些超级节点和地理空间信息来计算最小生成树。它还可以从超级节点计算voronoi图或双重delaunay三角剖分,并使用它来运行邻近搜索。以下是一个示例:http://www.mathworks.de/de/help/matlab/math/spatial-searching.html。