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

时间:2013-10-12 02:05:43

标签: p2p dht kademlia

我无法完全围绕Kademlia DHT的加入过程。我在网上看过一些教程和演示文稿,但它们似乎都以相同的方式说出来,并且所有psedo代码等在大多数情况下都是相同的(实际复制/粘贴)。

有人可以对此进行高级别的讨论吗?

2 个答案:

答案 0 :(得分:17)

我假设您已阅读Kademlia paper。这是我的文章An Introduction to Kademlia DHT & How It Works

的摘录

一些背景信息:

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

  2. K是一个Kademlia常量,用于确定节点路由表中Buckets的大小以及应存储一个Data的节点数量。

  3. 加入流程:

    1. 使用NodeId(通过某种方法分配)和IP地址(托管在其上的计算机的IP)创建新节点NN

    2. NNLookupRequest(A.NodeId)发送BN。查找请求基本上向接收节点询问它知道的给定NodeId的K-Closest节点。在这种情况下,BN会将其知道的K-Closest节点返回到NN

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

    4. NNBN收到自身的K-Closest节点列表。 NNBN添加到其路由表中。

    5. NN现在对从BN收到的这些K节点进行ping操作,并根据距离将回复的节点添加到必要存储桶中的路由表中。通过ping这些节点,他们还了解NN存在并将NN添加到其路由表中。

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

    7. 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中执行了此操作,以便每个节点在加入时都能更好地了解网络。

    8. 我在An Introduction to Kademlia DHT & How It Works

      写了一篇关于Kademlia的完整介绍

答案 1 :(得分:-1)

我的猜测是它使用一些超级节点和地理空间信息来计算最小生成树。它还可以从超级节点计算voronoi图或双重delaunay三角剖分,并使用它来运行邻近搜索。以下是一个示例:http://www.mathworks.de/de/help/matlab/math/spatial-searching.html