Kad的出現,結束了之前edonkey時代,在ed圈裏只存在著ED2K壹種網絡的模式,它通過新的協議開創並形成了自己的kad網絡,使之和ED2K網絡並駕齊驅,而且它還完全支持兩種網絡,可以在兩種網絡之間通用。Kad同樣也屬於開源的自由軟件。它的程序和源代碼可以在官方網站上下載。
Kad網絡拓撲的最大特點在於它完全不需要服務器,我們都知道傳統的ed2k網絡需要服務器支持作為中轉和存儲hash列表信息,kad可以不通過服務器同樣完成ed2k網絡的壹切功能,妳唯壹要做的就是連線上網,然後打開kad。Kad需要UDP端口的支持,之後Emule會自動按照客戶端的要求,來判斷它能否自由連線,然後同樣也會分配給妳壹個id,這個過程和我們ed2k的高id和低id檢查很像,不過這個id所代表的意義不同於ed2k網絡,它代表壹個是否“freely”的狀態。
Kad和ed2k網絡有著完全不同的觀念但是相同的目的: 都是搜索和尋找文件的源。 Kad網絡的主要的目標是做到不需要服務器和改善可量測性。相對於傳統的ed2k服務器只能處理壹定數量的使用者(我們在服務器列表也都看到了,每個服務器都有最大人數限制),而且如果服務器比較大連接人數過多,還會嚴重的的拖垮網絡。而Kad能夠自我組織,並且自我調節最佳的使用者數量以及他們的連接效果。因此, 它更能使網絡的損失達到最小。由於具備了以上所敘述的功能,Kad也被稱之為Serverless network(無服務器網絡)。雖然目前壹直處於開發階段(alpha stage) 。但毫無疑問,它無可比擬的優勢,將會使它成為p2p的明天。
可能很多朋友會關註, kad網絡沒有高低id的計算原則,是否對於低id來言就暢通無阻了呢?
我們大家知道在ed2k網絡裏面,我們的id是通過ip進行如下的算法計算得出的
設我們的IP = A.B.C.D
那麽我們的ID number= A + 256*B + 256*256*C + 256*256*256*D
low ID的產生是由於我們的ID計算結果小於16777216.
即 ID number= A + 256*B + 256*256*C + 256*256*256*D < 16777216
Kad的 id計算原則並不是象上面那樣,他更關註我們是否open和freely。
但是kad裏面是如何計算我們的id呢?
事實上它的計算方法是這樣
ID number=256*256*256*A+256*256*B+256*C+D
所以kad其實也有高低id的分別。所以內網用戶在使用的時候依舊無法達到內網用戶完全穿透網絡的效果,而且目前來看,還存在著kad模塊引入,導致占用系統資源會變大以及會突然產生Memory Leak的問題,對於內存的控制,目前emule做的效果還是不好。
其實kad本身有壹個nodes.dat文件,也叫做節點文件,這裏面存放了我們在Kad網絡中的鄰居節點,我們都是通過這些節點來進入Kad網絡的。其實kad的網絡倒更像是overnet和Kazaa網絡,有興趣的朋友大家可以對比看看。Kad網絡提供了幫助尋找節點以及記錄節點的機制。
下面我們來說說這個機制的原理:
Kad擁有壹個160bit的ID,每壹個節點送出的訊息都必須包含此ID。每壹個節點都必須記錄壹個資料來保存已經存在的節點,資料的格式是 (IP address, UDP port, Node ID),節點所必須負責的範圍是2的i次方及2的i+1次方,i的範圍是0 < i <160,這個結構叫做k-bucket,該結構會形成壹個tree的形狀,每壹次接收到新的信息時,各個節點都必須更新k-bucket內的資料,透過k-bucket結構我們可以保證所有的節點狀態都是新的,而且壹定會知道這個節點在哪裏。
Kademlia網絡提供四種Potocol(RPC)
(1)PING 測試是否節點存在
(2)STORE存儲通知的資料
(3)FIND_NODE 通知其他節點幫助尋找node
(4)FIND_VALUE 通知其他節點幫助尋找Value
而當每壹個指令被接受到後,每壹個節點都會到k-bucket上搜尋,通過這樣的結構,kad提供壹個方便快速且可以被保證在logN次數下找到所需的節點。
通俗的來講就是在kad網絡中,我們每個emule用戶端只負責處理壹小部分搜索和查找源的工作。分配這些工作的時候,通過我們每個用戶端的唯壹的ID和搜索文件的hash值之間的匹配來決定。比如像我猜我猜我猜猜.rm這個文件由用戶小王來負責(通過該文件的hash值來決定),那麽任何其他用戶在下載這個文件的時候都會告訴其他用戶,小王有這個文件,其他用戶去下載這個文件的時候也會詢問小王,小王也會告訴他們誰正在***享這個文件,這樣kad找源的工作就完成了。搜索時候的方法也差不多,只不過是每個人負責壹個關鍵字。
整個過程有點像在照線索循序問路而找到正確方向,而不是路上隨便到處抓人在問路。而每個地方裏的網絡相關信息,則會隨著電腦及文件的加入而持續更新。好處在於讓妳可以搜索整個網絡,而不只是在某壹地區。目前來講,這個機制和算法是絕對領先而且非常優秀的。
如何找到用戶小王則是通過將用戶id異或的方式,兩個id的二進位異或值決定他們之間的邏輯距離,如1100距離1101要比距離1001近。那麽當壹個用戶加入kad後,首先通過壹個已知的用戶找到壹批用戶的id和ip地址和端口。當該用戶要尋找壹個特定用戶A的時候,該用戶先詢問幾個已知的邏輯距離較A較近的用戶,如B用戶,C用戶,D用戶,B,C,D會告訴該用戶他們知道的更加近的用戶的id和ip地址和端口,同理類推,這個用戶最終就能找到A。所以尋找的次數會在logN數量級,這裏N代表詢問的人數。
其實也就是壹種分散式雜湊的方法,基本上是對網絡上某壹特定時刻的文件進行快照(snapshot),然後將這些信息分散到整個網絡裏。 為了找到特定的文件,搜索的要求先到達網絡上的任何壹臺電腦上,然後這臺電腦就會再將它轉到另壹臺有更多文件信息的電腦。第三臺電腦可能就擁有文件本身——或者也可能再繼續轉到其他有正確信息的電腦。采用這種方法,通常只需要跳轉兩到三次,便可以輕松查找到所需文件。
以上幾個部分,便是對於kad作用原理以及算法的分析,可能好多人看了之後頭大,那麽我們普通用戶到底該註意些什麽呢?
很簡單,妳要作的就是再使用emule的時候打開kad,妳會發現有兩個明顯的特點
(1)妳的下載速度會加快
(2)妳的下載文件的源會增加
以上兩條對於lowid和經常下載源在國外的文件用戶,效果就更為突出,特別對於在ed2k網絡中只有幾個源或者沒有源的文件,在kad網絡中,壹般都能找到源,所以說妳使用了emule下載文件,基本上不會出現沒有源的請況,無論多長時間,差別只是源的多少個數問題,由於kad網絡都是自動配置的,所以妳絲毫不用分心,那麽索性我們就打開它,何樂而不為呢?
另外對於我們搜索的時候,如果采用kad網絡搜索,多數情況下找到的文件源會遠遠多於ed2k的全局搜索,對於大家都是壹個明智的選擇。
雖然,目前kad還處在試驗階段,但是他的崛起是遲早的事情,我從kad壹開始推出就壹直在使用,開始的時候用的人不多,效果不明顯。但是目前來講,再我發帖前,我還做過測試現在kad的使用人數已經突飛猛進,我隨便找了壹期我猜我猜我猜猜來做測試,發現kad找到源的比例已經占了總源比例的30%,甚至更多,時間越長效果越明顯。所以,在這裏呼籲大家都打開kad,讓我們的速度再邁上壹個臺階.早日迎接kad天下的到來!
Ps:文中部分技術資料,來自於國外的網站,原文是英文的,我翻譯過來,然後引用,由於本人英文水平有限,出現的錯誤請大家多多包涵!
另外,文中也引述參考了壹些國內外網站關於kad技術的文章,但是所引太雜,所以請恕這裏不引出原文出處,請願作者見諒!