添加新节点到Kademlia,构建Kademlia路由表

11

我还不能完全理解Kademlia DHT的加入过程。我在网上看过一些教程和演示,但它们似乎都以相同的方式表述,并且大部分伪代码也都是相同的(实际上复制/粘贴)。

有没有人可以简单地概括一下这个过程?

2个回答

25

我假设您已经阅读了Kademlia 论文。以下是我文章《Kademlia DHT简介及其工作原理》的摘录。

背景信息:

  1. 当您运行 Kademlia 网络时,应始终存在一个每个其他节点都知道以加入网络的节点;让我们称之为引导节点 BN

  2. K 是一个决定节点路由表中 Bucket 的大小以及数据存储在多少个节点上的 Kademlia 常量。

加入过程:

  1. 创建具有 NodeId(由某种方法分配)和 IP 地址(托管它的计算机的 IP)的新节点 NN

  2. NNBN 发送 LookupRequest(A.NodeId)。查找请求基本上是询问接收节点对给定 NodeId 知道的 K 个最接近的节点,在这种情况下,BN 将返回对 NN 最接近的节点。

  3. BN 现在将 NN 添加到其路由表中,因此 NN 现在已加入网络。

  4. NNBN 接收到与自身最接近的 K 个节点列表。 NNBN 添加到其路由表中。

  5. NN现在向从 BN 接收到的这些K个节点进行Ping,并将回复的节点添加到根据距离必要的Bucket中的其路由表中。通过Ping这些节点,它们也了解到NN的存在并将NN添加到其路由表中。

  6. NN现在已连接到网络并为网络上的节点所知。

  7. 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 中(参见我的Kademlia实现),我这样做是为了让每个节点在加入网络时对网络有更好的了解。
    我在 《Kademlia DHT 简介及其工作原理》 中写了一个完整的介绍。

有没有可能简化一下这个过程?第二步可以是NN将BN添加到自己的路由表中,并在自身上执行查找操作。因此,k个邻居将意识到新节点并将其添加到自己的路由表中。我认为这种方法可以避免我们执行额外的ping操作。 - nz_21

-3

1
我会把你的答案标记为正确,因为你是唯一回答并且赏金还有一个小时就到期了,但更多信息会更棒。我喜欢使用三角形邻近搜索的想法,你能提供相关信息的链接吗? - JSON
1
唉,那个奖励白费了。答案不正确,链接也是404错误。 - the8472
@the8472:请随意提供更好的答案! - Micromega

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接