如何理解Kademlia节点操作的时间复杂度

时间:2015-03-12 08:13:46

标签: algorithm time-complexity proof dht kademlia

我现在通过阅读经典论文Kademlia: A Peer-to-peer Information System Based on the XOR Metric来学习Kademlia网络。我想了解其操作的复杂性,但仍然无法弄明白。

3 Sketch of proof 部分中,本文给出了两个定义:

  1. 节点深度(h):160 - i,其中i是最小的索引 一个非空桶
  2. 节点y在节点x中的存储桶高度:x将插入的存储桶的索引y减去x的最不重要的空存储桶的索引
  3. 三个结论:

    1. 对于具有n个节点的系统,任何给定节点的高度都会以极大的概率在 log n 的常量内。
    2. 最近节点与第k个节点中的ID最近的节点的桶高可能在 log k 的常量范围内。
    3. 如果此节点的h 最重要的k-buckets 都不为空,则查找过程将在每个步骤中找到一半接近(或者更确切地说其距离缩短一点)的节点,从而在 h - log k 步骤中打开节点。
    4. 所以我的问题是:

      1. 什么是“最不重要的空桶”“最重要的k-buckets”
      2. 如何以直观方式解释深度铲斗高度
      3. 如何理解第二和第三个结论,比如,为什么 log k h - log k

1 个答案:

答案 0 :(得分:2)

我已经有一段时间了,因为我实际阅读了这篇论文,所以我主要从我的实施经验中将这些概念拼凑在一起,而不是试图将我脑子里的概念与正式定义相匹配在论文中,所以采取以下一点盐的方法


  

什么是#34;最不重要的空桶"和#34;最重要的k-buckets"?

这基本上是指相对于节点自身ID的XOR距离排序的桶

  

如何以视觉方式解释深度和铲斗高度?

每个桶都覆盖一个键空间区域。例如。从0x0000 简化到2个字节到0x0FFF,用于1/16的键空间。这可以用类似CIDR的掩码表示,0x0 / 4(4个前缀位)。 这或多或少是桶的深度。

有几种方法可以组织路由表。 "正确"方法是根据存储桶表示的最低ID将其表示为树或排序列表。 这种方法允许任意桶拆分操作,因为一些路由表优化需要,也可以用于实现节点多宿主。

简化的实现可以改为使用固定长度的阵列并且将每个桶放在相对于节点自己的ID的共享前缀位的位置处。即数组中的位置0将具有0个共享前缀位,它是最远的桶,桶覆盖50%的密钥空间,而桶中最高有效位是节点的反向MSB。自己的身份证。

在这种情况下,深度就是阵列位置。

  

如何理解第二个和第三个结论,比如说,为什么记录k和h-log k?

假设您正在寻找离您自己节点ID最远的ID。然后你将只有一个桶覆盖键空间的那一部分,即它将覆盖一半的键空间,其中最重要的一点与你的不同。 所以你问那个桶中的一个(或几个)节点。凭借其具有与查找目标共同的第一位的ID位,它们或多或少地保证具有两个或更多个的分割,即具有目标空间的密钥空间覆盖的至少两倍。因此,他们可以提供至少1位更好的信息。

当你向目标查询更近的节点时,他们在目标区域附近也会有更好的密钥空间覆盖范围,因为它们也更接近他们自己的节点ID。

冲洗,重复直至找不到更近的节点。

由于每次跳过一次至少1比特的距离,你基本上需要一个O(log(n))跳数,其中n是网络大小。由于网络大小基本上决定了节点之间的平均距离,因此您的家庭存储桶需要桶深度。

如果目标键更接近您自己的ID,您将需要更少的步骤,因为您可以更好地覆盖键区的该区域。

由于 k 是一个常量(每桶的节点数),因此 log k 。将存储桶中的节点数量加倍,并且它具有给定键空间区域的两倍的分辨率,因此(概率地)将产生比具有k / 2大小的存储桶更接近目标的节点。即对于每个要保存的每个额外位,每个桶的条目数必须加倍。


编辑:这是一个实际的单宿主bittorrent DHT路由表的可视化,按其前缀排序,即不相对于本地节点ID:

Node ID: 2A631C8E 7655EF7B C6E99D8A 3BF810E2 1428BFD4
buckets: 23 / entries: 173
000...   entries:8 replacements:8
00100...   entries:8 replacements:0
0010100...   entries:8 replacements:2
0010101000...   entries:8 replacements:4
00101010010...   entries:8 replacements:7
001010100110000...   entries:8 replacements:3
0010101001100010...   entries:8 replacements:3
00101010011000110000...   entries:8 replacements:1
001010100110001100010...   entries:3 replacements:0
0010101001100011000110...   entries:6 replacements:0
0010101001100011000111...   entries:6 replacements:0
0010101001100011001...   entries:8 replacements:2
001010100110001101...   entries:8 replacements:1
00101010011000111...   entries:8 replacements:2
00101010011001...   entries:7 replacements:0
0010101001101...   entries:8 replacements:0
001010100111...   entries:8 replacements:0
001010101...   entries:8 replacements:1
00101011...   entries:7 replacements:0
001011...   entries:8 replacements:0
0011...   entries:8 replacements:8
01...   entries:8 replacements:8
1...   entries:8 replacements:8