Kademlia算法 理解 总结
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算法 理解 总结相关推荐
- 易懂分布式 | Kademlia算法
转载自:https://www.jianshu.com/p/f2c31e632f1d 近年来,区块链技术(部分人更愿意称之为分布式账本技术)的走红将分布式技术的概念带入大众的视野.区块链技术之所以备受 ...
- SVPWM算法理解(二)——关于非零基本矢量幅值和线电压幅值的解释
SVPWM算法理解(二)--关于非零基本矢量幅值和线电压幅值的解释 1 引言 2 非零基本矢量的幅值 3 线电压的幅值 4 电压空间矢量图中的图形含义 5 如何保证逆变器的输出电压不失真 1 引言 ...
- FP-Growth算法理解
FP-Growth算法理解 基本概念 FP-Growth 全称: Frequent Pattern Growth--频繁模式增长 在整个算法执行过程中,只需要遍历数据集2次,就可完成频繁模式的发现 F ...
- 强化学习算法DQN:算法简介、创新点:回放机制target-network、伪代码、算法理解、代码实现、tensorboard展示网络结构
文章目录 DQN简介 DQN目标 Q-learning与DQN Loss Function 创新点:回放机制&target-network 算法伪代码 算法理解 代码实现 tensorboar ...
- SVM算法理解以及编程练习
SVM算法理解以及编程练习 支持向量机 如何找到超平面 最大间隔分类器 代码练习理解 代码1 代码2 代码3 代码4 支持向量机 支持向量机就算法作为机器学习的经典算法,从被提出后快速发展,在很多场景 ...
- FP-growth算法理解和实现
FP-growth算法理解 FP-growth(Frequent Pattern Tree, 频繁模式树),是韩家炜老师提出的挖掘频繁项集的方法,是将数据集存储在一个特定的称作FP树的结构之后发现频繁 ...
- (一)反向传播算法理解 (Back-Propagation)
本文参考deeplearningbook.org一书第六章 6.5 Back-Propagation and Other Differentiation Algorithms 反向传播算法分为两篇来讲 ...
- Marching Cubes算法理解
背景知识 Marching Cubes算法是三维离散数据场中提取等值面的经典算法,其主要应用于医学领域的可视化场景,例如CT扫描和MRI扫描的3D重建等. 等值面 空间中所有具有某个相同值的点的集合, ...
- Bresenham算法理解
Bresenham bresenham算法是计算机图形学中为了"显示器(屏幕或打印机)系由像素构成"的这个特性而设计出来的算法,使得在求直线各点的过程中全部以整数来运算,因而大幅度 ...
最新文章
- 【公开课预告】AutoML知多少
- php redis support,PHP 使用 Redis
- String,StringBuffer和StringBuilder区别?
- message from server: Host 'XXXX' is not allowed to connect to this MySQL server
- x86异常处理与中断机制(3)中断处理过程
- 8255总线实验 编写程序利用8255扩展单片机的IO口,控制8位数码管显示1-8。
- Dynamic动态类型
- 对刚iPad!华为最强Pad发布,独揽四项全球第一,3299元起!
- java文件下载代码_Java代码实现文件下载
- 【机器学习】Pima数据集的可视化
- Atitit office ooxml 系列 excel的读取api 框架 poi的使用
- 基于python的图书管理系统设计与实现论文_图书管理系统的设计与实现图书管理系统论文...
- 白噪声的matlab程序,matlab产生白噪声信号
- Matlab 实现串口助手
- Android 颜色代码收集
- 常微分方程各种类型方程表格汇总
- 图片处理--羽化特效
- Android 11 内置原生壁纸!速度来取
- 乾坤物联-UWB定位基站和定位信标的区别
- java模仿银行账务业务_Java基础案例 - 模拟银行存取款业务