P2P穿透NAT的原理

NAT俗稱網(wǎng)絡地址轉(zhuǎn)換,基本NAT都部署在路由器或者交換機上。

為什么需要NAT?

主要還是IP地址的不足,使用少量的公有IP 地址代表較多的私有IP 地址的方式,將有助于減緩可用的IP地址空間的枯竭。用大白話:比如你有一個路由器(家用的那種就可以)這個路由器本身鏈接了公網(wǎng)(被分配到了一個公網(wǎng)的IP地址)。路由器后面有接了N多個設備,每個設備都分配到了一個私有的地址(內(nèi)網(wǎng)地址),這些地址可以通過這個路由器和外網(wǎng)交互(并非是代理的中繼方式)。

兩大類NAT

1. 基本NAT:這種NAT下的私有IP只有少部分(并不是全部)可以和外網(wǎng)通訊。每次這些私有地址向外網(wǎng)發(fā)送數(shù)據(jù)的時候,NAT就會把這個數(shù)據(jù)報的源地址IP修改成NAT的公網(wǎng)地址(這樣接收方以為這個數(shù)據(jù)報是從NAT發(fā)給我的,我后面數(shù)據(jù)報在會給這個NAT就好了),并在NAT內(nèi)存下對應的映射關系(端口和內(nèi)網(wǎng)私有IP的映射)。當NAT收外網(wǎng)的數(shù)據(jù)報的時候,根據(jù)數(shù)據(jù)報的端口號找到內(nèi)網(wǎng)的私有IP地址,將這個數(shù)據(jù)報的目的IP地址修改成內(nèi)網(wǎng)私有IP地址(整個過程NAT負責了IP地址來回替換,輔助完成了內(nèi)網(wǎng)機器和外網(wǎng)設備通訊,這里的外網(wǎng)設備有可能也是一個NAT)。如果收到的數(shù)據(jù)報在映射表中找不到對應映射,這個數(shù)據(jù)報就會被丟棄。

存在問題:基本的NAT由于不會改動端口信息,當內(nèi)部2個不同機器(2個不同的私有IP)使用同樣的端口會出現(xiàn)映射錯誤了。

2. NPAT:這類的NAT是在基本NAT基礎上演化而來,它不僅修改IP地址還有端口號?;究梢詽M足NAT內(nèi)全部的網(wǎng)絡訪問要求。NAT內(nèi)的私有IP地址第一次向外網(wǎng)發(fā)送數(shù)據(jù),NAT會選一個映射表里面還沒有被使用過的端口號,然后修改發(fā)送數(shù)據(jù)報源IP地址源端口號并發(fā)送出去,并把私有IP地址源端口號,和修改后的端口號映射關系記錄下來。之后這個私有IP地址發(fā)送數(shù)據(jù)會首先判別之前是不是已經(jīng)有這個映射關系,如果有就繼續(xù)按照映射關系修改數(shù)據(jù)報。當NAT收到外部的數(shù)據(jù),會從映射表找到對應關系。修改數(shù)據(jù)報的目的IP地址目的端口號,如果映射表中沒有記錄這個數(shù)據(jù)報就會被丟棄了。

解決了基礎NAT的端口問題:通過修改端口的可以讓NAT內(nèi)的多個私有IP地址可以使用相同的端口進行通信。因為NPAT更加靈活所以現(xiàn)在基本的NAT技術(shù)就是指的NPAT技術(shù)。

P2P解決了什么問題?

如果2臺機器在同一個NAT下,那么他們可以直接通信了。

情況 1: 如果2臺機器有一臺在NAT下另一個在外網(wǎng),那么只能NAT內(nèi)的私有機器主動鏈接外網(wǎng)機器,因為外網(wǎng)的機器主動鏈接內(nèi)網(wǎng)的機器,NAT映射表并不存在這個數(shù)據(jù)轉(zhuǎn)發(fā)項,這個數(shù)據(jù)報就被丟棄了。

情況 2: 如果2臺機器都在不同的NAT下,那么不管哪一方發(fā)起鏈接請求數(shù)據(jù)報都不會到達對應的機器。這種情況非常常見。

那么最簡單的方式解決上面2個問題:就是在公網(wǎng)部署一臺中繼服務器,雙方機器都鏈接這臺服務器。然后中繼服務器幫助這2臺服務器轉(zhuǎn)發(fā)數(shù)據(jù)。這種方式最簡單也是效率最低的。

到這里P2P正式登場了:比如有下面這樣的網(wǎng)絡拓撲結(jié)構(gòu)(就是上面情況2)

image

如果NAT-A, IP:40.32.5.125NAT-B, IP:234.12.3.8需要直接通信的話,基本不可能,所以需要做些手段。

假設需要手機(圖中)建立TCP鏈接到電腦(圖中)需要如下手續(xù):

**1. **由被鏈接方發(fā)送數(shù)據(jù)報(可以是UDP甚至是TCP的SYNC握手包)

[圖片上傳失敗...(image-4b61ae-1528199423593)]
綠色線表示了數(shù)據(jù)報流動的方向

圖中電腦NAT-A IP:40.32.5.125 / 端口:4553 發(fā)出了一個數(shù)據(jù)報,這個數(shù)據(jù)報在經(jīng)過NAT-B的時候源IP地址被修改成了NAT-B的IP地址234.12.3.8,源端口被修改成了678。這個數(shù)據(jù)報在到達NAT-A的時候,在映射表中找不到678端口對應的內(nèi)部私有IP的映射。所以這個數(shù)據(jù)報一定會被NAT-A丟棄掉。但是經(jīng)過這次數(shù)據(jù)報發(fā)送,在NAT-B的映射表里面就會標記40.32.5.125:4553我已經(jīng)發(fā)送過數(shù)據(jù)過去了,那么后面只要從這個地址發(fā)送來的數(shù)據(jù)報,我就可以轉(zhuǎn)發(fā)到內(nèi)網(wǎng)正確的設備上面。

**2. **完成第一步后,鏈接方可以發(fā)起數(shù)據(jù)請求

image

這個時候有圖中手機發(fā)送給234.12.3.8:678的數(shù)據(jù),數(shù)據(jù)到達NAT-B后,就不會被攔截。數(shù)據(jù)報會被正確的轉(zhuǎn)發(fā)到圖中電腦上。同樣這步完成后NAT-A也標記了映射(和第一步相同)。之后所有從NAT-B發(fā)出的數(shù)據(jù)就可以順利的通過NAT-A的轉(zhuǎn)發(fā)。從而完成了手機電腦的鏈接。

Tip: 由于P2P在穿透的過程中需要互相知曉對方當前的狀態(tài),還有通過NAT之后的端口。所以還需要一個在公網(wǎng)的服務器作為協(xié)調(diào)服務器,一旦完成了協(xié)調(diào)工作后,這個服務器的就不參與數(shù)據(jù)交換了。

跨ISP性能問題

p2p可以合理的利用互聯(lián)網(wǎng)的資源,比如兩個人視頻聊天。完全可以通過p2p打穿NAT后互發(fā)數(shù)據(jù)(QQ就是這么辦的)。但是有的時候設備之間的直連性能很差,比如:電信的用戶和移動的用戶視頻。這個問題是ISP廠商之間的過渡帶寬太窄,就算是設備直連但是依舊速度不快。所以這里情況下需要自己搭建服務器中繼(中繼也不是完全無作用)。這個服務器就是網(wǎng)關的作用,一般有多個網(wǎng)卡。不同的網(wǎng)卡對接不同的ISP廠商,然后互相轉(zhuǎn)發(fā)。

版權(quán)所有,如有轉(zhuǎn)載請聯(lián)系我本人http://www.breakerror.com/?p=210

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容