P2P原理以及如何实现(整理)
前言? ? ?
? ?這幾天看了p2p的原理以及實現的demo,整理一下。一共分為三部分,第一是概念原理,第二是demo實現,第三是p2p協議相關以及分類。?
一、概念原理?
比較全面的理解:? https://zhuanlan.zhihu.com/p/30351943
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?http://www.cnblogs.com/pannengzhi/p/4800526.html(推薦)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??http://www.52im.net/thread-50-1-1.html(推薦)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://cloud.tencent.com/developer/article/1005974(推薦)
以下(通俗理解)轉載來自:https://my.oschina.net/gal/blog/141396???????????
? ? ? ? 最近對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之UDP穿透(C++)基于windows平臺:https://blog.csdn.net/jlccwss/article/details/7180676
P2P之UDP穿透(C++)基于Linux平臺:https://github.com/pannzh/P2P-Over-MiddleBoxes-Demo
三、現有p2p協議分類與簡介
https://www.cnblogs.com/cgli/archive/2012/05/11/2496027.htmlhttp://www.cnblogs.com/pannengzhi/tag/P2P/
四、應用
BT和磁力鏈接下載原理
詳解什么是BT種子、迅雷下載鏈接、磁力鏈接、電騾等及使用教程
總結
以上是生活随笔為你收集整理的P2P原理以及如何实现(整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android studio系列文章——
- 下一篇: (毕业设计资料)基于单片机的水位检测系统