kad原理和算法的分析以及kad發(fā)展綜述

2010-08-28 10:54:11來源:西部e網(wǎng)作者:

Kad是Kademlia的簡稱,eMule的官方網(wǎng)站在2004年2月27日正式發(fā)布的 eMule v0.42b中,Kad開始正式內(nèi)嵌成為eMule的一個功能模塊,可以說從這個版本開始eMule便開始支持Kad網(wǎng)絡(luò)了。

Kad的出現(xiàn),結(jié)束了之前edonkey一家獨(dú)大的時代,在ed圈里只存在著ED2K一種網(wǎng)絡(luò)的模式,它通過新的協(xié)議開創(chuàng)并形成了自己的kad網(wǎng)絡(luò),使之和ED2K網(wǎng)絡(luò)并駕齊驅(qū),而且它還完全支持兩種網(wǎng)絡(luò),可以在兩種網(wǎng)絡(luò)之間通用。Kad同樣也屬于開源的自由軟件。它的程序和源代碼可以在官方網(wǎng)站http://www.emule-project.net上下載。

Kad網(wǎng)絡(luò)拓?fù)涞淖畲筇攸c(diǎn)在于它完全不需要服務(wù)器,我們都知道傳統(tǒng)的ed2k網(wǎng)絡(luò)需要服務(wù)器支持作為中轉(zhuǎn)和存儲hash列表信息,kad可以不通過服務(wù)器同樣完成ed2k網(wǎng)絡(luò)的一切功能,你唯一要做的就是連線上網(wǎng),然后打開kad。Kad需要UDP端口的支持,之后Emule會自動按照客戶端的要求,來判斷它能否自由連線,然后同樣也會分配給你一個id,這個過程和我們ed2k的高id和低id檢查很像,不過這個id所代表的意義不同于ed2k網(wǎng)絡(luò),它代表一個是否“freely”的狀態(tài)。

Kad和ed2k網(wǎng)絡(luò)有著完全不同的觀念但是相同的目的: 都是搜索和尋找文件的源。 Kad網(wǎng)絡(luò)的主要的目標(biāo)是做到不需要服務(wù)器和改善可量測性。相對于傳統(tǒng)的ed2k服務(wù)器只能處理一定數(shù)量的使用者(我們在服務(wù)器列表也都看到了,每個服務(wù)器都有最大人數(shù)限制),而且如果服務(wù)器比較大連接人數(shù)過多,還會嚴(yán)重的的拖垮網(wǎng)絡(luò)。而Kad能夠自我組織,并且自我調(diào)節(jié)最佳的使用者數(shù)量以及他們的連接效果。因此, 它更能使網(wǎng)絡(luò)的損失達(dá)到最小。由于具備了以上所敘述的功能,Kad也被稱之為Serverless network(無服務(wù)器網(wǎng)絡(luò))。雖然目前一直處于開發(fā)階段(alpha stage) 。但毫無疑問,它無可比擬的優(yōu)勢,將會使它成為p2p的明天。

可能很多朋友會關(guān)注, kad網(wǎng)絡(luò)沒有高低id的計算原則,是否對于低id來言就暢通無阻了呢?

我們大家知道在ed2k網(wǎng)絡(luò)里面,我們的id是通過ip進(jìn)行如下的算法計算得出的
設(shè)我們的IP = A.B.C.D
那么我們的ID number= A + 256*B + 256*256*C + 256*256*256*D
low ID的產(chǎn)生是由于我們的ID計算結(jié)果小于16777216.
即 ID number= A + 256*B + 256*256*C + 256*256*256*D < 16777216

Kad的 id計算原則并不是象上面那樣,他更關(guān)注我們是否open和freely。
但是kad里面是如何計算我們的id呢?
事實(shí)上它的計算方法是這樣
ID number=256*256*256*A+256*256*B+256*C+D
所以kad其實(shí)也有高低id的分別。所以內(nèi)網(wǎng)用戶在使用的時候依舊無法達(dá)到內(nèi)網(wǎng)用戶完全穿透網(wǎng)絡(luò)的效果,但是自從0.47開始引入KAD2代至今,KAD已經(jīng)為LOW ID用戶做了大量的優(yōu)化,所以KAD也是內(nèi)網(wǎng)用戶的福音。

kad本身有一個nodes.dat文件,也叫做節(jié)點(diǎn)文件,這里面存放了我們在Kad網(wǎng)絡(luò)中的鄰居節(jié)點(diǎn),我們都是通過這些節(jié)點(diǎn)來進(jìn)入Kad網(wǎng)絡(luò)的。其實(shí) kad的網(wǎng)絡(luò)倒更像是overnet和Kazaa網(wǎng)絡(luò),有興趣的朋友大家可以對比看看。Kad網(wǎng)絡(luò)提供了幫助尋找節(jié)點(diǎn)以及記錄節(jié)點(diǎn)的機(jī)制。

下面我們來說說這個機(jī)制的原理:
Kad擁有一個160bit的ID,每一個節(jié)點(diǎn)送出的訊息都必須包含此ID。每一個節(jié)點(diǎn)都必須記錄一個資料來保存已經(jīng)存在的節(jié)點(diǎn),資料的格式是 (IP address, UDP port, Node ID),節(jié)點(diǎn)所必須負(fù)責(zé)的范圍是2的i次方及2的i+1次方,i的范圍是0 < i <160,這個結(jié)構(gòu)叫做k-bucket,該結(jié)構(gòu)會形成一個tree的形狀,每一次接收到新的信息時,各個節(jié)點(diǎn)都必須更新k-bucket內(nèi)的資料,透過k-bucket結(jié)構(gòu)我們可以保證所有的節(jié)點(diǎn)狀態(tài)都是新的,而且一定會知道這個節(jié)點(diǎn)在哪里。

Kademlia網(wǎng)絡(luò)提供四種Potocol(RPC)
(1)PING 測試是否節(jié)點(diǎn)存在
(2)STORE存儲通知的資料
(3)FIND_NODE 通知其他節(jié)點(diǎn)幫助尋找node
(4)FIND_VALUE 通知其他節(jié)點(diǎn)幫助尋找Value
而當(dāng)每一個指令被接受到后,每一個節(jié)點(diǎn)都會到k-bucket上搜尋,通過這樣的結(jié)構(gòu),kad提供一個方便快速且可以被保證在logN次數(shù)下找到所需的節(jié)點(diǎn)。

通俗的來講就是在kad網(wǎng)絡(luò)中,我們每個emule用戶端只負(fù)責(zé)處理一小部分搜索和查找源的工作。分配這些工作的時候,通過我們每個用戶端的唯一的ID和搜索文件的hash值之間的匹配來決定。比如像我猜我猜我猜猜.rm這個文件由用戶小王來負(fù)責(zé)(通過該文件的hash值來決定),那么任何其他用戶在下載這個文件的時候都會告訴其他用戶,小王有這個文件,其他用戶去下載這個文件的時候也會詢問小王,小王也會告訴他們誰正在共享這個文件,這樣kad找源的工作就完成了。搜索時候的方法也差不多,只不過是每個人負(fù)責(zé)一個關(guān)鍵字。

整個過程有點(diǎn)像在照線索循序問路而找到正確方向,而不是路上隨便到處抓人在問路。而每個地方里的網(wǎng)絡(luò)相關(guān)信息,則會隨著電腦及文件的加入而持續(xù)更新。好處在于讓你可以搜索整個網(wǎng)絡(luò),而不只是在某一地區(qū)。目前來講,這個機(jī)制和算法是絕對領(lǐng)先而且非常優(yōu)秀的。

如何找到用戶小王則是通過將用戶id異或的方式,兩個id的二進(jìn)位異或值決定他們之間的邏輯距離,如1100距離1101要比距離1001近。那么當(dāng)一個用戶加入kad后,首先通過一個已知的用戶找到一批用戶的id和ip地址和端口。當(dāng)該用戶要尋找一個特定用戶A的時候,該用戶先詢問幾個已知的邏輯距離較 A較近的用戶,如B用戶,C用戶,D用戶,B,C,D會告訴該用戶他們知道的更加近的用戶的id和ip地址和端口,同理類推,這個用戶最終就能找到A。所以尋找的次數(shù)會在logN數(shù)量級,這里N代表詢問的人數(shù)。

其實(shí)也就是一種分散式雜湊的方法,基本上是對網(wǎng)絡(luò)上某一特定時刻的文件進(jìn)行快照(snapshot),然后將這些信息分散到整個網(wǎng)絡(luò)里。為了找到特定的文件,搜索的要求先到達(dá)網(wǎng)絡(luò)上的任何一臺電腦上,然后這臺電腦就會再將它轉(zhuǎn)到另一臺有更多文件信息的電腦。第三臺電腦可能就擁有文件本身 ──或者也可能再繼續(xù)轉(zhuǎn)到其他有正確信息的電腦。采用這種方法,通常只需要跳轉(zhuǎn)兩到三次,便可以輕松查找到所需文件。

以上幾個部分,便是對于kad作用原理以及算法的分析,可能好多人看了之后頭大,那么我們普通用戶到底該注意些什么呢?

很簡單,你要作的就是使用emule的時候打開kad,你會發(fā)現(xiàn)有兩個明顯的特點(diǎn)
(1)你的下載速度會加快
(2)你的下載文件的源會增加
以上兩條對于lowid和經(jīng)常下載源在國外的文件用戶,效果就更為突出,特別對于在ed2k網(wǎng)絡(luò)中只有幾個源或者沒有源的文件,在kad網(wǎng)絡(luò)中,一般都能找到源,所以說你使用了emule下載文件,基本上不會出現(xiàn)沒有源的請況,無論多長時間,差別只是源的多少個數(shù)問題,由于kad網(wǎng)絡(luò)都是自動配置的,所以你絲毫不用分心。

另外對于我們搜索的時候,盡量使用ED2K服務(wù)器搜索,因?yàn)殍b于KAD的運(yùn)作模式,目前KAD搜索的結(jié)果往往是無用的或虛假的。

關(guān)鍵詞:eMule電騾verycd