您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Kademlia协议原理简介
1Kademlia协议原理简介2006.2.20一、前言Kademlia协议(以下简称Kad)是美国纽约大学的PetarP.Maymounkov和DavidMazieres.在2002年发布的一项研究结果《Kademlia:Apeerto-peerinformationsystembasedontheXORmetric》。简单的说,Kad是一种分布式哈希表(DHT)技术,不过和其他DHT实现技术比较,如Chord、CAN、Pastry等,Kad通过独特的以异或算法(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网络中每个节点都有一个160bit的ID值作为标志符。节点ID的生成,各种具体的应用软件有不同的实现方法,一般是选择一个不重复的值进行SHA-1计算,这个值可以是用户的IP地址,或者只是简单的随机生成。在Kad网络中,所有节点都被当作一颗二叉树的叶子,并且每一个节点的位置都由其ID值的最短前缀唯一的确定。对于任意一个节点,都可以把这颗二叉树分解为一系列连续的,不包含自己的子树。最高层的子树,由整颗树不包含自己的树的另一半组成;下一层子树由剩下部分不包含自己的一半组成;依此类推,直到分割完整颗树。图1就展示了节点0011如何进行子树的划分:2图1:节点0011的子树划分虚线包含的部分就是各子树,由上到下各层的前缀分别为1,01,000,0010。Kad协议确保每个节点知道其各子树的至少一个节点,只要这些子树非空。在这个前提下,每个节点都可以通过ID值来找到任何一个节点。这个路由的过程是通过所谓的XOR(异或)距离得到的。图2就演示了节点0011如何通过连续查询来找到节点1110的。节点0011通过在逐步底层的子树间不断学习并查询最佳节点,获得了越来越接近的节点,最终收敛到目标节点上。图2:通过ID值定位目标节点需要说明的是,只有第一步查询的节点101,是节点0011已经知道的,后面各步查询的节点,都是由上一步查询返回的更接近目标的节点,这是一个递归操作的过程。由于各节点路由信息的不确定性(节点动态加入和离开引起),图2只是展示了多种可能搜索路径的一个具体实现。三、节点间距离Kad网络中每个节点都可以(但不是必须)保存一个key,value对,这里Key是一个160bit的标志符。每一个加入Kad网络的计算机都会在160bit的命名空间被分配一个节点ID(nodeID)值,value值就存放在ID值和key值相同或“最”接近的那个节点上。3判断两个节点x,y的距离远近是基于数学上的异或的二进制运算,d(x,y)=x⊕y,既对应位相同时结果为0,不同时结果为1。例如:010101XOR110001-------------100100则这两个节点的距离为32+4=36。显然,高位上数值的差异对结果的影响更大。对于异或操作,有如下一些数学性质:d(x,x)=0d(x,y)0,ifx≠y∨x,y:d(x,y)=d(y,x)d(x,y)+d(y,z)≧d(x,z)d(x,y)⊕d(y,z)=d(x,z)∨a≧0,b≧0,a+b≧a⊕b正如Chord的顺时针旋转的度量一样,异或操作也是单向性的。对于任意给定的节点x和距离⊿≧0,总会存在一个精确的节点y,使得d(x,y)=⊿。另外,单向性也确保了对于同一个key值的所有查询都会逐步收敛到同一个路径上,而不管查询的起始节点位置如何。这样,只要沿着查询路径上的节点都缓存这个key,value对,就可以减轻存放热门key值节点的压力,同时也能够加快查询响应速度。这种新颖计算方法最大的优点在于,它提供了一种在Kad网络上进行可靠距离度量的方法。假如Kad网络上所有其他用户都按照和你之间距离的远近而排成一条长队,如果已知另一个结点的ID,那么你很容易计算出他在这条长队中的位置;如果给定一个距离,你也能很容易从这条长队里找出与你的距离最接近给定距离的那些结点。四、K桶Kad的路由表是通过一些称之为K桶的列表构造起来的。这有点类似Tapestry技术,其路由表也是通过类似的方法构造的。对每一个0≦i﹤160(注:有的文献资料采用的是0≦i≦160),每个节点都保存有一些和自己距离范围在区间内的一些节点信息,这些信息由一些(IPaddress,UDPport,NodeID)数据列表构成(Kad网络是靠UDP协议交换信息的)。每一个这样的列表都称之为一个K桶,并且每个K桶内部信息存放位置是根据上次看到的时间顺序排列,最近(least-recently)看到的放在头部,最后(most-recently)看到的放在尾部。每个桶都有最大不超过k个的数据项,这里k是为平衡系统性能和网络负载而设置的一个常数,但必须是偶数,比如k=20。在BitTorrent的实现中,取值为k=8。一个节点的全部K桶列表有160项,如表1所示:4表1:K桶结构不过通常来说当i值很小时,K桶通常是空的(也就是说没有足够多的节点,比如当i=0时,就最多只可能有1项);而当i值很大时,其对应K桶的项数又很可能会超过k个(当然,覆盖距离范围越广,存在较多节点的可能性也就越大)。由于每个K桶覆盖距离的范围呈指数关系增长,这就形成了离自己近的节点的信息多,离自己远的节点的信息少,从而可以保证路由查询过程是收敛。也就是说,每个结点都对自己附近的情况非常了解,而随着距离的增大,了解的程度不断降低降低。因为是用指数方式划分区间,经过证明,对于一个有N个节点的Kad网络,最多只需要经过logN步查询,就可以准确定位到目标节点。这个特性和Chord网络上节点的fingertable划分距离空间的原理类似。当节点x收到一个PRC消息时,发送者y的IP地址就被用来更新对应的K桶,具体步骤如下:1.计算自己和发送者的距离:d(x,y)=x⊕y,注意:x和y是ID值,不是IP地址2.通过距离d选择对应的K桶进行更新操作。53.如果y的IP地址已经存在于这个K桶中,则把对应项移到该该K桶的尾部4.如果y的IP地址没有记录在该K桶中⑴如果该K桶的记录项小于k个,则直接把y的(IPaddress,UDPport,NodeID)信息插入队列尾部⑵如果该K桶的记录项大于k个,则选择头部的记录项(假如是节点z)进行RPC_PING操作①如果z没有响应,则从K桶中移除z的信息,并把y的信息插入队列尾部②如果z有响应,则把z的信息移到队列尾部,同时忽略y的信息。K桶的更新机制非常高效的实现了一种把最近看到的节点更新的策略,除非在线节点一直未从K桶中移出过。也就是说在线时间长的节点具有较高的可能性继续保留在K桶列表中。这种更新机制有点类似我们手机的来电记录,越近越熟悉的朋友,因为经常联系,他留在我们来电记录中可能性越大;越远越陌生的朋友,因为联系少,可能只会偶尔留在来电记录中,然后就被熟悉朋友的电话代替了。一般来说,最活跃(或者说在线时间更长)的节点信息,有更大的机会留在其他节点的K桶中,这样可以保持系统稳定和减少节点进出的路由维护代价。对于一个稳定的网络而言,因为各节点一直在线,先加入K桶的节点不会失效,这样,离自己时延小的节点,就更有机会留在K桶中,而且各节点的K桶信息是很稳定的。推而广之,对于一个不稳定的网络而言,我们是很难简单计算出其节点的K桶构成,因为K桶信息会随着节点的进出动态调整,甚至在一定程度上带有随机性质(和节点的响应速度有关)。基于这样的道理,具体的查询路径只能说是根据当前各节点的K桶信息作出的判断,而这些K桶信息是未知道,具有多种可能性的,所以实际的查询路径只是多种可能性中的一种。采用这种机制是基于对Gnutella网络上大量用户行为习惯的研究结果,既节点的失效概率和在线时长成反比关系,如图3(横坐标为分钟,纵坐标为概率):6图3:Gnutella网络中在线时长和继续在线的概率关系可以明显看出,用户在线时间越长,他在下一时段继续在线的可能性就越高。所以,通过把在线时间长的节点留在K桶里,Kad就明显增加K桶中的节点在下一时间段仍然在线的概率,这对应Kad网络的稳定性和减少网络维护成本(不需要频繁构建节点的路由表)带来很大好处。这种机制的另一个好处是能在一定程度上防御DOS攻击,因为只有当老节点失效后,Kad才会更新K桶的信息,这就避免了通过新节点的加入来泛洪路由信息。为了防止K桶老化,所有在一定时间之内无更新操作的K桶,都会分别从自己的K桶中随机选择一些节点执行RPC_PING操作。上述这些K桶机制使Kad缓和了流量瓶颈(所有节点不会同时进行大量的更新操作),同时也能对节点的失效进行迅速响应。五、Kademlia协议操作类型Kademlia协议包括四种远程RPC操作:PING、STORE、FIND_NODE、FIND_VALUE。1、PING操作的作用是探测一个节点,用以判断其是否仍然在线。2、STORE操作的作用是通知一个节点存储一个key,value对,以便以后查询需要。3、FIND_NODE操作使用一个160bit的ID作为参数。本操作的接受者返回它所知道的更接近目标ID的K个节点的(IPaddress,UDPport,NodeID)信息。这些节点的信息可以是从一个单独的K桶获得,也可以从多个K桶获得(如果最接近目标ID的K桶未满)。不管是哪种情况,接受者都将返回K个节点的信息给操作发起者。但如果接受者所有K桶的节点信息加起来也没有K个,则它会返回全部节点的信息给发起者。4、FIND_VALUE操作和FIND_NODE操作类似,不同的是它只需要返回一个节点的(IPaddress,UDPport,NodeID)信息。如果本操作的接受者收到同一个key的STORE操作,则会直接返回存储的value值。注:在Kad网络中,系统存储的数据以key,value对形式存放。根据笔者的分析,在BitSpirit的DHT实现中,其key值为torrent文件的info_hash串,其value值则和torrent文件有密切关系。为了防止伪造地址,在所有RPC操作中,接受者都需要响应一个随机的160bit的ID值。另外,为了确信发送者的网络地址,PING操作还可以附带在接受者的RPC回复信息中。六、路由查询机制Kad技术的最大特点之一就是能够提供快速的节点查找机制,并且还可以通过参数进行查找速度的调节。假如节点x要查找ID值为t的节点,Kad按照如下递归操作步骤进行路由查找:71、计算到t的距离:d(x,y)=x⊕y2、从x的第[㏒d]个K桶中取出α个节点的信息(“[]”是取整符号),同时进行FIND_NODE操作。如果这个K桶中的信息少于α个,则从附近多个桶中选择距离最接近d的总共α个节点。3、对接受到查询操作的每个节点,如果发现自己就是t,则回答自己是最接近t的;否则测量自己和t的距离,并从自己对应的K桶中选择α个节点的信息给x。4、x对新接收到的每个节点都再次执行FIND_NODE操作,此过程不断重复执行,直到每一个分支都有节点响应自己是最接近t的。没有迅速响应的节点将被迅速排除出候选列表,直到其响应。5、通过上述查找操作,x得到了k个最接近t的节点信息。注意:这里用“最接近”这个说法,是因为ID值为t的节点不一定存在网络中,也就是说t没有分配给任何一台电脑。这里α也是为系统优化而设立的一个参数,就像K
本文标题:Kademlia协议原理简介
链接地址:https://www.777doc.com/doc-2879831 .html