天天看點

P2P對等網絡讀後筆記

作者:趙培龍 日期:2013/11/8

p2p的研究對象

p2p的研究有人說在三個方面:

  1. 實作技術
  2. 通信模式
  3. 網絡拓撲

我認為這三方面主要就是解決2個問題:

  1. 如何在p2p網絡中找到相應的資源
  2. 如何從找到的資源裡得到資源

就是如何找和如何得到的問題的研究。

之是以分為上面的三個方面,我個人覺得,網絡拓撲就主要是為尋找資源做支撐,通信模式主要是為尋找資源和得到資源做支撐,實作技術就是講從網絡拓撲、通信模式上如何實作。

我們先從p2p的網絡拓撲模式說起。

P2P網絡拓撲的分類和發展

第一代P2P網絡:中央集權

第一代P2P網絡的代表就是大名鼎鼎的Napster了,這個牛叉的音樂共享軟體,掀起了一個共享的時代,讓版權商無比頭疼的時代。

第一代P2P網絡的特點就是“中央集權”,這種網絡有一個中央伺服器,這中央伺服器是在整個P2P網絡中知道全網所有的資源所處的位置,任何一個使用者想要得到某個資源隻需要向中央伺服器問就好了。

這相當于我們在現實生活中使用搜尋引擎達到我們查找網站的目的類似,我們向搜尋引擎尋找目标網站的關鍵字,搜尋引擎傳回網站的網址,我們然後在直接通路網站。

這是一種非常樸素的思想,也是一種非常管用而且好實作的思想。

but 這種P2P的網絡有個明顯的缺點:

那就是單點瓶頸,很明顯,第一代的P2P網絡是圍繞中央伺服器形成的一種星狀網絡圖,隻要中央伺服器挂了,那麼維系這個網絡的樞紐節點就沒有了,那麼這個網絡就失效了。

而且在那個年代,最緻命的是這種模式很容易讓版權商抓到小辮子,以侵權的借口就可以用法律的手段讓這個網絡立馬陷入癱瘓。

由于第一代網絡的這種巨大軟肋,于是出現了和第一代P2P網絡完全不同,完全極端的方式的第二代P2P網絡。

第二代P2P網絡:人民戰争

由于第一代網絡的緻命弱點,推動産生了第二代的P2P網絡:

即純分布式的P2P網絡,形象的說就是“人民戰争”。這個網絡的特點是,完全沒有一個中央伺服器,甚至連類似中央伺服器功能的節點都沒有!

每個參與這個網絡的節點功能都完全一模一樣。

每個節點都是随機的加入這個網絡,是以可以想象,這樣子的網絡會是什麼樣的拓撲結構?完全沒有拓撲,完全的随機,網絡拓撲是無比的複雜。

那這樣子的網絡,他們是如何查找資源呢?

我們可以聯想一下,你面前有100萬個人,你現在需要一塊錢的硬币,你怎麼才能最快的從人群中借到一塊錢的硬币?(假設,每個人都是樂于助人的且,不是每個人都有一塊錢硬币)最佳的方式應該隻有你去問離你最近的人,你最近的人要是沒有的話,你周邊的人又去問他周邊的人,這樣子很快這100萬人都會知道你需要一塊錢的硬币,其中有一塊錢的硬币的人就會借給你。(有一個很有意思的模型,叫做小世界模型,大概的意思就是說世界很小,每個不相識的人隻需要通過他認識的幾個人連續介紹幾次就認識了)

從上面的那個執行個體裡,我們可以抽象成我們的P2P網絡,比如我們的P2P網絡中有100萬個節點,某個節點需要查找某個資源,那麼這個節點隻有向他周圍的節點去問!這就是一種泛洪的思想。隻要是網絡是連通的,那麼總會通知到有這個資源的節點。這樣就解決了内容查找的問題了

but,這也有很大的缺點。當這個P2P網絡足夠大的時候,由于每一個節點都在産生或者轉發請求消息,很有可能産生網絡風暴,讓網絡的可用性變差。而且還有一個問題,就是響應風暴,比如我們剛剛舉得那個借一塊錢的硬币的例子,若是這個100萬人之中有50萬人有一塊錢的硬币,他們直接把硬币向你抛過來,那麼可以想象的結果是,你被錢給砸死了!哈哈。

同理!請求資源的節點也極有可能被熱情的群衆們給弄死。

這種純P2P網絡的代表主要有Gnutella

混合式P2P網絡:古人雲,中庸之道

前面的P2P網絡都是太過于極端了,要麼中央集權,要麼就是純人民路線,人民其實也是需要上司的,在這種要求下,出現了混合式的P2P網絡

即局部是集中式的,整體上還是純分布式的。這樣子就可以大大降低純分布式的P2P網絡的規模,原先是每個節點都為P2P的節點,如今在純分布式P2P的網絡層面上,參與者不在是單個節點了而是有局部的中央節點和圍繞中央節點組成的大一撮節點,有點像抱團。

結構化的P2P網絡

從上面的介紹我們可以看出,P2P網絡的一個核心就在于如何定位到資源所在何處,由于這個問題的存在,是以才有中央伺服器,或者泛洪查詢這些機制,但是這些機制都有着或多或少的缺點,我們從問題的根本上出發,發現有一種資料結構能解決類似的這種問題。那就是哈希表。

哈希表的特點是:我們計算出哈希值之後就能快速的定位到哈希表了,隻要是原始資料一樣,那麼計算出來的哈希值就是一緻的,就能快速定位到哈希表中的相關位置,這樣子查詢幾乎是O(1).

在P2P網絡中,我們需要的資源的内容一緻,那麼我們就可以計算這資源的哈希值,我們希望通過哈希值能夠快速定位到擁有資源的節點上。于是産生了DHT(Distribution Hash Table)分布式哈希表。

從結構上看,DHT主要分為了三個部分

  1. key值空間這就是一個哈希值的集合,包含了所有會出現的哈希值。
  2. key值空間分割這個的主要目的是将哈希值分割成若幹部分,這是由于P2P網絡中的分布式特性決定的,由每一個節點管理一部分哈希值空間,在整體上隻要能覆寫全整個哈希值空間就行了
  3. 延展網路這個就是節點之間互相的連接配接了

我們從DHT釋出一個檔案名為filename且内容為value的檔案舉個栗子

  1. 計算出檔案名filename的哈希值key
  2. 使用put(key,value)的方法把這個随機送到參與分布式哈希表中的任意節點上
  3. 資訊在網絡中傳遞,一直傳到key被管理的節點上
  4. 然後最終的節點存儲

具體的實作可以詳細看看Chord、Pastry、CAN算法最後附上一個連接配接關于一緻性哈希 一緻性哈希

這裡文章我主要是參考了P2P對等網絡原理與應用/蔡康 ... [等] 編著