對等網路(P2P)的概念與思想

來源:互聯網
上載者:User

對等網路(P2P)的概念與思想

我想沒有任何一個產業可像像IT產業一樣,每天都不斷地產生新的名詞,然後在IT裡面由幾個簡單片語成的IT名詞,卻不斷引來大家的誤解,我想P2P就是這些詞中的一個了。

每當我向身邊的同學和師弟提起P2P時,他們都異口同聲地說“我知道 ,點對點嘛”。更多人會認為P2P就是point-to-point的簡稱。我簡直不敢相信,P2P竟引來如此多的誤解。我不知道為什麼P2P會被人說成點對點,可能是資料連結層有個Point-to-Point protocol(PPP協議)吧,因而大誤解P2P為point-to-point,點對點,有點可笑。更有甚者會說,P2P不就是BT嘛,呵呵,有時會搞得我哭笑不得。比較內行的同學才會問一下,你搞的P2P與BT有什麼不同,呵這時才有機會讓我發揮一下。好了,既然P2P這麼多誤解,那我就先給大家澄清一下吧。


首先,整個TCP/IP協議棧中應層以下的協議是為了通訊而設計,無論它是多麼的複雜,對於我們應用程式(應用程式層)來說,TCP/IP是一個基礎設施。因此,在P2P的文獻中會把TCP/IP網路說成為物理網路,進一步來說,如果P2P網路是建立於Ad Hoc網路時,我們也會把Ad Hoc網路稱為物理網路,一句話,物理網路就是應用程式層以下的協議棧層組成的網路,這是一個通訊的基礎設施。

其實P2P就是一個應用程式層的網路,下面用一個C/S的例子就容易明白了。在C/S通訊模式中,有一個伺服器和很多的用戶端,所有的資料都集中在伺服器上。用戶端能夠與伺服器通訊,一個很重要的原因用戶端知道伺服器端的IP和連接埠號碼,因此就可以通訊了。那麼我可以定義,如果主機A知道主機B的IP和連接埠,那麼A可以與B進行通訊,那麼我們認為A在應用程式層上與B有一個邏輯鏈路。那麼節點與鏈路就可以構成一個圖了,那麼這個圖就是網路,應用程式層上的圖也即應用程式層網路,我們稱為覆蓋網路。我們可以想像一下,C/S通訊模式就是一個樹狀的網路,只有一個根(伺服器),所有節點都是它的直接子節點(用戶端)。由於這樣的一個圖非常簡單,並且只與根節點通訊,不存在路由過程(選路過程,注意是應用程式層路由,而不是IP層的),因此,我們把C/S網路不看作覆蓋網路,因為它不存在應用程式層路由過程。

好了,對應用程式層網路有了直接的概念吧,下面我們用一個更複雜的系統來解釋什麼是應用程式層路由,請看圖1。


A---5----B----2----C

|                                |                                    |

3                              4                                  7

|                                |                                    |   

D---3----E----4---- F

<圖1>

在中,A,B,C,..表示P2P的節點(可以認為一個P2P軟體,具有伺服器和用戶端的功能)

,連線表示它們之間有邏輯鏈路(即知道對方的IP和連接埠號碼),連線中的權值表示該鏈路的距離,有邏輯鏈路的兩個節點互為覆蓋網路上的鄰居。值得注意的是,A,B,C是P2P的節點,具有發出請求和處理請求的能力。如A與B通訊,A只需知道 B的IP和連接埠號碼就可以了,它是要通過物理網路進行通訊的,如採用TCP或UDP都可以的。

好了,我說明一下該P2P系統的應用程式層路由過程。路由過程就是將一個請求(資料)轉通過中間節點轉寄到目標節點上。我們現在不論討上面的圖(應用程式層網路結構)是如果得知的,等分析完這個路由演算法後再和大家分析,暫且放擱開它。上面每個節點的軟體內容是完全對等的,它們是通過分布式的演算法進行協作完成一次路由過程的,這點與IP層的路由演算法是完全一樣的。下面是各個節點所啟動並執行路由演算法,重點關注一下吧,這是P2P的精華。

對等體(Peer)的路由演算法:

1)如果節點收到一個查詢請求訊息,先從訊息中提取出要求者和訊息ID,查看本地訊息緩衝是否有該要求者和ID對的記錄,如有則表明該訊息已處理過了,不作任何處理。否則執行2)


2)將要求者和訊息ID存到本地的訊息緩衝中(防止重複處理),並記錄該訊息由誰發送過來的,稱它為前一個節點;然後查看本地的資源是否有請求的資源。如果有的話,向轉給它的前一個節點發一個回複訊息,包括本地的IP和連接埠(下載資源時用的)。否則執行3).

3)將該訊息轉寄給它所有的鄰居,除了前一個節點。

4)如果一個節點收到了一個回複訊息,如果它不是請求節點,則把訊息轉寄給前一個節點,最後回複訊息會回複到請求節點中去。


好了,現在我們用上面的演算法具體分析一下路由過程,還是原來的P2P結構。

A---5----B----2----C

|                                |                                    |

3                             4                                   7

|                               |                                     |

D---3----E----4----F

現在假設節點A要發出資源查詢的請求,並且該資源只存在於節點F中。

第一步,節點A產生一個請求訊息,包含要求者A,訊息ID(獨一無二的值),以及資源名字。它把訊息發給B和D。

第二步,節點D在3個單位時間內收到請求資訊。由於本地沒有處理過該訊息,那麼它把儲存下來,並且沒有該資源,則把它轉寄給E。

第三步,節點B在5個單位時間內收到請求資訊,處理與D一樣,把訊息轉寄給E和C。

第四步,節點E在6個單位時間內收到請求資訊,由於第一次收到該訊息,並且沒有該資源,記錄前一節點為D,把訊息轉寄給B和F。

第五步,C在7個單位內收到請求資訊,處理與上述的一樣,並把它轉給發F。

第六步,E在第9個單位時間內再次收到請求資訊(比較要求者和ID即可知),由於之前已處理過了,對它進行了請求和ID對的緩衝,故不處理。

第七步,B在第10個單位時間內收到從E轉寄過來的請求訊息,重複訊息,與第六步一樣,不處理。同時F在10個單位時間內收到從E處轉寄過來的請求訊息,發現有該資料,那麼它F向E(前一個節點)發送一個回複訊息,E收到該回複訊息後,同樣向D(前一節點)轉寄該回複訊息,這樣最後回複訊息回傳到A上。

…………

這就是一次路由過程(資源查詢過程),當A收到F的回複訊息,可以得知F的IP和連接埠號碼,那麼它可以向F下載資源了。


本次路由過程的特點:由於A不知道F的存,更不知道它所請求的資料存在哪個節點上,所以發出了一次路由過程。同時我們注意到上面的路由演算法是採用廣播式的路由演算法,這樣會產生大量的重複訊息,給網路的通訊帶來很大的負擔,容易造成網路阻塞。其實最有用的鏈路由 A->D->E->F,請求訊息不斷地廣播才找到F,因為所有節點都不知道資源在哪,只有F知道,故唯有廣播了。在F發回複訊息時,它是沿F->E->D->A走的,並不廣播,因為事先已記錄下來了回複的路徑。注意A從回複訊息中獲到資源的存放點,但本系統並不關心A是如何向F下載資源的,本系統只負責資的查詢。


相信大家看了上面的覆蓋網路結構和路由演算法後,腦海裡面會出現很多不同的問題。現我儘可能能想像一下,並給出一個重要的回答。

1.上面的覆蓋網路結構是如何建立的?

如果你能問這個問題,我覺得你有相關的C/S開發經驗,或者對網路有很深入了認識。從事科研朋友通常會略過這個問題,因為在TCP/IP的網路和Ad Hoc網路是有所不同的。其實方法很簡單,當一節點G要加入上面的P2P網路時(節點G剛運行時,還不知道網路有什麼節點是該覆蓋網路的),可以通過IP網路的多播找到該網路上的一個或多個節點,通常各個節點加入一個多播組來偵聽節點的加入訊息就可以了。假設節點G向多播組發送加入訊息後,得到C,E,F的回複,那麼它從回複訊息中,得到C,E,F的IP和連接埠,則把這三個節點作為自己的鄰居,通時通知這三個節點自己的IP和連接埠號碼,使自己變成它們的鄰居。如果得到回複的節點數太多了,則把回複最早的幾個節點(即與當前節點距離最近的)作為自己的鄰居,並通知他們自己的加入。顯然這是一種方法而己,還有很多其它方法。IP的多播方案自提出來已很有久了,但很多路由器對它不支援,因此僅依IP多播加入覆蓋網路已成為了一種侈望。


2.剛才所說的鄰居表到底用來做什麼的?

呵呵,如果你會問這個問題,可能你對網路層的路由演算法一點也不瞭解。鄰居表就是覆覆蓋網路上的路由表,它是由它來進行決策的。鄰居表只是一個局部的資訊,能不能每個節點都儲存網路上其它所有節點的IP和連接埠,以進行通訊呢?假如有的話,並且網路的節點數為n,那麼進行資源查詢時,只需進行O(n)次通訊就可以找到資源的所在節點了。但是,這顯得不太可能了,因P2P網路上的節點上線和下線是非常快的,網路變動很大的。如果每個節點都維護其它線上節點的資訊,那麼節點的鄰由表會達到10W的數量級,並具隨著節點的下線和上線,維護鄰居表的更新的通訊也會因此變得很大的。所以每個節點只能是維護一部分的節點資訊。如果利用鄰居表進行路由決策呢?也即是提到的演算法,這會因不同的P2P系統有所不同。剛才說的系統是廣播的路由演算法,它向每個鄰居都轉寄訊息。當然還有其它系統,採取不同的路由演算法,如基於DHT的Chord。


3.剛才所說的廣播式演算法或過程,是不是指IP多播。

這也是我面試時遇到的一個問題,他們認為P2P就是利用了IP多播進行資源查詢的。很多人都沒有想P2P是在應用程式層的,它構建的網路是應用程式層的網路,因此如果進行路由過程中採用廣播式的演算法,也就是說它向所有鄰居發送訊息,但向每個鄰居發訊息時,是採用物理網路的單播而進行的。如中的A要分別向B和D發送訊息時,分別獲得B和D的IP和連接埠,再進行TCP或UDP的通訊。可以把A向B和D發訊息時,可以認為在應用程式層上是廣播的(它確定向所有的邏輯鏈路發送了訊息,類似於廣播式的),而在特理網路上是採用單播,可能先與B進行TCP,再與D進行TCP。當然,新節點加入網路時,可能會使用IP多播的,總的來說,P2P的路由演算法是不使用多播的,否則也不會出現當前P2P的流行。


這裡沒有談到路由的更新問題,如果節點A下線了,那麼它會通知B和D。B和D收到A的下線訊息後,B和D的把鄰居表中的A項刪除,如果認鄰居太少了的話,那麼它可以向它的鄰居的鄰居作為自己的鄰居,這樣使得網路鏈更複雜,可以減少出現網路分裂的情況。如果A是網路的割點,那麼它的出現會使一個網路分成為兩個網路,並且不能相互連信,這是P2P網路所要避免的。更進一步,如果節點A特然下線了,沒有通知B和D,那B和D會通過A所發送的一個定期Keep-Alive(心跳)訊息進行獲知A在不通知的情況下掉線了。B和D就是要自己調整鄰居表了。


好了總結一下,一個P2P系統有什麼東西重要的呢?要由以下幾部體組成:

覆蓋網路的結構:這也就是覆蓋網路的結構上有什麼特點,上面說的那個網路是一個典型的隨機圖結構,它的鄰居是不嚴格的。覆蓋網路所對應的圖有很多特點可以進行分析的,如網路的直徑,它決路由演算法的代價。每個點的度,它決定節點的鄰居表的大小,直接決定維護鄰居表的代價。如一個n節點完全圖,它的直徑是1,而度是n;這決定它的路由過程非常高效,但鄰居表的維護代價就非常大了。另外一個n節點所組成的環形圖,那麼它的直徑是n/2,度是2;故它的路由複雜度為O(n),鄰居表大小為O(1)。

覆蓋網路的路由演算法:這和覆蓋網各的結構是緊密結合在一起的,可以說有什麼樣的結構,就對應什麼的類型的路由演算法。隨機圖的結構,對應的是廣播式的路由演算法;而正則圖則對應對數的路由演算法,類似於K分尋找樹的尋找過程。

節點的加入,初始化路由表,和路由更新,以及容錯演算法:P2P系統是動態,節點不斷地加入和退出。當一個節點加入了,它要運行節點加入演算法,以獲得網路上其它節點的資訊,同時要初始化它的鄰居表(路由表),這樣其它節點知道它加入後,要調整自己的鄰居表(路由更新),以使得新節點加入後,網路結構的性質依然保持。如果某些節點下線,有可能通知,也可能沒有通知其它節點,那麼網路中的相關節點能檢測出來節點掉線,更自動調整鄰居表,使網路結構依然持,這就是容錯演算法所要做的事情了。注意,這些演算法都是獨立運行在每個節點的,它們是通過節點間的協作通訊而工作的。


同時大家會問,P2P的優點是什麼。在此,我不想談它太多的優點,當然它也有缺點,我就談談它的特點吧:

1)可擴充性:這個P2P中一個很誘人的特點,網路可容納的節點個數是無限的,可共用的資源數同樣是無限的。資源分布在不同的節點裡面,它們一起協同而形一個資源無限的網路。

2)分散性:P2P中的資源分布在所有節點中,避免了伺服器的介入,這樣可避免音點屏頸的出現。樣就大大降低了對集中式伺服器的資源和效能要求。

3)健壯性:在集中式網路中,伺服器成為整個系統的屏頸,無論是容量,和電腦處理能力。但是在P2P網路是,這樣的問都都不會出現。系統的資源,電腦能力和儲存能力都是分布在所有的節點上的,理論上是這些能力是無限。


當然P2P還有很多特點,在些不一一列舉。寫到這樣還不能滿足大家的口味,因為沒有提到BT。說聲抱歉,我對BT不瞭解,故不在些分析。你可參考相關的文章進行有選擇性的閱讀。現在流行P2P軟體幾本都是基於中央伺服器的P2P系統。而我們上面析的那個系統是沒有中央伺服器的,所有節點都對等的,請大家分清楚。

至於沒有中央伺服器的P2P能否走向商業化,還有待大家的關注,有興趣的朋友請繼續關注下一篇文章,具體介紹幾個典型的P2P系統。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.