1. 程式人生 > >P2P原理以及如何實現(整理)

P2P原理以及如何實現(整理)

前言 

這幾天看了p2p的原理以及實現的demo,整理一下。一共分為三部分,第一是概念原理,第二是demo實現,第三是p2p協議相關以及分類。

一、概念原理 

        最近對p2p(peer to peer)技術十分感興趣,以前用VB的時候曾嘗試過學習穿透NAT方面的知識,很可惜那時候並沒有成功(由於我當時的興趣並不大),現在大學開始教 C++,突然間對p2p技術產生興趣,這有很多方面的原因

        現在基本上很多網路應用的軟體都涉及p2p技術(QQ,PPS,對戰平臺...),p2p技術旨在於摒棄以前只能從伺服器獲得資源的觀念,每臺電腦都是一個peer,都可以從其他peer上獲取自己想要的資源,而同時自己也在向他人共享自己的資源.這裡有一個很大的優勢就是可以極大程度節省伺服器的頻寬.
        打個比喻,優酷和pps,一個是基於伺服器->客戶端的模式,一個是p2p技術,優酷要想為使用者提供高清視訊只能通過優化視訊壓縮(例如最新的H.264)和增大自身伺服器頻寬.而pps完全不用擔心頻寬問題,只要使用者數量多的話基本上可以滿速觀看視訊. 在這裡在停停,pps採用的是rmvb壓縮封裝,體積比h264flv大上十倍,但是pps依然可以流暢觀看.這就是p2p技術的優勢.
        當然,我感興趣的不是p2p在網路視訊方面的應用,而是他的穿透NAT的技術,只需要提供一個伺服器(當然在p2p下服務端本身可以是客戶端)就能令兩臺或多臺處於不同區域網內的電腦通訊.另一方面這也算是我學習C++網路程式設計的入門口.
        在中國大部分使用者都使用路由器或交換器之類的其他NAT裝置來共享網路,這使得不同內網的使用者之間的交流變得十分困難,p2p技術的出現確實另其變得可行和簡便.

第二篇:

        首先,在寫這第二篇文章時我對現今的p2p技術的成熟度仍不完全瞭解,基於udp協議的p2p技術可以很確定的說已經完全成熟了,但基於tcp協議的p2p技術是否成熟在我這幾天的搜尋資料中仍然未能得知.雖然最近得到了一份通過p2p使用tcp協議傳輸檔案的原始碼,但其真實性仍然未檢測,由於有許多可能會影響實驗成敗的干擾因素(例如NAT裝置型別的不同,其結果可能不同),我想我會在接下來的時間主要去驗證tcp應用於p2p的可行性.

        可能有很多人問,現在不是有很多軟體採用p2p技術傳輸檔案麼.這說明tcp用於p2p是可以的.但至少我搜索的資料中很少這方面的訊息.我想現在用於檔案可靠傳輸有兩個方法(就我知道而言,聽說還有raw等其他方法),一個或許就是tcp,這是傳輸協議上實現的,另一個就是利用udp模仿tcp的確保檔案準確完整傳輸的功能(大概是什麼滑動視窗?).

        當然這是我日後的工作,現在我要探討的是我目前的成果,就是基於udp協議的穿透nat的方法. 

        或許還有人不知道NAT是什麼,NAT是英文Network Address Translators的縮寫,翻譯過來就是網路地址轉化器,為什麼會出現NAT呢?主要是因為ipv4提供的全球唯一ip已經日漸枯竭,也就是ipv4提供的(x.x.x.x)的地址已經不足以讓全球每一臺電腦都擁有唯一的ip地址,所以就有NAT的出現(當然,是先出現了NAT才開始慢慢枯竭,因為人們已經預料到ip遲早會用完),NAT可使多臺電腦使用同一個全球唯一ip,(當然最近ipv6就要出了).

        而且,類似路由等NAT裝置還可以防止內網主機受到外網的攻擊,這也就是我們需要穿透NAT的原因,,因為路由只允許內網使用者主動連線外網使用者,而不允許外網使用者主動連線內網使用者

        現在按順序講下內網於外網連線的步驟(這是理解穿透NAT的阻礙因素的重要部分!!):

        1.內網使用者(192.168.1.100)(埠:123)向外網使用者(123.123.123.123)(埠:321)傳送資料包

        2.資料包經過NAT,NAT將資料包的ip地址改為外網地址(55.55.55.55),並修改埠為另一個數,例如:6000

        3,此時的資料包變成這樣: 55.55.55.55: 6000-> 123.123.123.123:321

        4.最後NAT會留下一條記錄,表明如下指向 123.123.123.123:123 -> 55.55.55.55:6000 ->192.168.1.100:321

        需注意的是隻有留下記錄後外網特定方向的資料包(上面第四條的方向)才可以傳給內網機器,而且這條記錄只能由內網使用者先向外網傳送第一個資料包才可以產生.最重要的是這條記錄只能用於123.123.123.123:123,其他地址發來的資料包NAT是會拋棄掉的! 

        還有一點:就是這條記錄具有生命週期,過了一定時間會自動刪除!

        瞭解到這點就可以知道外網和內網的通訊的十分簡單的,只要內網使用者事先知道伺服器的地址,而且先向伺服器請求服務就可以建立連線了!

        但是內網與內網的使用者該如何實現通訊??? 試想一下,就算你事先知道對方的外網ip,但是你發過去的訊息會被對方NAT拋棄掉,好吧,你說可以兩個人同時向對方發包,但你畫出圖來看看會發現也是實現不了的!

         試想一下,如果clientA和clientB都同時向對方的 520埠傳送資料包(當然,兩邊的NAT都會拋棄掉他),雖然兩邊都會留下記錄,但是由於NAT修改了埠號為某個數,這樣導致下面兩條記錄:

        clientA的NAT: 44.44.44.44:520 -> 55.55.55.55:62000 -> 192.168.1.47:520

        clientB的NAT: 55.55.55.55:520 -> 44.44.44.44:75000 -> 192.168.1.5:520

        這兩條記錄明顯不能使clientA和clientB建立起連線,因為雙方的NAT都將只接收對方來自520埠的資料包,而對方傳送資料包時NAT都會將原始的埠改為62000,75000(這兩個數是隨機的),這樣當然不會建立起連線!

        再回過來想想,如果有一個處在外網的伺服器可以同時記錄下雙方的埠號的話,這樣A與B的通訊不是可以建立了麼!!!!

二、Demo實現

三、現有p2p協議分類與簡介

四、應用