为什么Kademlia如何构建其路由表呢?

时间:2012-06-30 09:23:55

标签: routing p2p dht kademlia

据我所知,Kademlia路由表由160个桶组成。

根据节点的前缀长度(本地节点密钥和节点的XOR中的前导未设置位数),将节点放入0-159个桶中。

为什么会这样,是否有任何性能优势(除了迭代160 * 20节点以找到最接近的是不可行的事实)?

2 个答案:

答案 0 :(得分:5)

Kademlia使用2个节点ID的XOR作为它们相距距离的度量。使用路由表存储桶的想法是,节点具有网络“详细”知识,并且知道您从ID中获得的信息越多。

要查找最接近特定键的一组节点,节点首先会从其自己的路由表中查询它知道的最接近的节点。平均而言,这些查找中的一半将落入存储桶0所覆盖的地址空间中。但该存储桶仅允许包含20个节点,因此这些节点实际上最接近的几率很小。但是,该存储桶中的每个节点都将具有该部分地址空间的更详细知识,并且很可能能够从其自己的路由表中提供更好的关闭节点列表,然后也可以查询这些节点,依此类推。

通过这种方式,迭代查找可以非常快速地进入实际最接近的节点组。

当你说

  

遍历160 * 20个节点以找到最接近的是不可行的

我认为你的意思是实际查询每一个都是不可行的;因为迭代这样的列表来提取最接近的列表正是由节点处理查找请求(RPC)的方式。

请注意,在实际场景中,桶的数量不太可能达到160左右。例如,对于十亿个节点的网络,平均桶数将为27。

至于在原始Kademlia论文中选择的实际值,我不知道为什么将桶大小指定为20.但是,我认为160是从SHA1散列的位大小派生的。通常,散列函数用于生成要存储的给定值的密钥。如果使用SHA1进行哈希冲突的风险相当低,那么这很好。如果不是,则可以使用不同的散列算法,例如, SHA256最多可以产生256个桶。

答案 1 :(得分:3)

  

为什么会这样,是否有任何性能上的好处

此组织与XOR度量标准相结合,可创建分层局部性,从而保证在更接近目标的情况下查询节点将知道更近的节点。这会产生指数收敛。

也许您可以将其视为分布式区间搜索。

  

据我所知,Kademlia路由表由160个桶组成。

(最多)160个桶的平面数组只是许多实现用于近似正确路由表布局的原始方式。

使用存储桶拆分或多宿主路由表,您需要一个实际的树形布局,其中可能包含超过160个存储桶。

实际上,这是多宿主DHT节点的基于树的路由表的一小部分,具有89个节点ID,整个表大于那个(这些基本上是89个ID中的两个的区域):

0000000...   entries:8 replacements:8
0000001000...   entries:8 replacements:8
0000001001000...   entries:8 replacements:8
00000010010010...   entries:8 replacements:8
00000010010011000...   entries:8 replacements:8
000000100100110010...   entries:8 replacements:8
0000001001001100110...   entries:8 replacements:8
00000010010011001110...   entries:8 replacements:8
0000001001001100111100...   entries:5 replacements:0
0000001001001100111101...   entries:8 replacements:0
000000100100110011111...   entries:8 replacements:0
0000001001001101...   entries:8 replacements:8
000000100100111...   entries:8 replacements:8
000000100101...   entries:8 replacements:8
00000010011...   entries:8 replacements:8
000000101...   entries:8 replacements:8
00000011...   entries:8 replacements:8
0000010...   entries:8 replacements:8
0000011000...   entries:8 replacements:8
0000011001000...   entries:8 replacements:8
00000110010010...   entries:8 replacements:8
00000110010011000...   entries:8 replacements:8
000001100100110010...   entries:8 replacements:8
0000011001001100110...   entries:8 replacements:8
00000110010011001110...   entries:8 replacements:5
0000011001001100111100...   entries:6 replacements:0
0000011001001100111101...   entries:2 replacements:0
000001100100110011111...   entries:8 replacements:0
0000011001001101...   entries:8 replacements:8
000001100100111...   entries:8 replacements:8
000001100101...   entries:8 replacements:8
00000110011...   entries:8 replacements:8
000001101...   entries:8 replacements:8
00000111...   entries:8 replacements:8

它的查找缓存更大,由7k桶组成。