簡單易懂的P2P通信原理

P2P就是端到端

我發一條微信給你,這不是P2P。因爲消息並不是直接從我手機發送到你的手機,而是從我手機先發送到微信的服務器,服務器再轉發到你的手機上(當然,轉發給你之前,還會把數據存到服務器),像下邊這樣:
在這裏插入圖片描述
P2P是這樣:
在這裏插入圖片描述

P2P技術要解決的問題

目前使用的終端設備(如手機),絕大部分都僅僅擁有特定網絡下的內網IP,而處在不同內網環境中的設備並不能夠使用內網IP直接進行通信。如何通過一定的手段讓這兩個處在不同內網環境的設備進行直接通信呢?

P2P的知識點

我們的終端設備(比如手機),一定是存在於某個內網環境下邊的,當設備與內網之外的其他設備進行通信時,需要將內網IP轉換爲一個可以被全球任意設備訪問到的公網IP,這種技術叫做NAT,全稱是Network Address Translation,即網絡地址轉換。

根據轉換方式的不同,出現了不同的NAT,理論上有基本NAT,也有一對多NAT,但是現實中基本都是一對多NAT,根據內網設備與外網進行通信時不同的映射規則,又分爲以下幾種類型:

類型 闡述
錐型NAT(Full-cone NAT) 內網ip1:port1會映射到公網ip2:port2,ip1:port1發往外網的包都將通過ip2:port2發出;外部任何ip3:port3都可以通過發送數據包給ip2:port2從而與ip1:port1進行通信。
(地址)限制型錐型NAT((Address)-restricted-cone NAT) 內網ip1:port1會映射到ip2:port2,ip1:port1發往外網的包都將通過ip2:port2發出;外部只有收到過ip2:port2數據包的ip3纔可以發送數據包給ip2:port2從而與ip1:port1進行通信。
端口限制型錐型NAT(Port-restricted cone NAT) 內網ip1:port1會映射到ip2:port2,ip1:port1任何發往外網的包都將通過ip2:port2發出;外部只有收到過ip2:port2數據包的ip3:port3纔可以發送數據包給ip2:port2從而與ip1:port1進行通信。
對稱性NAT(Symmetric NAT) 內網ip1:port1任何一個發往外網ip3:port3的請求,都將使用獨有的公網ip2:port2;外部只有收到過ip1:port1數據包的服務才能返回數據。

總的來說,我們程序發出的包有源地址和源端口,經過NAT之後,映射出的公網地址和端口是否會隨着目的地址和目的端口的變化而變化,決定了它是錐型還是對稱型。這句話有點拗口,但我覺得說的很清楚。同時,只有錐型NAT才能進行P2P,原因是由P2P連接的建立過程決定的。

P2P連接建立過程

P2P連接的建立首先需要一個擁有公網IP的中間服務器S,兩個結點P1和P2。

1、結點P1和P2分別發送數據包給S,數據包在經過NAT時,ip和port進行轉換,ip轉換爲公網ip,port是否轉換需要看NAT的具體實現。S拿到轉換後的P1和P2的地址。
2、S將P1的地址發給P2,將P2的地址發給P1。這裏的地址都是NAT地址。
3、P1收到P2地址後,嘗試建立連接,首先發送消息包給P2(其實是P2的NAT),P2也同樣這樣做,在兩個結點都收到對方的消息包之後,就可以進行通信了。這個過程也叫做打洞。

之所以需要有打洞這個過程,是因爲,NAT會丟棄自己不認識的地址包,讓NAT認識它的方法,就是發出一個到這個地址的數據包。比如讓A認識B,那就讓A發一個數據包給B,不然,B發給A的數據包就會被丟棄。所以打洞的過程不是爲了收到對方的數據包,而是爲了發送數據包給對方,從而認識對方。這樣,之後的通信就可以正常進行了。

剛纔之所以說只有錐型NAT纔可以進行P2P,原因在第三步可以看出來。結點進行打洞的地址,是通過服務器拿到的,而這個地址在對稱型NAT的情況下,並不是一定的,可能會隨時發生變化。也就是說,P1與服務器通信使用的NAT地址和P2與P1通信使用的NAT地址是不同的(一般情況都是端口不同)。甚至P1與服務器通信使用的NAT地址都在不斷的發生變化。這樣讓我們沒辦法拿到隱藏在NAT後邊內網設備的NAT入口,也就沒辦法進行P2P通信了。

P2P也用到了一個服務器,跟微信一樣。但是不同的是,P2P中的服務器只作爲結點地址的中轉站,而微信的服務器是數據的聚寶盆。P2P讓我們的數據僅通過P2P連接發送,而不經過任何第三方的服務器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章