最近在看Kademlia的協議原理,我對裡面的內容一知半解,其中一個就是,為什麼一個節點知道另外一個節點的ID,卻不知到IP和port?這個ID是怎麼得到的?還有就是,為什麼要找這個ID呢?


Kad主要是這樣的,它既可以用來找節點,也可以用來找內容。

用來找節點的方式大概是這樣:A節點希望找到B節點,那麼A需要知道B的ID。在已知ID的情況下,A向周圍的節點打聽,你們誰知道B的情況?但向誰問這本身是一門學問,如果盲目的亂問,效率就會比較低,因此A應當從周圍節點中選出一個離B最近的來問,我們叫他A1。如果A1知道B,那麼他告訴A,B的IP和Port是啥!當然更多情況下是A1也不知道B,那麼A1再從他周圍選出一個離B最近的A2(A2離B需要比A1離B更近),把A2的IP和Port告訴A,這意思就是A2是我一個可靠的哥們,他比我清楚,有什麼問題你直接問他。於是A2也成了A周圍的節點,然後又回到上面的步驟,以此類推直到找到B為止。當然這個迭代過程可能會收斂的很慢,碰上極端情況都是單線聯繫,找個幾萬次也是有可能的,為了避免這樣的問題,每個節點都需要保留一些可以讓這個迭代快速收斂的節點,也就是說離他遠和離他近的節點都要留一些,兩個節點的每一次通訊有些類似盤道,互相說我還認識誰誰誰呢......然後各自拿個小本記下來,以備以後用的上。

找內容同找節點類似,內容通過計算Hash同樣得到一個ID,然後找到離這個ID最近的真實節點,這個節點上保存著內容的索引(也就是說都誰有這個內容,他們的IP和Port)。


推薦閱讀:

VeryCD 沒有雙拼域名,甚至都沒有正式的中文名,為什麼也可以這麼火?
VeryCD 和 電驢到底是什麼關係?
BT 和電驢在理論上有什麼區別?兩種下載協議的對比有什麼不同?

TAG:P2P | P2P組織形式 | eMule |