Kademlia 分布式存储路由算法了,DHT的一种,P2P广泛使用的一种节点发现查找算法

1. 要素

节点ID:即NodeID,160bit

信息:<key, value>   key是存储信息的hash值,

2. 距离

Kad算法定义了一种逻辑距离的计算方法,两个NodeID 进行XOR异或操作,结果作为距离值,例如节点a的ID  0010001,节点b的ID 0010010,则ab距离为 0010001 XOR 0010010 == 3, 节点c的ID 0001001,则ac距离为 24。

信息存储在与key相等的NodeID,或者与key距离最近的节点上

3. 目的

查找节点,查找vlaue

4. 路由表

每个节点维护一份路由表,每个路由表,有多个list组成,list个数由NodeID bits数组成,NodeID 160bits,与其他节点ID相比,拥有不同比特数的个数有0~159种,即list有160个,又规定每个list中最多有k个信息,所以也叫k-桶

所以由下表:

从高位向低位看160bit,

list 0:  前面159bit相同,第160bit不同      原始NodeID 为xxxxxxxxx...xxxx0

xxxxxxxxx...xxxx0

xxxxxxxxx...xxxx1    ---->  只有1个,距离为1,即 [1,2)

list 1: 前面158bit相同,第159bit不同       原始NodeID 为xxxxxxxxx...xxx00

xxxxxxxxx...xxx00

xxxxxxxxx...xxx10

xxxxxxxxx...xxx11    ----> 有2个,距离为2,3, 即[2,4)

list 2: 前面157bit相同,第158bit不同      原始NodeID 为xxxxxxxxx...xx000

xxxxxxxxx...xx000

xxxxxxxxx...xx100

xxxxxxxxx...xx101

xxxxxxxxx...xx110

xxxxxxxxx...xx111   ----->有4个,距离为4,5,6,7 即[4,8)



list159: 前面第1bit不同

000000000...00000

1yyyyyyyyy...yyyyyy  ---- y的组合有2的159次方个,距离从2的159次方~2的160次方个, 最多取k个。

5. K-桶更新

list里面节点,根据访问时间尽心排位,最新访问的放在尾部,最久访问的放在头部

收到节点的NodeID, 计算本节点与新节点的距离,找到对应的list

如果list里面有该节点,则把该节点移到尾部

如果list里面没有该节点

list里面不足k个,添加新节点到尾部

list里面超过k个,对list 头部节点进行访问,

如果头部节点没有回应,则移除,把新节点加到尾部

如果头部节点回应,移到尾部,忽略新节点

6. Kad 4种RPC:PING  STORE  FIND_VALUE  FIND_NODE

PING:  探测一个Node是否在线

STORE: 以<key,value>为参数,通知另一个node保存,以供以后取用

FIND_NODE: 以ID或key为参数,接收者返回它所知道的距离该ID最近的k个Node的信息,k个node不一定来自一个k-桶list,除非它所有的k-桶中node总数不足k个,否则要凑足k个

FIND_VALUE: 以ID或者key为参数,如果接收者前面收到过STORE,key正好是前面收到的<key value>, 则返回这个value,如果没有,就按照FIND_NODE流程,返回k个距离最近的Node的信息

另外所有的RPC消息中都有随机数,返回时要保持不变,用来做验证

7. 节点查找(node lookup): 找到距离给定的ID最近的k个node

定义并发数a,

从最近的k-桶中取出a个最近的node,然后向a个node并行发送,异步FIND_NODE消息

从上一步收到回复后,就可以再发送FIND_NODE给返回的Node,

查询结束,发送者已经向K个最近的node发了消息并收到回应

8. 存储<key value>: 

先用node lookup查找到k个最近的node

然后向他们发送STORE命令

9. 查找<key value>

使用FIND_VALUE代替FIND_NODE 进行 node lookup, 一旦有其他node返回了要的value,就结束

10. node加入网络:

首先获得一个已经在网络中的node

把它加入到k-桶

然后对自己的ID进行lookup

刷新所有的k-桶

Kademlia算法 理解 总结相关推荐

  1. 易懂分布式 | Kademlia算法

    转载自:https://www.jianshu.com/p/f2c31e632f1d 近年来,区块链技术(部分人更愿意称之为分布式账本技术)的走红将分布式技术的概念带入大众的视野.区块链技术之所以备受 ...

  2. SVPWM算法理解(二)——关于非零基本矢量幅值和线电压幅值的解释

    SVPWM算法理解(二)--关于非零基本矢量幅值和线电压幅值的解释 1 引言 2 非零基本矢量的幅值 3 线电压的幅值 4 电压空间矢量图中的图形含义 5 如何保证逆变器的输出电压不失真 1 引言   ...

  3. FP-Growth算法理解

    FP-Growth算法理解 基本概念 FP-Growth 全称: Frequent Pattern Growth--频繁模式增长 在整个算法执行过程中,只需要遍历数据集2次,就可完成频繁模式的发现 F ...

  4. 强化学习算法DQN:算法简介、创新点:回放机制target-network、伪代码、算法理解、代码实现、tensorboard展示网络结构

    文章目录 DQN简介 DQN目标 Q-learning与DQN Loss Function 创新点:回放机制&target-network 算法伪代码 算法理解 代码实现 tensorboar ...

  5. SVM算法理解以及编程练习

    SVM算法理解以及编程练习 支持向量机 如何找到超平面 最大间隔分类器 代码练习理解 代码1 代码2 代码3 代码4 支持向量机 支持向量机就算法作为机器学习的经典算法,从被提出后快速发展,在很多场景 ...

  6. FP-growth算法理解和实现

    FP-growth算法理解 FP-growth(Frequent Pattern Tree, 频繁模式树),是韩家炜老师提出的挖掘频繁项集的方法,是将数据集存储在一个特定的称作FP树的结构之后发现频繁 ...

  7. (一)反向传播算法理解 (Back-Propagation)

    本文参考deeplearningbook.org一书第六章  6.5 Back-Propagation and Other Differentiation Algorithms 反向传播算法分为两篇来讲 ...

  8. Marching Cubes算法理解

    背景知识 Marching Cubes算法是三维离散数据场中提取等值面的经典算法,其主要应用于医学领域的可视化场景,例如CT扫描和MRI扫描的3D重建等. 等值面 空间中所有具有某个相同值的点的集合, ...

  9. Bresenham算法理解

    Bresenham bresenham算法是计算机图形学中为了"显示器(屏幕或打印机)系由像素构成"的这个特性而设计出来的算法,使得在求直线各点的过程中全部以整数来运算,因而大幅度 ...

最新文章

  1. 【公开课预告】AutoML知多少
  2. php redis support,PHP 使用 Redis
  3. String,StringBuffer和StringBuilder区别?
  4. message from server: Host 'XXXX' is not allowed to connect to this MySQL server
  5. x86异常处理与中断机制(3)中断处理过程
  6. 8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8。
  7. Dynamic动态类型
  8. 对刚iPad!华为最强Pad发布,独揽四项全球第一,3299元起!
  9. java文件下载代码_Java代码实现文件下载
  10. 【机器学习】Pima数据集的可视化
  11. Atitit office ooxml 系列 excel的读取api 框架 poi的使用
  12. 基于python的图书管理系统设计与实现论文_图书管理系统的设计与实现图书管理系统论文...
  13. 白噪声的matlab程序,matlab产生白噪声信号
  14. Matlab 实现串口助手
  15. Android 颜色代码收集
  16. 常微分方程各种类型方程表格汇总
  17. 图片处理--羽化特效
  18. Android 11 内置原生壁纸!速度来取
  19. 乾坤物联-UWB定位基站和定位信标的区别
  20. java模仿银行账务业务_Java基础案例 - 模拟银行存取款业务

热门文章

  1. jQuery实现的分页功能,包括ajax请求,后台数据
  2. 2017校招题目 混合颜料
  3. 关于D3D11,你必须了解的几件事情
  4. 三链列 Swordfish 和 四链列 Jellyfish
  5. 西电研究生毕业论文latex模板使用指南
  6. Linux多线程编程-线程函数返回值(返回简单数据类型)
  7. pdf转换成excel转换器有哪些
  8. 流氓软件的dll文件和explorer.exe(文件资源管理器)绑定
  9. 解决锐捷校园网环境下VMware虚拟机无法上网问题
  10. C/C++个人帐本管理系统