概要

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一样,不过当请求的接收者存有请求者所请求的键的时候,它将返回相应键的值。

理解Kademlia协议原理相关推荐

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

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

  2. 理解OAuth2协议原理

    理解OAuth2协议原理 OAuth2简介 角色 流程 客服端注册 Client Type 四种授权模式 授权码模式 隐藏式 密码式 凭证式 RefreshToken Github Demo加深理解 ...

  3. Kademlia协议原理简介

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

  4. 深入理解http协议原理

    简述 对于Android开发来说,HTTP是网络开发中最为重要的.使用频率最高的手段,也是面试常问到的面试题.因此,深入了解HTTP是必备技能,只有了解它的基本原理才能够更好的运用. HTTP网络请求 ...

  5. BitTorrent协议与MagNet协议原理

    BitTorrent协议 1.简介 BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断向其他下载者上传已下载的数据.而在FTP,HTTP协议中,每个下载者在下载自己所需文件 ...

  6. Zookeeper ZAB协议原理浅析

    文章目录 前言 1. 基本角色和概念 2. Leader Election 3. Discovery 4. Synchronization 5. BroadCast 后记 前言 DTCC 要在下周一到 ...

  7. Http协议原理解析

    一:http的由来: OSI模型把网络通信分成七层:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,对于开发网络应用人员来说,一般把网络分成五层,这样比较容易理解.这五层为:物理层.数据链 ...

  8. 在实践中深入理解IP协议

    本文为我个人计划撰写的博客专题<在实践中深入理解常见网络协议>中关于IP协议的一篇,有兴趣的朋友可以继续关注我的博客,我将会陆续撰写各种协议的实践分析文章. TCP/IP协议栈其实当然不止 ...

  9. HTTPS协议原理分析

    HTTPS协议原理分析 HTTPS协议需要解决的问题 HTTPS作为安全协议而诞生,那么就不得不面对以下两大安全问题: 身份验证 确保通信双方身份的真实性.直白一些,A希望与B通信,A如何确认B的身份 ...

  10. 网络编程懒人入门(三):快速理解TCP协议一篇就够

    1.前言 本系列文章的前两篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>.<网络编程懒人入门(二):快速理解网络通信协议(下篇)>快速介绍了网络基本通信协议及理论基 ...

最新文章

  1. 在各种xDSL技术中,能提供上下行信道非对称传输的是______。正确答案 B
  2. Android -- 带你从源码角度领悟Dagger2入门到放弃(三)
  3. centos部署mysql5.6免安装版
  4. 【verilog 语法】always 和 always@(*) 的区别
  5. scrapy框架_入门Scrapy框架看这一篇文章就够了
  6. equals null报错吗_轻轻松松教你搞定Java中的==和equals
  7. onkeydown为什么会无限回调_为什么投资者总喜欢在股票下跌时买入?只有傻瓜才能在股市里挣钱...
  8. samba服务器之无认证进入共享目录
  9. 文件转Base64格式
  10. stata面板数据gmm回归_12短动态面板数据模型1-差分GMM估计-Stata软件操作教程
  11. word 尾注后边加致谢
  12. 王垠 java_解读王垠博客“一道 Java 面试题”
  13. 优酷、腾讯视频播放器接口参数说明
  14. 软1901cyl对c语言的认识
  15. 浏览器及app消息推送
  16. 对 算术基本定理 的研究
  17. 浅谈小学语文教学中的读
  18. IIc通信协议(一)
  19. Day4 Hailstone
  20. C++中cout的格式使用

热门文章

  1. DFI、DPI、端口识别技术
  2. 计算机教学楼起名,给教学楼起名字(富有诗意教学楼名字)
  3. Metro风格用户界面设计原则
  4. php创建数组填充数组的方法
  5. 银广夏事件--中国股票财务作假事件
  6. Python编程——实现屏幕广告语的滚动
  7. 自动升级Notes客户机AUT功能实战
  8. h3c交换机配置nat_史上最详细H3C路由器NAT典型配置案例
  9. 关于RIGOL可编程电源连接说明(网口连接)
  10. python 爬取财经新闻_Python爬虫并自制新闻网站,太好玩了