生活随笔
收集整理的這篇文章主要介紹了
关于端到端通信的讨论(P2P)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
產生于一次群內討論,
最初有人問是否可以不通過服務器,兩個客戶端直接通信
鑒于我是在web開發的,我給出了我的回答
@恒哥 我個人認為這種功能不現實(以我的知識面)
1、如果不經過服務器,這個產品產生的數據就無法獲取,數據的價值無法利用。
2、如果說僅是個人使用,無所謂數據的價值,那么我認為在局域網下進行udp廣播也許可以實現,但實際上在這里還是有服務器,即你的網關或者路由充當了服務器的作用,藍牙應該也是一個道理吧。出了局域網,就需要獨立ip了,ipv4時代,個人的電腦通常都不是獨立ip,所以如果要在廣域網實現這種功能也不太現實。
- 后來有人舉了P2P的例子,并提到了去中心化,這是我在回復時未考慮到的一個點,所以查閱了下資料,整理一下
P2P中,各節點既是用戶,也是服務器,不再依靠傳統意義上的中心服務器分發資源,節點間可以分享資源。
區塊鏈是一個更好的去中心化代表。
第一代的p2p是需要中心服務器來記錄各節點的網絡拓撲圖,強行將各節點拉到一個局域網中(這樣各節點即使使用內網IP也能互相找到彼此),然后進行廣播,但這樣對服務器以及網絡帶寬有極大的壓力。后來興起了DHT(分布式哈希表,各節點自己記錄已知節點的網絡拓撲圖關系,不再依靠中心服務器來記錄,是目前主流的p2p模式),表面上說不再需要中心服務器,但實際上仍然需要類似區塊鏈中創世區塊的節點,即預設的穩定節點。p2p軟件安裝時都會有內置的穩定節點信息,因為如果沒有預設的穩定節點,所謂的p2p網絡就不存在,新節點就找不到組織,這些預設節點應該保存了更多的其他節點信息,然后其他節點又記錄了自己附近節點的信息,于是一張p2p網絡就建立了(A可以通過B節點找到C,想起了康奈爾六度分隔論)。這些預設節點此時屬于什么,就仁者見仁智者見智了,你可以認為它是服務器(提供最初P2P網絡)的一種新的表現形式,也可以認為它就是客戶端節點。
即使A和C都在一個p2p網絡內,假如AC之前沒有過交流,他們并不能直接交互(在第一代p2p時是通過中心服務器來查找彼此的位置),而是要經過中間節點B(一個既認識A也認識C的節點)來充當服務器進行牽線搭橋,然后A和C有了彼此的信息后就可以直接通信傳輸文件了。
DHT這種網絡方案中,各節點既作為客戶端,同時也是服務端(文件下載服務器和p2p打洞服務器負責牽橋搭線)。
題中所說的服務器,要看你理解的是什么了,語義上服務器是指有獨立IP并提供服務的機器(整個p2p中至少有一個獨立ip進行第一層的牽線搭橋,記錄附近節點的網絡拓撲關系,由此可得預設節點中必須有一個這種的節點用作啟動P2P網絡)。
P2P中各節點通信:從用戶角度來看更像是客戶端與客戶端通信。從開發角度來看,更像是客戶端與服務端通信(提供下載服務和網絡發現)。
我在看到客戶端與客戶端直接通信這個問題時,確實未考慮p2p這種情況,主要在于我理解客戶端與客戶端直接通信,應該是一對一的,類似于tcp,可以通過IP+端口號直接找到對方,而不用打洞、廣播和轉發,畢竟udp是無連接的。同時也沒有想到還有NAT打洞這種操作(詳見:https://blog.csdn.net/qq_30145355/article/details/78992731),所以我當時認為兩個不同局域網內的虛擬ip直接進行tcp通信是不可能的。雖然現在主流的的p2p基本都是基于udp打洞的,但tcp打洞應該也是可以實現的,難度較大,NAT設備的不統一都是障礙。
因此只要預先知道彼此的路由關系,通過tcp打洞,理論上即可實現端端通信,即基于tcp的p2p(peer to peer)。
但前提在于如何預先知道彼此的路由關系,如果是少量固定的客戶端可以預設在軟件中,或者口口相傳即可。如果是大量的客戶端,那么就需要類似第一代p2p的中心服務器,要不就是DHT分布式哈希表來存儲節點間網絡拓撲關系。現在的因特網用戶(局域網視為一個因特網用戶)可以通信就是因為有獨立唯一固定的IP,p2p其實就是自己建了一個更高層的因特網,網內的用戶通過某種辦法能找到對方。
-
后來有人舉了藍牙的列子,藍牙確實也是可以兩個手機直接通信的,還有一個更極致的端到端模型,就是門鈴,只要線足夠長,幾百米都可以直接通話。
-
如果我們此時將用戶從2個人,升級到5個人(初始的電話網絡),這種原始的端到端仍然適用
- 之前需要1條電話線,現在每個人都需要連接另外的4個人,一共需要5*4 = 20條線
- 之前拿起話筒就可以通信, 現在需要按鍵1、2、3、4進行選擇然后通話
- 看起來依然高效
-
如果此時用戶量達到了百萬級別(成熟的電話網絡時代),再使用這種原始的端到端連接(網狀連接)會是什么情況:
- 需要100萬* 999999 條電話線,我們的電話就這么巴掌大一塊大小,怎么可能接入999999條電話線呢?
- 這么多線,線的成本以及鋪線的成本巨大
- 撥號還好,從1到100萬,一人分配一個號。
-
顯然原始的端到端網絡不再適用,來到了中心化網絡時代(星形連接),我們建立一臺強大的中心服務器
- 各個用戶只與中心服務器連接,
- A 與 K 通信時,先將請求發送到中心服務器,中心服務器再找到K,并轉發給K,于是AK建立通話。
- 百萬用戶只需要百萬條電話線加一臺中心服務器即可。
- 撥號形式基本未發生太大變化。
-
當用戶邊際全國時,可能我們必須要加上區號才能正常建立通話
-
當在公司內部出現了分機號時,我們可能還要加上分機號轉接
以上是電話通信的一個歷程,網絡通信也是一個類似的過程
-
從兩臺電腦網線直接相連,到多臺電腦使用一個路由器(其實就是局域網),發展到廣域網,由于ip有限,又在廣域網的節點內(獨立固定IP)形成局域網。
-
最初提供服務的形式,由A直接訪問電腦B(局域網使用網上鄰居,美國IPV4有30億,所以他們應該直接訪問對方IP即可)
-
后來發現這樣效率太低,空出來一臺電腦Z 專門提供資源訪問的服務豈不更好。
-
于是中心服務器逐漸發展起來,我們使用資源時只需訪問服務器即可,不需要訪問其他電腦了。
-
特別是IPV4資源缺乏的情況下(中國3億IP,14億人),這種方式及其方便,因為我們是訪問不到其他的用戶(除非NAT打洞)
-
現在服務器提供一般的資源訪問服務問題不大,但是下載大視頻文件時,對服務器的壓力可想而知。
-
于是P2P這種新時代的端到端連接方式偷偷摸摸(對于P2P,我更多用來下載某種不可描述的視頻文件)登場了。
-
目前IPV6還未大規模應用,所以P2P還是需要打洞(記錄各節點的網絡拓撲關系,兩個用戶節點才能找到彼此)
帶有服務端的通信目前只在文件傳輸這塊遇到瓶頸,將來也許會在更多的方面(比如計算)遇到瓶頸,p2p我覺得就是傳說中的云(云計算),將會站出來。
P2p目前應用于文件下載比較多,受限制廣播的安全性以及丟包率,目前應用范圍并不廣。
當ipv6時代到來,應該才是p2p的巔峰(到那時URN也許也大規模應用了)
將來解決了這些問題,以及分布式通信產生的數據存儲的各種問題,通信算法優化(數據包分割的大小,以及提供加速節點數量和選擇、網絡擁塞等),再加上ipv6可以為每臺設備提供唯一固定ip(不需要打洞了,畢竟打洞很累人,tcp打洞太難),再保證最低在線節點數量(相當于P2P預設的穩定節點)。將來這種模式就會是主流,代替現有的網絡通信模式,即全網p2p,做到真正的去中心化,這也去為什么國家大力發展區塊鏈(在我看來這與5G高鐵一樣,是一種基建)。
從端端通信到 端–服務器–端 是通信發展的結果,通過類似于p2p這種分布式搜索提供端端通信可能是未來通信的一種結果。
非通信專業,坐等專業人士指導。
轉載自: https://www.cnblogs.com/lz0925/p/12133248.html
總結
以上是生活随笔為你收集整理的关于端到端通信的讨论(P2P)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。