http://www.7klian.com

三分钟相识DSP(网络篇)-DHT

总述

每一个节点都维护一个路由表生存一些已知的通信好的节点。路由表中的节点凡是用来作为起始节点,当其它节点向这个节点发送请求时,路由表中的这些节点就会被返回给发送请求的结点。

当bucket装满了好的nodes,那么新的node将被扬弃。一旦bucket中的某一个node变为了坏的node,那么我们就用新的node来替换这个坏的node。假如bucket中有规按时间(譬喻120秒)内都没有活泼过的节点,我们将这样的节点视为可疑的节点,这时我们向最久没有接洽的节点发送ping。假如被pinged的节点给出了回覆,那么我们向下一个可疑的节点发送ping,不绝这样轮回下去,直到有某一个node没有给出ping的回覆,可能当前bucket中的所有nodes都是好的。假如bucket中的某个node没有对我们的ping给出回覆,我们最好再试一次(再发送一次ping,因为这个node也许仍然是活泼的,,但由于网络拥塞,所以产生了丢包现象,留意DHT的包都是UDP的,而不是当即扬弃这个node可能直接用新node来替代它。这样,我们得路由表将布满不变的长时间在线的nodes。

当一个nodeID为“N”的node插入到表中时,它将被放到ID范畴在min< N < max的bucket中。一个空的路由表只有一个bucket所以所有的node都将被放到这个bucket中。每一个bucket最多只能生存K个nodes,当前K=8。当一个bucket放满了好的nodes之后,将不再答允新的节点插手,除非我们自身的nodeID在这个bucket的范畴内。在这样的环境下,这个bucket将被破裂为2个新的buckets,每一个新桶的范畴都是本来旧桶的一半。本来旧桶中的nodes将被从头分派到这两个新的buckets中。假如是一个只有一个bucket的新表,这个包括整个范畴的bucket将总被破裂为2个新的buckets,第一个的包围范畴从0..2的159,第二个的范畴从2的159次..2的160次。

引言

当一个节点想找到一个文件的peer节点信息时,就利用间隔算法把文件的hash字段和它本身路由表中的节点id举办较量,然后和间隔最近的节点举办通信,向它们发送请求获取正在下载这个文件的peer节点列表的信息。假如它请求的节点知道这个文件的peer节点列表,则把peer节点列表返回给发送请求的节点。假如不知道,它必需返回本身路由表中离文件hash最近的节点列表给请求者。原始节点不绝迭代的发送请求直到找到离方针文件hash更近的节点。搜索竣事之后,下载节点把peer节点的信息生存在本身的路由表内里。

dht网络中每一个node节点有一个全局的独一标识,叫node ID(节点id),节点id是随机从文件中的160位的hash中随机抽取的。distance metric(间隔怀抱)用来较量两个节点id可能节点id和hash之间的间隔。所有的节点(必需生存一个routing table(路由表)生存它和dht网络中一小部门节点交换的信息。离节点id越近的其它节点id的信息越具体。所有的节点必需知道许多离它们很近的其它节点,离它们很远的节点只需要有足够的握手信息就行了。

在Kad算法中,间隔怀抱是对两个hash值举办XOR(异或)运算,而且把功效转换成无标记整数。distance(A,B)=|A xor B|,功效值越小,间隔越近。

路由表包围从0到2的160次完整的nodeID空间。路由表又被分别为buckets(简称K桶),每一个bucket包括一个子部门的nodeID空间。一个空的路由表只有一个bucket,它的ID范畴从min=0到max=2的160次。K桶布局如下:

在DSP的协议架构下,我们将DHT做了扩展。操作Discovery算法,可以通过peer之间相互互换nodeUDP端标语。同时,下载节点可以通过下载普通的任意文件来自动扩展DHT路由表。当新启动的节点第一次试着下载一个无tracker的文件时,它的路由表中将没有任何nodes,这时它需要在bootstrap节点中找到其它节点的接洽信息。

道理

DHT全称叫漫衍式哈希表(Distributed Hash Table),是一种漫衍式存储要领,一类可由键值来独一标示的信息凭据某种约定/协议被分手地存储在多个节点上,这样也可以有效地制止“中央集权式”的处事器(好比:tracker)的单一妨碍而带来的整个网络瘫痪。实现DHT的技能/算法有许多种,常用的有:Chord, Pastry, Kademlia等。

DSP对DHT的改造

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读