1

我正在阅读Kademlia 白皮书并尝试实现路由表。

我正在使用 160 位地址空间并有一个​​ 160 k-buckets 的数组。据我了解,此实现将通过节点 ID 具有多少前导零位将节点 ID 存储在存储桶中。即bucket[0],节点 ID 将具有 160 个前导零(只有 1 个节点),并且bucket[159]将具有没有前导零的节点(整个地址空间的 50%)。

问题 使用这个实现,当找到最接近目标 nodeId 的 k 节点时,我会只计算目标的前导零并返回该 k 桶中的所有内容吗?

使用这个实现,我看不到任何地方/不需要使用 Kademlia 构建的 XOR,所以我认为我的实现不正确。

4

1 回答 1

1

首先是一个提示:您链接到的论文是预录版本,仅包含基本草图,没有后期改进。160-bucket 阵列路由表布局是论文证明的简化方法,后来的修订引入了更复杂的基于树的表。

即 bucket[0] 的节点 id 有 160 个前导零(只有 1 个节点),而 bucket[159] 的节点没有前导零(占整个地址空间的 50%)。

好吧,你可以这样做,但只计算异或距离中的前导零并将其用作索引更简单。即 0 个共享前缀位 = 没有 (0) 个前导零 = buckets[0]= 距离您自己的 ID 最远的存储桶。

问题 使用这个实现,当找到最接近目标 nodeId 的 k 节点时,我会只计算目标的前导零并返回该 k 桶中的所有内容吗?

以下假设您正在询问如何回答远程节点的查询。

平面路由表布局中的存储桶是根据您自己的节点 ID 组织的。在回答对某个任意目标 ID 的查询时,这不一定与接近该目标的程度一致。因此,最简单的方法是只扫描路由表中所有填充的存储桶并计算与查询目标地址相关的 N 个最近节点,然后将它们作为响应返回。避免完全扫描需要对 xor 度量进行一些算术运算以找到正确的本地存储桶,但我只为基于树的布局而不是平面布局做到了这一点。

于 2018-06-26T18:50:57.503 回答