理解Kademlia协议原理

概要

Kademlia协议(以下简称Kad) 是美国纽约大学的PetarP. Maymounkov和David Mazieres. 在2002年发布的一项研究结果《Kademlia: A peerto -peer information system based on the XOR metric》。
在Kad网络中所有的信息都是以哈希表的形式存储的,并分散在不同的节点中。

查询过程

相信很多人都用过eMula吧,我们来看下eMula的运行原理。
eMula有一个关键字字典的哈希表(key是关键字的哈希值(160位),value是文件信息列表,文件信息包括文件名字,文件长度,文件哈希(160位)。)
当我们要查询一个关键字的时候会从这个字典中找到文件信息列表,然后根据文件信息里的文件哈希从文件索引字典里面找到文件的拥有者。(文件索引字典的key是文件哈希,value是文件所有者列表,文件所有者包括node-id)。

字典存储

上面提到了关键字字典和文件索引字典这2个字典,那么这2个字典是如何存储的呢,在Kad网络中是根据一定的规则存储在各个P2P节点中,下面我们就说下这个规则。
这2个字典的key都是160位的哈希值,在Kad网络中每个节点都有一个node-id,也是160位的哈希值,key-value就存储在node-id最接近key的n个节点上。之所有要重复保存n份,是考虑到Kad网络的稳定而产生的冗余。
可以看出在Kad网络中越靠近key的区域,存储得越集中。为了信息的实效性,离目标节点越近保存的时间越长。

判断2个节点x,y的距离就是这2个节点的异或d(x,y)=x⊕y,当d(x,y)大时说明2个节点距离远,反之说明2个节点距离近。说通俗点就是x,y的高位越相同距离就越近。比如:

x是0x1234567891234567891234567891234567891234
y是0x1234567890123456789012345678901234567890
z是0x1234567801234567890123456789012345678901
其中x,y的前9个高位是一样的,x和z的前8个高位是一样的,说明x,y的距离比x,z的距离近。

为了保证数据搜索的一致性,在任何时候节点w发现新节点u比w上的某些key,value对数据更接近,则w把这些key,value对复制到u上,但是不会从w上删除。

找到节点的网络信息

查询过程章节中我们找到了node-ID,我们这里就来讲解如何根据node-ID找到节点的网络信息(包括IP,端口)。
在Kad网络中每个节点都维护了160个list,每个list都称为一个k-bucket,在第i个 list中,记录了当前节点已知的与自身距离为2i~2(i+1)的一些其他对端节点的网络信息(IP,端口),每一个list中最多存放k个节点信息(不包括自身节点)。比如:
x是01010101010101…
第160个k-bucket记录了高位是0的k个节点信息
第159个k-bucket记录了高位是01的k个节点信息
第158个k-bucket记录了高位是010的k个节点信息
第i个k-bucket记录了前(160-i)位和x的前(160-i)位一致的k个节点信息
每一个 list中的对端节点信息均按访问时间排序,最早访问的在list头部,而最近新访问的则放在list的尾部。
Kad的查找过程:

  1. 查询者从自己的k-bucket中找到离目标节点最近的n个节点,然后异步向这n个节点发起查询请求
  2. 被查询节点收到请求后从自己的k-bucket里找到离目标节点最近的n个节点返回给查询者。
  3. 查询者收到结果后重复步骤1.
    这其实就是个不断收敛的过程,例如:
    查询节点x是01010101010101…
    目标节点y是01010100011010…
    x和y的前7个高位是一致的,至少x的第153个k-bucket记录了高位是01010100(8位)的k个节点信息,x向这k个节点发送查询请求。这k个节点的k-bucket里面至少记录了高位是010101000(9位)的k个节点信息。不断的收敛最终就找到了目标节点y。
新节点的加入

新节点u加入Kad网络的时候首先随机生成自己的node-ID,然后获取一个已经加入Kad网络的节点信息w。

  1. u把w插入到自己合适的k-bucket中,然后对自己的节点ID进行查询。
  2. 根据接受到的信息更新自己的v-bucket。
  3. 对接受到的消息的节点ID进行查询,直到自己的k-bucket有足够多的信息。
协议消息

在KAD协议中,有4个指令

  1. Ping 用来测试节点是否在线
  2. Store 在某个节点存储key-value
  3. FindNode 消息请求的接收者将返回自己桶中离请求键值最近的K个节点
  4. FindValue 与FindNode一样,不过当请求的接收者存有请求者所请求的键的时候,它将返回相应键的值。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值