#hash-table #dht #kademlia #distributed #table #hash

kad

基于泛型/基于 futures 的 Kademlia 分布式哈希表 (DHT) 的实现

9 个版本 (5 个破坏性更新)

0.6.1 2021 年 8 月 6 日
0.6.0 2021 年 1 月 11 日
0.5.0 2020 年 5 月 2 日
0.4.0 2019 年 4 月 15 日
0.1.0 2018 年 12 月 11 日

#3 in #kademlia

每月 40 次下载
用于 dsf-daemon

MIT/Apache

105KB
2.5K SLoC

rust-kad

dtantsur/rust-dht 深度启发的 Kademlia DHT 的泛型/基于 futures 的实现,旨在提供一个简单易用、经过良好测试、依赖性低、基于 futures 的 API,用于使用 DHT 并具有任意通信机制和编码

用法

配置

  • k - 系统级复制参数,定义桶大小和搜索广度
  • 并发性 - 系统级并发参数,同时运行的并行操作数量

状态

GitHub tag Build Status Crates.io Docs.rs

开放问题

进行中

组件

  • 接收消息

    • 更新适当的 k-桶
      • 如果桶不满则添加节点
      • 如果桶满则存储挂起项并 ping 最旧的(如果 > 看到时间)
    • 对 Ping 响应 NoResult
    • 对 FindNodes 响应 NodesFound
    • 对 FindValues 响应 NodesFound 或 ValuesFound
    • 对于新节点,如果自己的 ID 比已知的附近节点更接近密钥,则发送 STORE RPC
  • 搜索 - 大多数操作的共同点

    • 选择 alpha 最接近的节点
    • 向所选节点子集发送 RPC
    • 如果没有合适的响应,则扩展到 k 个最接近的节点
    • 递归直到从 k 个最接近的节点收到响应
  • 查找节点

    • 使用 FIND_NODE RPC 进行搜索
    • 返回节点
  • 查找值

    • 使用 FIND_VALUE RPC 进行搜索
    • 收集值
    • 值返回后,在观察到的最接近节点存储 (k, v) 对,该节点未返回值
  • 存储值

    • 使用 FIND_NODE RPC 进行搜索
    • 向 k 个最接近的节点发送 STORE RPC
  • 连接

    • 将已知节点插入适当的 k-桶
    • 对自己 ID 执行 Find Node 查找
    • 刷新比最近邻更远的所有 k-桶
  • 维护

    • 删除无响应/旧的联系人
    • 过期值
      • 定义时间后的基本过期
      • 缓存过期与当前节点和最接近密钥 ID 节点之间的节点数成指数反比
    • 刷新 k-桶
      • 在可配置周期内未查询过的任何桶中查找FIND_NODES到随机ID
    • 重新发布值
      • 以定义的周期(每小时)将RPC存储到K个节点
      • 除非在同一周期内收到存储RPC
    • 实现桶拆分(如果比现有方法更有效?)
      • 对维护有用/不需要消息未使用的桶
    • 为维护目的在桶中反向/生成随机ID

问题

  • FindValues通常如何处理每个ID可以有多个值的情况?
  • 是否存在当源ID比本地ID更接近请求者ID时,STORE有效的情况?
    • 这似乎可以忽略

依赖关系

~6MB
~101K SLoC