【问题标题】:Understnading of Kadelmia k-bucket splitKademlia k-bucket split 的理解
【发布时间】:2019-07-21 15:48:42
【问题描述】:

我重新设计了使用 k-buckets 的“平面模型”构建的系统(P2P 应用程序)——每个距离都有自己的 k-backet。距离是标识符的长度减去共享前缀的长度(XOR)。这里一切都清楚了。

现在我们想使用二叉树来保存桶(如上一个 Kadelmia 文档)。 当我们“寻找桶”以放入新联系人时,树方法不会“直接”处理距离。这让我感到困惑,因为论文说如果新节点更接近本地然后 K-closest,则应该拆分 k-bucket节点。

我的问题:在这种情况下如何计算距离?它不能是桶的前缀(路径),因为桶可能包含不同前缀的节点。

找到K-最近节点的便捷方法是什么?

提前致谢。

【问题讨论】:

    标签: p2p kademlia


    【解决方案1】:

    它不能是桶的前缀(路径),因为桶可能包含具有不同前缀的节点。

    在树形布局中,每个桶都有一个前缀,但它并不隐含在路由表数据结构中的位置,而是必须在拆分和合并操作期间显式跟踪,例如作为基地址加前缀长度,类似于 CIDR 表示法。

    一个空路由表以覆盖整个键空间的前缀(即 0x00/0)开始,经过一些拆分后,其中一个存储桶可能覆盖范围 0x0CFA0 - 0x0CFBF,即存储桶前缀 0x0CFA/15。

    this answer on another question which contains an example routing table layout

    另外查看a simple and more advanced bucket splitting algorithm的这个答案

    如何找到给定 ID 的匹配存储桶取决于使用的数据结构。排序列表需要二分查找,具有最近查找的 Patricia-Trie 是另一种选择。只要您不必每秒处理太多操作,即使是蛮力方法也足够了。

    【讨论】:

    • 首先感谢您的链接。我使用第二个链接描述的算法。我使用简单的二叉树,发现“找到第 k 个最接近”并不像平面布局那样简单。
    • 您可以简单地对路由表进行线性扫描,并检查存储桶前缀是否覆盖了键。或者使用特里。如果您需要为 k-closest 集找到多个存储桶,您可以使用this algorithm 或者只是对整个路由表进行贪婪累积。这取决于您的性能要求。现实世界的表最多有几百个条目,每秒需要处理几个数据包,因此在许多情况下,即使是次优算法也足够了。编辑:更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2022-12-26
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多