资源描述:
《kademlia协议原理简介》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Kademlia协议原理简介MMX,k7mmx@tom.com2006.2.20欢迎参观我的宝宝乐园http://spaces.msn.com/members/cqmmx/一、前言Kademlia协议(以下简称Kad)是美国纽约大学的PetarP.Maymounkov和DavidMazieres.在2002年发布的一项研究结果《Kademlia:Apeerto-peerinformationsystembasedontheXORmetric》。简单的说,Kad是一种分布式哈希表(DHT)技术,不过和其他DHT实现技术比较,如Chord、CAN、Pastry等,Kad通过独特的以异或
2、算法(XOR)为距离度量基础,建立了一种全新的DHT拓扑结构,相比于其他算法,大大提高了路由查询速度。在2005年5月著名的BiTtorrent在4.1.0版实现基于Kademlia协议的DHT技术后,很快国内的BitComet和BitSpirit也实现了和BitTorrent兼容的DHT技术,实现trackerless下载方式。另外,emule中也很早就实现了基于Kademlia类似的技术(BT中叫DHT,emule中也叫Kad,注意和本文简称的Kad区别),和BT软件使用的Kad技术的区别在于key、value和nodeID的计算方法不同。二、节点状态在Kad网络中,所有节点都
3、被当作一颗二叉树的叶子,并且每一个节点的位置都由其ID值的最短前缀唯一的确定。对于任意一个节点,都可以把这颗二叉树分解为一系列连续的,不包含自己的子树。最高层的子树,由整颗树不包含自己的树的另一半组成;下一层子树由剩下部分不包含自己的一半组成;依此类推,直到分割完整颗树。图1就展示了节点0011如何进行子树的划分:图1:节点0011的子树划分虚线包含的部分就是各子树,由上到下各层的前缀分别为0,01,000,0010。Kad协议确保每个节点知道其各子树的至少一个节点,只要这些子树非空。在这个前提下,每个节点都可以通过ID值来找到任何一个节点。这个路由的过程是通过所谓的XOR(异或)
4、距离得到的。图2就演示了节点0011如何通过连续查询来找到节点1110的。节点0011通过在逐步底层的子树间不断学习并查询最佳节点,获得了越来越接近的节点,最终收敛到目标节点上。图2:通过ID值定位目标节点需要说明的是,只有第一步查询的节点101,是节点0011已经知道的,后面各步查询的节点,都是由上一步查询返回的更接近目标的节点,这是一个递归操作的过程。三、节点间距离Kad网络中每个节点都有一个160bit的ID值作为标志符,Key也是一个160bit的标志符,每一个加入Kad网络的计算机都会在160bit的key空间被分配一个节点ID(nodeID)值(可以认为ID是随机产生的
5、),对的数据就存放在ID值“最”接近key值的节点上。判断两个节点x,y的距离远近是基于数学上的异或的二进制运算,d(x,y)=x⊕y,既对应位相同时结果为0,不同时结果为1。例如:010101XOR110001-------------100100则这两个节点的距离为32+4=36。显然,高位上数值的差异对结果的影响更大。对于异或操作,有如下一些数学性质:ld(x,x)=0ld(x,y)>0,ifx≠yl∨x,y:d(x,y)=d(y,x)ld(x,y)+d(y,z)≧d(x,z)ld(x,y)⊕d(y,z)=d(x,z)l∨a≧0,b≧0,a+b≧a⊕b正
6、如Chord的顺时针旋转的度量一样,异或操作也是单向性的。对于任意给定的节点x和距离⊿≧0,总会存在一个精确的节点y,使得d(x,y)=⊿。另外,单向性也确保了对于同一个key值的所有查询都会逐步收敛到同一个路径上,而不管查询的起始节点位置如何。这样,只要沿着查询路径上的节点都缓存这个对,就可以减轻存放热门key值节点的压力,同时也能够加快查询响应速度。四、K桶Kad的路由表是通过一些称之为K桶的表格构造起来的。这有点类似Tapestry技术,其路由表也是通过类似的方法构造的。ii+1对每一个0≦i≦160,每个节点都保存有一些和自己距离范围在区间[2,2)内
7、的一些节点信息,这些信息由一些(IPaddress,UDPport,NodeID)数据列表构成(Kad网络是靠UDP协议交换信息的)。每一个这样的列表都称之为一个K桶,并且每个K桶内部信息存放位置是根据上次看到的时间顺序排列,最近(least-recently)看到的放在头部,最后(most-recently)看到的放在尾部。每个桶都有不超过k个的数据项。一个节点的全部K桶列表如表1所示:I距离邻居0[201,2)(IPaddress,UDPport,NodeID)0