我还不能完全理解Kademlia DHT的加入过程。我在网上看过一些教程和演示,但它们似乎都以相同的方式表述,并且大部分伪代码也都是相同的(实际上复制/粘贴)。
有没有人可以简单地概括一下这个过程?
我假设您已经阅读了Kademlia 论文。以下是我文章《Kademlia DHT简介及其工作原理》的摘录。
背景信息:
当您运行 Kademlia 网络时,应始终存在一个每个其他节点都知道以加入网络的节点;让我们称之为引导节点 BN
。
K
是一个决定节点路由表中 Bucket 的大小以及数据存储在多少个节点上的 Kademlia 常量。
加入过程:
创建具有 NodeId(由某种方法分配)和 IP 地址(托管它的计算机的 IP)的新节点 NN
。
NN
向 BN
发送 LookupRequest(A.NodeId)
。查找请求基本上是询问接收节点对给定 NodeId 知道的 K 个最接近的节点,在这种情况下,BN
将返回对 NN
最接近的节点。
BN
现在将 NN
添加到其路由表中,因此 NN
现在已加入网络。
NN
从 BN
接收到与自身最接近的 K 个节点列表。 NN
将 BN
添加到其路由表中。
NN
现在向从 BN
接收到的这些K个节点进行Ping,并将回复的节点添加到根据距离必要的Bucket中的其路由表中。通过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
对于距离它不同距离的网络节点有了更好的了解。