日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解Kademlia协议原理

發(fā)布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解Kademlia协议原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概要

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的查找過程:

  • 查詢者從自己的k-bucket中找到離目標(biāo)節(jié)點(diǎn)最近的n個節(jié)點(diǎn),然后異步向這n個節(jié)點(diǎn)發(fā)起查詢請求
  • 被查詢節(jié)點(diǎn)收到請求后從自己的k-bucket里找到離目標(biāo)節(jié)點(diǎn)最近的n個節(jié)點(diǎn)返回給查詢者。
  • 查詢者收到結(jié)果后重復(fù)步驟1.
    這其實就是個不斷收斂的過程,例如:
    查詢節(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。

  • u把w插入到自己合適的k-bucket中,然后對自己的節(jié)點(diǎn)ID進(jìn)行查詢。
  • 根據(jù)接受到的信息更新自己的v-bucket。
  • 對接受到的消息的節(jié)點(diǎn)ID進(jìn)行查詢,直到自己的k-bucket有足夠多的信息。
  • 協(xié)議消息

    在KAD協(xié)議中,有4個指令

  • Ping 用來測試節(jié)點(diǎn)是否在線
  • Store 在某個節(jié)點(diǎn)存儲key-value
  • FindNode 消息請求的接收者將返回自己桶中離請求鍵值最近的K個節(jié)點(diǎn)
  • FindValue 與FindNode一樣,不過當(dāng)請求的接收者存有請求者所請求的鍵的時候,它將返回相應(yīng)鍵的值。
  • 總結(jié)

    以上是生活随笔為你收集整理的理解Kademlia协议原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。