天天看點

《c# 實作p2p檔案分享與傳輸系統》 一、 模型

  P2P的概念大家都不陌生,也就是所謂的“點對點傳輸”,即不直接通過伺服器,在兩台或多台用戶端之間傳輸資料,實作資訊交流和資源共享。P2P技術已經發展了很多年了,雖然理論上已經發展了很多的模型,但在實際的網絡環境中(尤其是鎮裡這種環境),究竟怎樣的網絡結構才具有較好的穩定性和較高的傳輸性能,還是有很大的争議,每家做P2P的網絡公司都會有不同的見解。目前,P2P技術應用的主要目的還是減輕伺服器工作壓力,本人不才,之前曾在國内某網絡軟體公司裡擔任p2p相關的流媒體項目開發,對于P2P技術所創造的能力和帶來的價值深有體會,也曾被它的複雜性所折磨的痛苦不已,不過,這也是我所珍惜的一筆寶貴的知識财富。

  似乎扯遠了。。。趕緊回來,前段時間做了一個c#實作p2p檔案傳輸系統的項目。以前都是用c/c++,這還是第一次用c#來做這種項目,由于用c++比用c#要早的多,是以寫c#程式不免會帶些c++的習慣,不過不影響程式整體。第一步:設計。對于“檔案分享和傳輸”這種典型的p2p應用,可以使用成熟的模型和架構:

《c# 實作p2p檔案分享與傳輸系統》 一、 模型

  上面這個圖裡面有幾個固定的端點:Peer、Tracker Server、NAT Server和Source Server,還有兩個遊離的元素:資料和下載下傳節點,它們構成了一個完整的p2p網絡。在這個網絡中,它們各司其職,維系着網絡的運轉。

Peer 整個系統的核心所在,主要負責資源提供和資源索取,驅動着網絡的運作。也隻有Peer,是唯一的一個必須存在的元素。

Tracker Server 如其名所述,動态、實時地監視着整個網絡中peer節點的狀态和資源分布,向下載下傳節點提供p2p資源查詢的重要功能,通過tracker server,下載下傳節點可以迅速而準确的擷取網絡中擁有資源的節點清單,展開p2p下載下傳。

NAT Server 負責NAT穿透,也形象的稱為“打洞”。對于藏在受限型NAT網絡後面的節點,不通過NAT Server做穿透的話,是無法和NAT後面的節點進行通信的,而目前大部分人是沒有公網IP的,NAT Server對于組建p2p網絡十分的重要。對于NAT穿透,我會在後面的文章中解釋。

Source Server 負責資源提供或資源釋出,一般網絡公司建立的p2p網絡,會有這種伺服器來釋出需要推廣和擴散的資源。

  這個模型基本涵蓋了p2p網絡架構的主要幾個部分,在具體實施的時候會根據不同的資源類型有不同的變化,通常會更加的複雜,當然,也有可能更簡單。比如,DHT(Distributed Hash Table) 網絡,這種網絡,以不需要伺服器的參與來完成p2p的查詢與傳輸為主要特點,例如大家常用的eMule中的KAD網絡,就是一種DHT網絡。但其實,DHT中,是peer節點,負責了Tracker Server和Source Server的工作。也就是peer變得比較複雜,如果把它拆開來看,也基本就是這個模型。Peer的複雜化,可以降低伺服器運作壓力,但就犧牲了實時性,對于實時性和準确性要求高的應用,例如流媒體,不太适合DHT,當然,這并不妨礙DHT作為輔助手段來探知更多的資源節點。

  我要做的這個“EasyP2P”檔案分享與傳輸系統,目前暫時不需要Source Server,由Peer負責Source Server的功能,也就是資源的釋出;Tracker Server負責節點和資源的查詢;NAT Server依然負責打洞。于是,變化成如下結構:

《c# 實作p2p檔案分享與傳輸系統》 一、 模型

  這就是EasyP2P系統的模型,接下來,将根據這個模型,來具體設計整個網絡的架構和運作流程。

  

《c# 實作p2p檔案分享與傳輸系統》 一、 模型

文章版權haibindev,轉載請注明作者和出處,謝謝合作~