P2P(Peer to Peer)對等網絡
P2P技術屬於覆蓋層網絡(Overlay Network)的范疇,是相對於客戶機/服務器(C/S)模式來說的一種網絡信息交換方式。在C/S模式中,數據的分發采用專門的服務器,多個客戶端都從此服務器獲取數據。
優點是:數據的一致性容易控制,系統也容易管理。
缺點是:因為服務器的個數只有一個(即便有多個也非常有限),系統容易出現單一失效點;單一服務器面對眾多的客戶端,由於CPU能力、內存大小、網絡帶寬的限制,可同時服務的客戶端非常有限,可擴展性差。
P2P技術正是為了解決這些問題而提出來的一種對等網絡結構。在P2P網絡中,每個節點既可以從其他節點得到服務,也可以向其他節點提供服務。這樣,龐大的終端資源被利用起來,一舉解決了C/S模式中的兩個弊端。
P2P應用軟件主要包括文件分發軟件、語音服務軟件、流媒體軟件。目前P2P應用種類多、形式多樣,沒有統一的網絡協議標准,其體系結構和組織形式也在不斷發展。
對等網絡的基本結構
集中式對等網絡基於中央目錄服務器,為網絡中各節目提供目錄查詢服務,傳輸內容無需再經過中央服務器。這種網絡,結構比較簡單,中央服務器的負擔大大降低。但由於仍存在中央節點,容易形成傳輸瓶頸,擴展性也比較差,不適合大型網絡。但由於目錄集中管理,對於小型網絡的管理和控制上倒是一種可選擇方案。
無結構分布式網絡與集中式的最顯著區別在於,它沒有中央服務器,所有結點通過與相鄰節點間的通信,接入整個網絡。在無結構的網絡中,節點采用一種查詢包的機制來搜索需要的資源。具體的方式為,某節點將包含查詢內容的查詢包發送到與之相鄰的節點,該查詢包以擴散的方式在網絡中蔓延,由於這樣的方式如果不加節制,會造成消息泛濫,因此一般會設置一個適當的生存時間(TTL),在查詢的過程中遞減,當TTL值為0時,將不再繼續發送。
這種無結構的方式,組織方式比較松散,節點的加入與離開比較自由,當查詢熱門內容時,很容易就能找到,但如果需求的內容比較冷門,較小的TTL不容易找到,而較大的TTL值又容易引起較大的查詢流量,尤其當網絡范圍擴展到一定規模時,即使限制的TTL值較小,仍然會引起流量的劇增。但當網絡中存在一些擁有豐富資源的所謂的類服務器節點時,可顯著提高查詢的效率。
結構化分布式網絡,是近幾年基於分布式哈希表(Distributed Hash Table)技術的研究成果。它的基本思想是將網絡中所有的資源整理成一張巨大的表,表內包含資源的關鍵字和所存放結點的地址,然后將這張表分割后分別存儲到網絡中的每一結點中去。當用戶在網絡中搜索相應的資源時,它將能發現存儲與關鍵詞對應的哈希表內容所存放的結點,在該結點中存儲了包含所需資源的結點地址,然后發起搜索的結點根據這些地址信息,與對應結點連接並傳輸資源。這是一種技術上比較先進的對等網絡,它具有高度結構化,高可擴展性,結點的加入與離開比較自由。這種方式適合比較大型的網絡。
對等網絡經典結構
分布式哈希表(DHT)[1]是一種功能強大的工具,它的提出引起了學術界一股研究DHT的熱潮。雖然DHT具有各種各樣的實現方式,但是具有共同的特征,即都是一個環行拓撲結構,在這個結構里每個節點具有一個唯一的節點標識(ID),節點ID是一個128位的哈希值。每個節點都在路由表里保存了其他前驅、后繼節點的ID。如圖1(a)所示。通過這些路由信息,可以方便地找到其他節點。這種結構多用於文件共享和作為底層結構用於流媒體傳輸[2]。
網狀結構如圖1(c)所示,又叫無結構。顧名思義,這種結構中,所有的節點無規則地連在一起,沒有穩定的關系,沒有父子關系。網狀結構[5]為P2P提供了最大的容忍性、動態適應性,在流媒體直播和點播應用中取得了極大的成功。當網絡變得很大時,常常會引入超級節點的概念,超級節點可以和任何一種以上結構結合起來組成新的結構,如KaZaA[6]。


(1)分布式科學計算
P2P技術可以使得眾多終端的CPU資源聯合起來,服務於一個共同的計算。這種計算一般是計算量巨大、數據極多、耗時很長的科學計算。在每次計算過程中,任務(包括邏輯與數據等)被划分成多個片,被分配到參與科學計算的P2P節點機器上。在不影響原有計算機使用的前提下,人們利用分散的CPU資源完成計算任務,並將結果返回給一個或多個服務器,將眾多結果進行整合,以得到最終結果。
(2)文件共享
BitTorrent是一種無結構的網絡協議。除了BitTorrent之外,還有不少著名的無結構化的P2P文件共享協議,典型的有Gnutella[8]和KaZaA[6]。
(3)流媒體直播
(4)流媒體點播
(5)IP層語音通信
Skype采取類似KaZaA的拓撲結構,在網絡中選取一些超級節點。在通信雙方直連效果不好時,一些合適的超級節點則擔當起其中轉節點的角色,為通信雙方創建中轉連接,並轉發相應的語音通信包。
典型P2P應用的機制分析
分析典型的P2P應用機制可以深入了解P2P的原理。本節將對文件分發、流媒體應用、語音服務3個領域中具有代表性的軟件機制進行詳細的分析。對於這些軟件的分析有助於理解P2P技術的原理和把握P2P技術未來發展的趨勢。
BitTorrent
BitTorrent軟件用戶首先從Web服務器上獲得下載文件的種子文件,種子文件中包含下載文件名及數據部分的哈希值,還包含一個或者多個的索引(Tracker)服務器地址。它的工作過程如下:客戶端向索引服務器發一個超文本傳輸協議(HTTP)的GET請求,並把它自己的私有信息和下載文件的哈希值放在GET的參數中;索引服務器根據請求的哈希值查找內部的數據字典,隨機地返回正在下載該文件的一組節點,客戶端連接這些節點,下載需要的文件片段。因此可以將索引服務器的文件下載過程簡單地分成兩個部分:與索引服務器通信的HTTP,與其他客戶端通信並傳輸數據的協議,我們稱為BitTorrent對等協議。BitTorrent軟件的工作原理如圖4所示。BitTorrent協議也處在不斷變化中,可以通過數據報協議(UDP)和DHT的方法獲得可用的傳輸節點信息,而不是僅僅通過原有的HTTP,這種方法使得BitTorrent應用更加靈活,提高BitTorrent用戶的下載體驗。
eMule
eMule軟件基於eDonkey協議改進后的協議,同時兼容eDonkey協議。每個eMule客戶端都預先設置好了一個服務器列表和一個本地共享文件列表,客戶端通過TCP連接到eMule服務器進行登錄,得到想要的文件的信息以及可用的客戶端的信息。一個客戶端可以從多個其他的EMule客戶端下載同一個文件,並從不同的客戶端取得不同的數據片段。eMule同時擴展了eDonkey的能力,允許客戶端之間互相交換關於服務器、其他客戶端和文件的信息。eMule服務器不保存任何文件,它只是文件位置信息的中心索引。eMule客戶端一啟動就會自動使用傳輸控制協議(TCP)連接到eMule服務器上。服務器給客戶端提供一個客戶端標識(ID),它僅在客戶端服務器連接的生命周期內有效。連接建立后,客戶端把其共享的文件列表發送給服務器。服務器將這個列表保存在內部數據庫內。eMule客戶端也會發送請求下載列表。連接建立以后,eMule服務器給客戶端返回一個列表,包括哪些客戶端可以提供請求文件的下載。然后,客戶端再和它們主動建立連接下載文件。圖5所示為eMule的工作原理。
eMule基本原理與BitTorrent類似,客戶端通過索引服務器獲得文件下載信息。eMule同時允許客戶端之間傳遞服務器信息,BitTorrent只能通過索引服務器或者DHT獲得。eMule共享的是整個文件目錄,而BitTorrent只共享下載任務,這使得BitTorrent更適合分發熱門文件,eMule傾向於一般熱門文件的下載。
迅雷
迅雷是一款新型的基於多資源多線程技術的下載軟件,迅雷擁有比目前用戶常用的下載軟件快7~10倍的下載速度。迅雷的技術主要分成兩個部分,一部分是對現有Internet下載資源的搜索和整合,將現有Internet上的下載資源進行校驗,將相同校驗值的統一資源定位(URL)信息進行聚合。當用戶點擊某個下載連接時,迅雷服務器按照一定的策略返回該URL信息所在聚合的子集,並將該用戶的信息返回給迅雷服務器。另一部分是迅雷客戶端通過多資源多線程下載所需要的文件,提高下載速率。迅雷高速穩定下載的根本原因在於同時整合多個穩定服務器的資源實現多資源多線程的數據傳輸。多資源多線程技術使得迅雷在不降低用戶體驗的前提下,對服務器資源進行均衡,有效降低了服務器負載。
每個用戶在網上下載的文件都會在迅雷的服務器中進行數據記錄,如有其他用戶再下載同樣的文件,迅雷的服務器會在它的數據庫中搜索曾經下載過這些文件的用戶,服務器再連接這些用戶,通過用戶已下載文件中的記錄進行判斷,如用戶下載文件中仍存在此文件(文件如改名或改變保存位置則無效),用戶將在不知不覺中扮演下載中間服務角色,上傳文件。
PPLive
PPLive軟件的工作機制和BitTorrent十分類似,PPLive將視頻文件分成大小相等的片段,第三方提供播放的視頻源,用戶啟礬PPLive以后,從PPLive服務器獲得頻道的列表,用戶點擊感興趣的頻道,然后從其他節點獲得數據文件,使用流媒體實時傳輸協議(RTP)和實時傳輸控制協議(RTCP)進行數據的傳輸和控制。將數據下載到本地主機后,開放本地端口作為視頻服務器,PPLive的客戶端播放器連接此端口,任何同一個局域網內的用戶都可以通過連接這個地址收看到點播的節目。圖6所示為PPLive的工作原理示意圖。
Skype
Skype是網絡語音溝通工具。它可以提供免費高清晰的語音對話,也可以用來撥打國內國際長途,還具備即時通訊所需的其他功能,比如文件傳輸、文字聊天等。Skype是在KaZaA的基礎上開發的,就像KaZaA一樣,Skype本身也是基於覆蓋層的P2P網絡,在它里面有兩種類型的節點:普通節點和超級節點。普通節點是能傳輸語音和消息的一個功能實體;超級節點則類似於普通節點的網絡網關,所有的普通節點必須與超級節點連接,並向Skype的登陸服務器注冊它自己來加入Skype網絡。Skype的登陸服務器上存有用戶名和密碼,並且授權特定的用戶加入Skype網絡,圖7所示為Skype的體系結構[18]。
Skype的另一個突出特點就是能夠穿越地址轉換設備和防火牆。Skype能夠在最小傳輸帶寬32 kb/s的網絡上提供高質量的語音。Skype是使用P2P語音服務的代表。由於其具有超清晰語音質量、極強的穿透防火牆能力、免費多方通話以及高保密性等優點,成為互聯網上使用最多的P2P應用之一。

有一個私有網絡10.*.*.*,Client A是其中的一台計算機,這個網絡的網關(一個NAT設備)的外網IP是155.99.25.11(應該還有一個內網的IP地址,比如10.0.0.10)。如果Client A中的某個進程(這個進程創建了一個UDP Socket,這個Socket綁定1234端口)想訪問外網主機18.181.0.31的1235端口,那么當數據包通過NAT時會發生什么事情呢?

接上面的例子,如果Client A的原來那個Socket(綁定了1234端口的那個UDP Socket)又接着向另外一個Server S2發送了一個UDP包,那么這個UDP包在通過NAT時會怎么樣呢?


參考文章:
P2P技術原理:http://www.360doc.com/content/14/0305/17/8285430_357987074.shtml
P2P技術現狀及發展未來:http://www.zte.com.cn/cndata/magazine/zte_communications/2007/6/magazine/200712
P2P原理及其常用的實現方式:http://www.cppblog.com/peakflys/archive/2013/01/25/197562.html