Kademlia是一种分布式哈希表(DHT),是第三代对等网络的节点动态管理和路由协议。


构建网络拓扑

Kad网络中的每个节点都会被分配唯一的节点ID,一般是160bit的二进制数。节点之间可以计算距离,节点距离以节点ID的XOR值度量:

因此,节点之间的距离越近,意味着节点ID的公共前缀越长。节点之间的距离以节点的最长公共前缀(cpl)为度量,cpl越大,表示两个节点越接近,例如节点

基于此,一个完整的网络空间可以被表示成为一颗如下图所示的二叉树,树的叶子节点代表网络节点,下图演示了使用3bit作为节点ID位数的节点树结构。

下图展示了从节点 [公式] ​视角来分割上面的网络树的结果:

  • 节点<A, B, C, D>与M的公共前缀长度为0,将其归为一个单元
  • 节点<F, G>与M的公共前缀长度为1,将其归为单元2
  • 节点与M的公共前缀长度为2,将其归为单元3

需要说明的是:距离越长,代表节点之间越接近,千万不要弄反了。而且可以总结发现,从任一节点来看,与其距离为0的节点占据网络节点总数的1/2,距离为1的节点占据网络节点总数的1/4,


构建路由表

假如当前节点ID为​ M ,X ​距离​ M上维护的节点Y的距离为:

其中:

这个证明也很简单:


于是:上面的问题就转化为:
当 M ​收到询问距离​ X 更近的节点请求时,​ M 首先计算自身距离目标节点的距离​

然后再从自己维护的节点列表中选择出距离​M为的d1​的所有节点(翻译一下:即从M的路由表中找到与​有最长公共前缀的所有节点)。

Kademlia协议中,每个节点按照与自己的距离来切割节点网络树:被切割的子树称之为 Bucket。整个路由表本质上便是一个Bucket数组,Kademlia协议以​聚类网络节点:每个Bucket ​中的节点必然与本节点具有相同的最长公共前缀。

由于节点只有160bit,最长公共前缀长度最大只有160,因此,路由表中的Bucket 数量最多也就160。但是每个​ Bucket 内节点数量可能会非常多,根据之前的计算,与节点最长公共前缀长度为0的​内节点数占据网络总节点数量的1/2,​内节点数占网络总节点数的1/4…

Kademlia协议对每个Bucket 内维护的节点数设置了一个上限,称之为​K值,在一般的实现中 ​。一旦​ Bucket 内节点数超过​,便根据一定的淘汰算法进行更新。

根据该基本原理,节点构建的路由表如下图所示:


​分裂

在一些实现Kademlia协议实现中,每个节点初始时只有一个Bucket ​,感知到网络上有节点时,直接将远程节点信息添加至该​,直到该​内节点数量超过​,此时开始分裂 Bucket 。

所谓分裂是指创建一个新的 Bucket ​ ​,然后将原来​ Bucket ​ 内的部分节点迁移至新 Bucket ​ ​。因为原 Bucket ​ ​内的节点与本节点的距离不尽相同,所以,迁移的原则是:将与本地节点更近(即​更大)节点迁移至新建 Bucket ​ ​,迁移完成后再判断新建 Bucket ​ ​内节点数是否超过​限制,如果是,继续对该新建 Bucket ​ ​进行分裂。

上面提到迁移的过程中会将部分节点迁移至新 Bucket ​ ​,那么如何选择这些需要被迁移的节点呢?答案是根据​内节点与本节点之间的cpl决定:

初始状态时,本地只有1个​,此时分裂的目标是:

newBucket := bucket.Split(len(rt.Buckets)-1, rt.local)

在原​ Bucket ​ 中保留与本节点​为0(无任何公共前缀的节点),将其他节点迁移至新 Bucket ​ ​中。

一次分裂后,第一个 Bucket ​ ​中保留的全部是与当前节点无任何公共前缀的节点,第二个 Bucket ​ ​中保留的全部是与当前节点公共前缀大于等于1的节点。

接下来判断第二个​ Bucket ​ 是否需要再次分裂,如果分裂,再次创建新 Bucket ​ ​,然后将第二个​ Bucket ​ 中与本地节点公共前缀超过1的节点迁移至新 Bucket ​ ,与本地节点公共前缀长度为1的节点依然保留在第二个​ Bucket ​ 中。


路由算法

路由算法要解决的是如何根据目标ID找到地址或者找到与该ID最节点的目标节点地址。

在一个对等网络中,某个节点要查询其他节点的信息时,它可依赖的信息只有两个:

  • 目标节点ID;
  • 当前节点维护的路由表;

其查询的核心思想是:逐步迭代,递近查找。其基本过程如下:



路由表更新

Kademlia网络中节点是动态变化的,节点可新接入网络,也可从网络离线。这也意味着每个节点的路由表也是一直变化着的。

新节点上线


流程:


节点离线

节点离线在Kademlia协议中无需做特殊处理,如果某个节点离线,那么其离线事件最终会反馈到网络节点的路由表中,将其从路由表中剔除即可,相比于Chord协议有了极大的简化。


用Kademlia网络存储对象

使用Kademlia网络构建大规模分布式存储系统,需要解决以下两个核心问题:

  • 建立对象与网络节点之间的映射

  • 节点动态变化时保证对象的可访问

对象与节点映射

建立对象与节点的映射,一般有两种方法:

  • 查表:维护全局<对象,节点>映射表

  • 计算:直接根据对象特征,通过数学运算得到目标节点

方法1需要维护庞大的全局映射表,且其很明显会成为系统瓶颈,且违背了对等网络的原则。

方法2必须将对象映射至节点空间,即将对象根据其唯一特征计算160bit的指纹,根据该指纹找到网络中与其指纹最接近的​个节点,这些节点将成为对象的最终存储目的地。一般这个指纹会选取对象内容的hash,便于对象去重和对象的唯一性保证。而之所以选择​个节点存储对象是为了提高对象数据的可靠性。


Kademlia协议相关推荐

  1. BitTorrent网络中基于Kademlia协议到DHT无服务器泛互联网搜索软件推荐

    本文转自 http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=1515544 标题有点长,可能大家不理解什么意思,偶就慢慢地介绍一下, 首先, ...

  2. Kademlia协议原理简介V1.1

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />   Kadem ...

  3. Kademlia协议原理简介

    目录 1. 前言 Kademlia 协议(以下简称 Kad)是美国纽约大学的 P. Maymounkov 和 D. Mazieres 在2002年发布的一项研究结果 Kademlia: A peert ...

  4. 【P2P网络】DHT协议基础1:Kademlia翻译稿

    转载自:http://blog.csdn.net/hoping/article/details/5307320 Kademlia :一种基于 XOR 度量的 P2P 信息系统 Petar Maymou ...

  5. 趣谈网络协议笔记-二(第十七讲)

    趣谈网络协议笔记-二(第十七讲) P2P协议:我下小电影,99%急死你 自勉 逃离舒适区! 正文 一. P2P协议 整个篇章讲的就是这两个协议之间的区别.P2P协议就是迅雷下载数据时所用的协议, 众所 ...

  6. 通俗讲解 Kademlia 原理

    我这好久没有学术性的文章出现了..翻看了下日志,最早的是07年发表的做PCB电路板的日志,之后是08年PHP网页制作,之后是09年C# 的GPS定位软件(虽然自己都没怎么用过...) 今天就通俗介绍一 ...

  7. BT和eMule下载协议的比较和分析

    转载:http://www.yuanma.org/data/2008/0420/article_3009.htmBT和eMule下载协议的比较和分析     由于从事P2P下载引擎开发得原因,对BT和 ...

  8. DHT协议(官方版本)

    译者前序 DHT协议早在2005年就已经成为了官方BitTorrent协议的一部份,但是我竟然一直没有找到国内的官方翻译稿,所以将其进行翻译,若文中错误,欢迎各位指正.其次,若想彻底理解DHT协议的原 ...

  9. [转]Kademlia详解

    前两天在网上看到世界知名的电骡服务器Razorback 2被查封.4人被拘禁的消息,深感当前做eMule / BitTorrent等P2P文件交换软件的不易.以分布式哈希表方式(DHT,Distrib ...

最新文章

  1. Python培训教程分享:visual studio编写python怎么样?
  2. 数据结构5: 链表(单链表)的基本操作及C语言实现
  3. Ubuntu 下面部署Django 项目
  4. 数据中心节能环保政策汇总分析:2022年新建大型数据中心PUE需达到1.4以下
  5. gj4 深入类和对象
  6. php 如何生成exe文件怎么打开,如何把PHP转成EXE文件
  7. js for循环_JS 函数的执行时机(深入理解6个6)
  8. 50道编程小题目之【企业利润提成】
  9. WideString 和 string区别
  10. [机器学习]关联挖掘介绍
  11. IE和火狐CSS透明层兼容写法
  12. 自定义admin组件,Xamin
  13. python 代码封装为webservice_python实现soaplib搭建webservice详细步骤和实例代码
  14. Sprint周期项目开发总结
  15. 十行以内,你写过哪些比较酷的 Matlab 代码?
  16. SQL中的DDL、DML、DCL、TCL是什么意思
  17. Mac查看端口号占用
  18. linux lzma命令,Ubuntu: 压缩与解压缩LZMA文件
  19. Led台灯对眼睛好吗?2022双十一不伤眼的护眼灯推荐
  20. /usr/bin/ld: cannot find -lxxx

热门文章

  1. nRF51822 UART学习
  2. java计算机毕业设计计算机数字逻辑在线学习系统MyBatis+系统+LW文档+源码+调试部署
  3. 九龙证券|中一签可暴赚近9万!兔年第一大肉签来了!弃购的哭了
  4. MUI——二维码正反码识别(jsQR)
  5. 环信SDK 头像、昵称、表情自定义和群聊设置的实现 一(附源码)
  6. 企业邮件系统搭建-关于不能往yahoo,sina,hotmail地址发邮件的问题二
  7. RN ScrollView组件
  8. 【转载】 深度学习中的鲁棒性与稳健性(稳定性)
  9. 《谋圣鬼谷子》杀青 郭宝昌力挺段奕宏戚薇
  10. 憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台