1. 程式人生 > >P2P打洞原理

P2P打洞原理

一、P2P打洞原理

1、打洞解決了什麼問題?

我們平常使用的一般都為私有ip,但是私有ip之間是不能直接通訊的,如果要進行通訊只能通過公網上的伺服器進行資料的轉發,難道我們每次傳送資料都要經過公網上的伺服器轉發嗎?也不是不可以,但是伺服器的承受能力就會大大增加。此時就需要我們的打洞技術的出現了,打洞的出現解決了私有ip之間直接通訊的問題(還是需要經過一次公網伺服器)
例如:QQ中的聊天就廣泛的使用到了打洞技術,不然伺服器的承受能力會大大增加,而且會影響聊天的效率。

2、打洞的實現過程與原理

私有ip的資料都要經過路由器的轉發,路由器上有一張NAPT表(IP埠對映表),NAPT表記錄的是【私有IP:埠】與【公有IP:埠】的對映關係(就是一一對應關係),本文講到的路由均是以NAPT為工作模式,這並不影響對打洞。實際中的資料實際傳送給的都是路由器的【公有IP:埠】,然後經過路由器進過查詢路由表後再轉發給【私有的IP:埠】的。

舉個示例:
使用者A
電腦IP:192.168.1.101
桌面上有個客戶端程式採用的網路埠:10000
路由器的公有IP:120.78.201.201(實際中常常為多級路由,這裡以最簡單的一層路由舉例)
NAPT路由器的NAPT表的其中一條記錄為:【120.78.201.201:20202】-【192.168.1.101:10000】

使用者B
電腦IP:192.168.2.202
桌面上有個客戶端程式採用的網路埠:22222
路由器的公有IP:120.78.202.202
NAPT路由器的NAPT表的其中一條記錄為:【120.78.202.202:20000】-【192.168.2.202:22222】

打洞伺服器P2Pserver
IP:120.78.202.100
port:20000

此時使用者A的電腦發給了伺服器一條資料,伺服器收到使用者A的IP與埠是多少呢?當然為120.78.201.201:20202,資料包經過路由的時候進行了重新的封包。如果伺服器此時發一條資料給使用者A,發往的IP與埠是什麼呢?當然為120.78.201.201:20202,此時路由器收到這個資料包後,進行查詢NAPT表中120.78.201.201:20202對應的IP與埠資訊,發現是192.168.1.101:10000,然後路由器就轉發給IP為192.168.1.101:10000的電腦,然後電腦上的應用程式就收到這條資訊了。

既然如此,我們私有IP雖然不能直接通訊,但是我們能夠發給公有IP!如果使用者B需要給使用者A發一條資訊時,使用者B直接將資料發往目的IP、埠為120.78.201.201:20202的地方不就行了?
這裡有兩個問題:
第一,使用者B怎麼知道使用者A在路由上對映的IP與埠;
第二,使用者B直接將資料包發往120.78.201.201:20202,路由器是會將使用者B的資料包丟棄的,因為路由器裡面沒有關於使用者B120.78.202.202的路由資訊(路由器裡面還有個路由表,用於路由),無法進行路由,所以將會進行丟棄。

如何解決第一個問題?
通過打洞伺服器,將使用者A對映的IP、埠資訊告訴使用者B即可。
如何解決第二個問題?
如果打洞伺服器首先告訴使用者A先發一條資訊給使用者B(使用者A得知使用者B的地址資訊也是通過打洞伺服器),注意此時使用者B是收不到的,使用者B的路由同樣會進行丟棄,但是這並不要緊,因為使用者A發了這條資訊後,使用者A的路由就會記錄關於使用者B的路由資訊(該資訊記錄的是將使用者B的IP資訊路由到使用者A電腦),然後此時使用者B再發給使用者A一條資訊,就不會進行丟棄了,因為使用者A的路由裡面有使用者B的路由資訊。

通過解決上面的兩個問題後,我們再通過圖形示意圖來具體瞭解下打洞的過程
在這裡插入圖片描述
整個過程就是我標的序號1->2->3->4->5->6->7->8>9
過程一:1->2
此過程為使用者B向伺服器請求向用戶A打洞
過程二:3->4
此過程為伺服器相應使用者B的打洞請求,告訴使用者A使用者B想與你打洞(資料包中包含使用者B的地址資訊)。
過程三:5->6
使用者A主動發一條資訊給使用者B,目的是為了使得路由器A中能夠有一條關於路由B的IP的路由資訊(注意不是使用者B,使用者B是私有IP),就如圖所示,這條資訊會被丟棄的,因為路由B的路由表中沒有路由A的IP的資訊。
過程四:7->8->9
使用者B再發一條資訊給使用者A,因為此時路由A的路由表中有關於路由B的IP的路由資訊,此時路由A就能路由給使用者A了,至此,使用者A就能直接收到使用者B發的資訊了。注意,此時使用者A發給使用者B不需要打洞,因為路由B中已經有關於路由A的IP的路由資訊了。

還是思路重要,所以有點囉嗦了…本來以為自己對P2P瞭解的算不錯了,但是在書寫的時候發現在細枝末節還是半知半解,因此特此去查閱了一些資料。本文難免有一些不足,希望大家指出不足。

作者:_觀眾
來源:CSDN
原文:https://blog.csdn.net/qq_30145355/article/details/78992731
版權宣告:本文為博主原創文章,轉載請附上博文連結!