eMule中的分布式雜湊表技術 Kademlia

2021-04-15 10:46:35 字數 3354 閱讀 3474

前兩天在網上看到世界知名的電騾伺服器razorback 2被查封、4人被拘禁的訊息,深感當前做emule / bittorrent等p2p檔案交換軟體的不易。以分布式雜湊表方式(dht,distributed hash table)來代替集中索引伺服器可以說是目前可以預見到的為數不多的p2p軟體發展趨勢之一,比較典型的方案主要包括:can、chord、tapestry、pastry、kademlia和viceroy等,而kademlia協議則是其中應用最為廣泛、原理和實現最為實用、簡潔的一種,當前主流的p2p軟體無一例外地採用了它作為自己的輔助檢索協議,如emule、bitcomet、bitspirit和azureus等。鑑於kademlia日益增長的強大影響力,今天特地在blog裡寫下這篇小文,算是對其相關知識系統的總結。

1. kademlia簡述

kademlia(簡稱kad)屬於一種典型的結構化p2p覆蓋網路(structured p2p overlay network),以分布式的應用層全網方式來進行資訊的儲存和檢索是其嘗試解決的主要問題。在kademlia網路中,所有資訊均以的雜湊表條目形式加以儲存,這些條目被分散地儲存在各個節點上,從而以全網方式構成一張巨大的分布式雜湊表。我們可以形象地把這張雜湊大表看成是一本字典:只要知道了資訊索引的key,我們便可以通過kademlia協議來查詢其所對應的value資訊,而不管這個value資訊究竟是儲存在哪乙個節點之上。在emule、bittorrent等p2p檔案交換系統中,kademlia主要充當了檔案資訊檢索協議這一關鍵角色,但kad網路的應用並不僅限於檔案交換。下文的描述將主要圍繞emule中kad網路的設計與實現展開。

2. emule的kad網路中究竟儲存了哪些資訊?

4. 什麼叫做節點的id和節點之間的距離?

kad網路中的每乙個節點均擁有乙個專屬id,該id的具體形式與sha1雜湊值類似,為乙個長達160bit的整數,它是由節點自己隨機生成的,兩個節點擁有同一id的可能性非常之小,因此可以認為這幾乎是不可能的。在kad網路中,兩個節點之間距離並不是依靠物理距離、路由器跳數來衡量的,事實上,kad網路將任意兩個節點之間的距離d定義為其二者id值的逐位元二進位制和數,即,假定兩個節點的id分別為a與b,則有:d=a xor b。在kad中,每乙個節點都可以根據這一距離概念來判斷其他節點距離自己的「遠近」,當d值大時,節點間距離較遠,而當d值小時,則兩個節點相距很近。這裡的「遠近」和「距離」都只是一種邏輯上的度量描述而已;在kad中,距離這一度量是無方向性的,也就是說a到b的距離恆等於b到a的距離,因為a xor b==b xor a

5. 條目是如何儲存在kad網路中的?

由上述可知,對於某一條目,在kad網路中id越靠近key的節點區域,該條目儲存的份數就越多,儲存得也越集中;事實上,為了實現較短的查詢響應延遲,在條目查詢的過程中,任一條目可被cache到任意節點之上;同時為了防止過度cache、保證資訊足夠新鮮,必須考慮條目在節點上儲存的時效性:越接近目標結點n,該條目儲存的時間將越長,反之,其超時時間就越短;儲存在目標節點之上的條目最多能夠被保留24小時,如果在此期間該條目被其發布源重新發布的話,其儲存時間還可以進一步延長。

6. kad網路節點需要維護哪些狀態資訊?

在kad網路中,每乙個節點均維護了160個list,其中的每個list均被稱之為乙個k-桶(k-bucket),如下圖所示。在第i個list中,記錄了當前節點已知的與自身距離為2^i~2^(i+1)的一些其他對端節點的網路資訊(node id,ip位址,udp埠),每乙個list(k-桶)中最多存放k個對端節點資訊,注意,此處的k與上文所提到的複製係數k含義是一致的;每乙個list中的對端節點資訊均按訪問時間排序,最早訪問的在list頭部,而最近新訪問的則放在list的尾部。

由上可見,設計採用這種多k-bucket資料結構的初衷主要有二:a. 維護最近-最新見到的節點資訊更新;b. 實現快速的節點資訊篩選操作,也就是說,只要知道某個需要查詢的特定目標節點n的id,我們便可以從當前節點的k-buckets結構中迅速地查出距離n最近的若干已知節點。

7. 在kad網路中如何尋找某特定的節點?

整個節點查詢過程非常直接,其方式類似於dns的迭代查詢:

a. 由查詢發起者從自己的k-桶中篩選出若干距離目標id最近的節點,並向這些節點同時傳送非同步查詢請求;

b .被查詢節點收到請求之後,將從自己的k-桶中找出自己所知道的距離查詢目標id最近的若干個節點,並返回給發起者;

c. 發起者在收到這些返回資訊之後,再次從自己目前所有已知的距離目標較近的節點中挑選出若干沒有請求過的,並重複步驟1;

d. 上述步驟不斷重複,直至無法獲得比查詢者當前已知的k個節點更接近目標的活動節點為止。

e. 在查詢過程中,沒有及時響應的節點將立即被排除;查詢者必須保證最終獲得的k個最近節點都是活動的。

簡單總結一下上述過程,實際上它跟我們日常生活中去找某乙個人打聽某件事是非常相似的,比方說你是個agent **ith,想找小李(key)問問他的手機號碼(value),但你事先並不認識他,你首先肯定會去找你所認識的和小李在同乙個公司工作的人,比方說小趙,然後小趙又會告訴你去找與和小李在同一部門的小劉,然後小劉又會進一步告訴你去找和小李在同乙個專案組的小張,最後,你找到了小張,喲,正好小李出差去了(節點下線了),但小張恰好知道小李的號碼(cache),這樣你總算找到了所需的資訊。在節點查詢的過程中,「節點距離的遠近」實際上與上面例子中「人際關係的密切程度」所代表的含義是一樣的。

8. 在kad網路中如何儲存和搜尋某特定的條目?

從本質上而言,儲存、搜尋某特定條目的問題實際上就是節點查詢的問題。當需要在kad網路中儲存乙個條目時,可以首先通過節點查詢演算法找到距離key最近的k個節點,然後再通知它們儲存條目即可。而搜尋條目的過程則與節點查詢過程也是基本類似,由搜尋發起方以迭代方式不斷查詢距離key較近的節點,一旦查詢路徑中的任一節點返回了所需查詢的value,整個搜尋的過程就結束。為提高效率,當搜尋成功之後,發起方可以選擇將搜尋到的條目儲存到查詢路徑的多個節點中,作為方便後繼查詢的cache;條目cache的超時時間與節點-key之間的距離呈指數反比關係。

9. 乙個新節點如何首次加入kad網路?

當乙個新節點首次試圖加入kad網路時,它必須做三件事,其一,不管通過何種途徑,獲知乙個已經加入kad網路的節點資訊(我們可以稱之為節點i),並將其加入自己的k-buckets;其二,向該節點發起一次針對自己id的節點查詢請求,從而通過節點i獲取一系列與自己距離鄰近的其他節點的資訊;最後,重新整理所有的k-bucket,保證自己所獲得的節點資訊全部都是新鮮的。

參考文獻

1. kademlia: a peer-to-peer information system based on the xor metric, petar maymounkov, proc. iptps 2002

2. 到底什麼是kad, http://bbs.5qzone.net/read.php?tid=321431

3. kademlia原理介紹, http://www.edonkey2000.cn/bbs/viewthread.php?tid=58238

eMule中的分布式雜湊表技術 Kademlia

kademlia 簡稱kad 屬於一種典型的結構化p2p覆蓋網路 structured p2p overlaynetwork 以分布式的應用層全網方式來進行資訊的儲存和檢索是其嘗試解決的主要問題。在kademlia網路中,所有資訊均以的雜湊表條目形式加以儲存,這些條目被分散地儲存在各個節點上,從而以...

eMule中的分布式雜湊表技術 Kademlia

前兩天在網上看到世界知名的電騾伺服器razorback 2被查封 4人被拘禁的訊息,深感當前做emule bittorrent等p2p檔案交換軟體的不易。以分布式雜湊表方式 dht,distributed hash table 來代替集中索引伺服器可以說是目前可以預見到的為數不多的p2p軟體發展趨勢...

分布式雜湊表

我們從淺入深一步一步介紹什麼是分布式雜湊表。1 雜湊函式 雜湊函式是一種計算方法,它可以把乙個值a對映到乙個特定的範圍 begin,end 之內。對於乙個值的集合,雜湊函式把他們均勻的對映到某個範圍之中。這樣,通過這些值就可以很快的找到與之對應的對映位址。對於同乙個值,雜湊函式要能保證對這個值的運算...