理解Kademlia协议原理
概要
Kademlia協(xié)議(以下簡稱Kad) 是美國紐約大學(xué)的PetarP. Maymounkov和David Mazieres. 在2002年發(fā)布的一項研究結(jié)果《Kademlia: A peerto -peer information system based on the XOR metric》。
在Kad網(wǎng)絡(luò)中所有的信息都是以哈希表的形式存儲的,并分散在不同的節(jié)點(diǎn)中。
查詢過程
相信很多人都用過eMula吧,我們來看下eMula的運(yùn)行原理。
eMula有一個關(guān)鍵字字典的哈希表(key是關(guān)鍵字的哈希值(160位),value是文件信息列表,文件信息包括文件名字,文件長度,文件哈希(160位)。)
當(dāng)我們要查詢一個關(guān)鍵字的時候會從這個字典中找到文件信息列表,然后根據(jù)文件信息里的文件哈希從文件索引字典里面找到文件的擁有者。(文件索引字典的key是文件哈希,value是文件所有者列表,文件所有者包括node-id)。
字典存儲
上面提到了關(guān)鍵字字典和文件索引字典這2個字典,那么這2個字典是如何存儲的呢,在Kad網(wǎng)絡(luò)中是根據(jù)一定的規(guī)則存儲在各個P2P節(jié)點(diǎn)中,下面我們就說下這個規(guī)則。
這2個字典的key都是160位的哈希值,在Kad網(wǎng)絡(luò)中每個節(jié)點(diǎn)都有一個node-id,也是160位的哈希值,key-value就存儲在node-id最接近key的n個節(jié)點(diǎn)上。之所有要重復(fù)保存n份,是考慮到Kad網(wǎng)絡(luò)的穩(wěn)定而產(chǎn)生的冗余。
可以看出在Kad網(wǎng)絡(luò)中越靠近key的區(qū)域,存儲得越集中。為了信息的實效性,離目標(biāo)節(jié)點(diǎn)越近保存的時間越長。
判斷2個節(jié)點(diǎn)x,y的距離就是這2個節(jié)點(diǎn)的異或d(x,y)=x⊕y,當(dāng)d(x,y)大時說明2個節(jié)點(diǎn)距離遠(yuǎn),反之說明2個節(jié)點(diǎn)距離近。說通俗點(diǎn)就是x,y的高位越相同距離就越近。比如:
x是0x1234567891234567891234567891234567891234 y是0x1234567890123456789012345678901234567890 z是0x1234567801234567890123456789012345678901 其中x,y的前9個高位是一樣的,x和z的前8個高位是一樣的,說明x,y的距離比x,z的距離近。為了保證數(shù)據(jù)搜索的一致性,在任何時候節(jié)點(diǎn)w發(fā)現(xiàn)新節(jié)點(diǎn)u比w上的某些key,value對數(shù)據(jù)更接近,則w把這些key,value對復(fù)制到u上,但是不會從w上刪除。
找到節(jié)點(diǎn)的網(wǎng)絡(luò)信息
在查詢過程章節(jié)中我們找到了node-ID,我們這里就來講解如何根據(jù)node-ID找到節(jié)點(diǎn)的網(wǎng)絡(luò)信息(包括IP,端口)。
在Kad網(wǎng)絡(luò)中每個節(jié)點(diǎn)都維護(hù)了160個list,每個list都稱為一個k-bucket,在第i個 list中,記錄了當(dāng)前節(jié)點(diǎn)已知的與自身距離為2i~2(i+1)的一些其他對端節(jié)點(diǎn)的網(wǎng)絡(luò)信息(IP,端口),每一個list中最多存放k個節(jié)點(diǎn)信息(不包括自身節(jié)點(diǎn))。比如:
x是01010101010101…
第160個k-bucket記錄了高位是0的k個節(jié)點(diǎn)信息
第159個k-bucket記錄了高位是01的k個節(jié)點(diǎn)信息
第158個k-bucket記錄了高位是010的k個節(jié)點(diǎn)信息
第i個k-bucket記錄了前(160-i)位和x的前(160-i)位一致的k個節(jié)點(diǎn)信息
每一個 list中的對端節(jié)點(diǎn)信息均按訪問時間排序,最早訪問的在list頭部,而最近新訪問的則放在list的尾部。
Kad的查找過程:
這其實就是個不斷收斂的過程,例如:
查詢節(jié)點(diǎn)x是01010101010101…
目標(biāo)節(jié)點(diǎn)y是01010100011010…
x和y的前7個高位是一致的,至少x的第153個k-bucket記錄了高位是01010100(8位)的k個節(jié)點(diǎn)信息,x向這k個節(jié)點(diǎn)發(fā)送查詢請求。這k個節(jié)點(diǎn)的k-bucket里面至少記錄了高位是010101000(9位)的k個節(jié)點(diǎn)信息。不斷的收斂最終就找到了目標(biāo)節(jié)點(diǎn)y。
新節(jié)點(diǎn)的加入
新節(jié)點(diǎn)u加入Kad網(wǎng)絡(luò)的時候首先隨機(jī)生成自己的node-ID,然后獲取一個已經(jīng)加入Kad網(wǎng)絡(luò)的節(jié)點(diǎn)信息w。
協(xié)議消息
在KAD協(xié)議中,有4個指令
總結(jié)
以上是生活随笔為你收集整理的理解Kademlia协议原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做seo为什么要了解网站
- 下一篇: Sentinel下载哨兵数据(IDM或者