据我所知,Kademlia路由表由160个桶组成。
根据节点的前缀长度(本地节点密钥和节点的XOR中的前导未设置位数),将节点放入0-159个桶中。
为什么会这样,是否有任何性能优势(除了迭代160 * 20节点以找到最接近的是不可行的事实)?
答案 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桶组成。