通俗易懂:快速理解P2P技術中的NAT穿透原理

目錄

  • 1、基礎知識
    • 1.1、什么是NAT?
    • 1.2、為什么會有NAT?
    • 1.3、NAT有什么優缺點?
  • 2、NAT的實現方式
    • 2.1、靜態NAT
    • 2.2、NAPT
  • 3、NAT的主要類型
    • 3.1、完全錐型NAT(Full Cone NAT,后面簡稱FC)
    • 3.2、受限錐型NAT(Restricted Cone NAT)
    • 3.3、端口受限型NAT(Port Restricted Cone NAT)
    • 3.4、對稱型NAT(Symmetric NAT)
    • 3.5、小結
  • 6、NAT路由類型判斷
  • 7、STUN協議介紹
    • 7.1、STUN基本介紹
    • 7.2、STUN的檢測過程
    • 7.3、STUN協議的判斷過程

1、基礎知識

1.1、什么是NAT?

NAT(Network Address Translation,網絡地址轉換),也叫做網絡掩蔽或者IP掩蔽。NAT是一種網絡地址翻譯技術,主要是將內部的私有IP地址(private IP)轉換成可以在公網使用的公網IP(public IP)。

1.2、為什么會有NAT?

時光回到上個世紀80年代,當時的人們在設計網絡地址的時候,覺得再怎么樣也不會有超過32bits位長即2的32次冪臺終端設備連入互聯網,再加上增加ip的長度(即使是從4字節增到6字節)對當時設備的計算、存儲、傳輸成本也是相當巨大的。后來逐漸發現IP地址不夠用了,然后就NAT就誕生了!(雖然ipv6也是解決辦法,但始終普及不開來,而且未來到底ipv6夠不夠用仍是未知)。

因此,NAT技術能夠興起的原因還是因為在我們國家公網IP地址太少了,不夠用,所以才會采取這種地址轉換的策略。可見,NAT的本質就是讓一群機器公用同一個IP,這樣就暫時解決了IP短缺的問題。

1.3、NAT有什么優缺點?

優勢其實上面已經剛剛討論過了,根據定義,比較容易看出,NAT可以同時讓多個計算機同時聯網,并隱藏其內網IP,因此也增加了內網的網絡安全性;此外,NAT對來自外部的數據查看其NAT映射記錄,對沒有相應記錄的數據包進行拒絕,提高了網絡安全性。

那么,NAT與此同時也帶來一些弊端:首先是,NAT設備會對數據包進行編輯修改,這樣就降低了發送數據的效率;此外,各種協議的應用各有不同,有的協議是無法通過NAT的(不能通過NAT的協議還是蠻多的),這就需要通過穿透技術來解決。我們后面會重點討論穿透技術。

簡單的背景了解過后,下面介紹下NAT實現的主要方式,以及NAT都有哪些類型。

2、NAT的實現方式

2.1、靜態NAT

也就是靜態地址轉換。是指一個公網IP對應一個私有IP,是一對一的轉換,同時注意,這里只進行了IP轉換,而沒有進行端口的轉換。

舉個栗子:
在這里插入圖片描述

2.2、NAPT

端口多路復用技術。與靜態NAT的差別是,NAPT不但要轉換IP地址,還要進行傳輸層的端口轉換。具體的表現形式就是,對外只有一個公網IP,通過端口來區別不同私有IP主機的數據。

再舉個栗子:
在這里插入圖片描述
通過上面NAT實現方式的介紹,我們其實不難看出,現實環境中NAPT的應用顯然是更廣泛的。因此下面就重點介紹下NAPT的主要類型有哪些。

3、NAT的主要類型

對于NAPT我們主要分為兩大類:錐型NAT和對稱型NAT。其中錐型NAT又分:完全錐型,受限錐型和端口受限錐型。

概括的說:對稱型NAT是一個請求對應一個端口;錐型NAT(非對稱NAT)是多個請求(外部發向內部)對應一個端口,只要源IP端口不變,無論發往的目的IP是否相同,在NAT上都映射為同一個端口,形象的看起來就像錐子一樣。

下面分別介紹這四種類型及其差異。

3.1、完全錐型NAT(Full Cone NAT,后面簡稱FC)

特點:IP和端口都不受限。

表現形式:將來自內部同一個IP地址同一個端口號(IP_IN_A : PORT_IN_A)的主機監聽/請求,映射到公網IP某個端口(IP_OUT_B : PORT_OUT_B)的監聽。任意外部IP地址與端口對其自己公網的IP這個映射后的端口訪問(IP_OUT_B : PORT_OUT_B),都將重新定位到內部這個主機(IP_IN_A : PORT_IN_A)。該技術中,基于C/S架構的應用可以在任何一端發起連接。是不是很繞啊。再簡單一點的說,就是,只要客戶端,由內到外建立一個映射(NatIP:NatPort -> A1)之后,其他IP的主機B或端口A2都可以使用這個洞給客戶端發送數據。見下圖(圖片來自網絡)。
在這里插入圖片描述

3.2、受限錐型NAT(Restricted Cone NAT)

特點:IP受限,端口不受限。

表現形式:與完全錐形NAT不同的是,在公網映射端口后,并不允許所有IP進行對于該端口的訪問,要想通信必需內部主機對某個外部IP主機發起過連接,然后這個外部IP主機就可以與該內部主機通信了,但端口不做限制。舉個栗子。當客戶端由內到外建立映射(NatIP:NatPort –> A1),A機器可以使用他的其他端口(P2)主動連接客戶端,但B機器則不被允許。因為IP受限啦,但是端口隨便。見下圖(綠色是允許通信,紅色是禁止通信)。
在這里插入圖片描述

3.3、端口受限型NAT(Port Restricted Cone NAT)

特點:IP和端口都受限。

表現形式:該技術與受限錐形NAT相比更為嚴格。除具有受限錐形NAT特性,對于回復主機的端口也有要求。也就是說:只有當內部主機曾經發送過報文給外部主機(假設其IP地址為A且端口為P1)之后,外部主機才能以公網IPORT中的信息作為目標地址和目標端口,向內部主機發送UDP報文,同時,其請求報文的IP必須是A,端口必須為P1(使用IP地址為A,端口為P2,或者IP地址為B,端口為P1都將通信失敗)。例子見下圖。這一要求進一步強化了對外部報文請求來源的限制,從而較Restrictd Cone更具安全性。
在這里插入圖片描述

3.4、對稱型NAT(Symmetric NAT)

特點:對每個外部主機或端口的會話都會映射為不同的端口(洞)。

表現形式:只有來自同一內部IPORT、且針對同一目標IPORT的請求才被NAT轉換至同一個公網(外部)IPORT,否則的話,NAT將為之分配一個新的外部(公網)IPORT。并且,只有曾經收到過內部主機請求的外部主機才能向內部主機發送數據包。內部主機用同一IP與同一端口與外部多IP通信。客戶端想和服務器A(IP_AORT_A)建立連接,是通過NAT映射為NatIP:NatPortA來進行的。而客戶端和服務器B(IP_BORT_B)建立連接,是通過NAT映射為NatIP:NatPortB來進行的。即同一個客戶端和不同的目標IP:PORT通信,經過NAT映射后的公網IP:PORT是不同的。此時,如果B想要和客戶端通信,也只能通過NatIP:NatPortB(也就是紫色的洞洞)來進行,而不能通過NatIP:NatPortA(也就是黃色的洞洞)。
在這里插入圖片描述

3.5、小結

以上,就是NAPT的四種NAT類型。可以看出從類型1至類型4,NAT的限制是越來越大的。

6、NAT路由類型判斷

根據上面的介紹,我們可以了解到,在實際的網絡情況中,各個設備所處的網絡環境是不同的。那么,如果這些設備想要進行通信,首先判斷出設備所處的網絡類型就是非常重要的一步。

舉個例子來說:對于IM中的實時音視頻功能和VoIP軟件,對位于不同NAT內部的主機通信需要靠服務器來轉發完成,這樣就會增加服務器的負擔。為了解決這種問題,要盡量使位于不同NAT內部的主機建立直接通信,其中,最重要的一點就是要判斷出NAT的類型,然后才能根據NAT的類型,設計出直接通信方案。不然的話,兩個都在NAT的終端怎么通信呢?我們不知道對方的內網IP,即使把消息發到對方的網關,然后呢?網關怎么知道這條消息給誰,而且誰允許網關這么做了?

為了解決這個問題,也就是處于內網的主機之間能夠穿越它們之間的NAT建立直接通信,已經提出了許多方法,STUN(Session Traversal Utilities for NAT,NAT會話穿越應用程序)技術就是其中比較重要的一種解決方法,并得到了廣泛的應用。在這個部分,我們將重點介紹下STUN技術的原理。(PS:除此之外,還有UPNP技術,ALG應用層網關識別技術,SBC會話邊界控制,ICE交互式連接建立,TURN中繼NAT穿越技術等等,本文不一一做介紹。)

7、STUN協議介紹

7.1、STUN基本介紹

STUN是一種網絡協議,它允許位于NAT(或多重NAT)后的客戶端找出自己的公網地址,查出自己位于哪種類型的NAT之后以及NAT為某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處于NAT路由器之后的主機之間建立UDP通信。該協議由RFC 5389定義。

STUN由三部分組成:

STUN客戶端;
STUN服務器端;
NAT路由器。

STUN服務端部署在一臺有著兩個公網IP的服務器上,大概的結構參考下圖。STUN客戶端通過向服務器端發送不同的消息類型,根據服務器端不同的響應來做出相應的判斷,一旦客戶端得知了Internet端的UDP端口,通信就可以開始了。
在這里插入圖片描述

7.2、STUN的檢測過程

STUN協議定義了三類測試過程來檢測NAT類型:

Test1:STUN Client通過端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}發送一個Binding Request(沒有設置任何屬性)。STUN Server收到該請求后,通過端口{IP-S1:Port-S1}把它所看到的STUN Client的IP和端口{IP-M1,Port-M1}作為Binding Response的內容回送給STUN Client。
Test1#2:STUN Client通過端口{IP-C1:Port-C1}向STUN Server{IP-S2:Port-S2}發送一個Binding Request(沒有設置任何屬性)。STUN Server收到該請求后,通過端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M1#2,Port-M1#2}作為Binding Response的內容回送給STUN Client。
Test2:STUN Client通過端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}發送一個Binding Request(設置了Change IP和Change Port屬性)。STUN Server收到該請求后,通過端口{IP-S2:Port-S2}把它所看到的STUN Client的IP和端口{IP-M2,Port-M2}作為Binding Response的內容回送給STUN Client。
Test3:STUN Client通過端口{IP-C1:Port-C1}向STUN Server{IP-S1:Port-S1}發送一個Binding Request(設置了Change Port屬性)。STUN Server收到該請求后,通過端口{IP-S1:Port-S2}把它所看到的STUN Client的IP和端口{IP-M3,Port-M3}作為Binding Response的內容回送給STUN Client。

STUN協議的輸出是:

1)公網IP和Port;
2)防火墻是否設置;
3)客戶端是否在NAT之后,及所處的NAT的類型。

因此我們進而整理出,通過STUN協議,我們可以檢測的類型一共有以下七種:

A:公開的互聯網IP:主機擁有公網IP,并且沒有防火墻,可自由與外部通信;
B:完全錐形NAT;
C:受限制錐形NAT;
D:端口受限制形NAT;
E:對稱型UDP防火墻:主機出口處沒有NAT設備,但有防火墻,且防火墻規則如下:從主機UDP端口A發出的數據包保持源地址,但只有從之前該主機發出包的目的IP/PORT發出到該主機端口A的包才能通過防火墻;
F:對稱型NAT;
G:防火墻限制UDP通信。

7.3、STUN協議的判斷過程

輸入和輸出準備好后,附上一張維基百科的流程圖,就可以描述STUN協議的判斷過程了。
在這里插入圖片描述
STEP1:檢測客戶端是否有能力進行UDP通信以及客戶端是否位于NAT后 – Test1
客戶端建立UDP socket,然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器返回客戶端的IP和Port,客戶端發送請求后立即開始接受數據包。重復幾次。
a)如果每次都超時收不到服務器的響應,則說明客戶端無法進行UDP通信,可能是:G防火墻阻止UDP通信;
b)如果能收到回應,則把服務器返回的客戶端的(IP:PORT)同(Local IP: Local Port)比較:

  • 如果完全相同則客戶端不在NAT后,這樣的客戶端是:A具有公網IP可以直接監聽UDP端口接收數據進行通信或者E。
  • 否則客戶端在NAT后要做進一步的NAT類型檢測(繼續)。

STEP2:檢測客戶端防火墻類型 – Test2
STUN客戶端向STUN服務器發送請求,要求服務器從其他IP和PORT向客戶端回復包:
a)收不到服務器從其他IP地址的回復,認為包前被前置防火墻阻斷,網絡類型為E;
b)收到則認為客戶端處在一個開放的網絡上,網絡類型為A。

STEP3:檢測客戶端NAT是否是FULL CONE NAT – Test2
客戶端建立UDP socket然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器用另一對(IP-2,Port-2)響應客戶端的請求往回發一個數據包,客戶端發送請求后立即開始接受數據包。 重復這個過程若干次。
a)如果每次都超時,無法接受到服務器的回應,則說明客戶端的NAT不是一個Full Cone NAT,具體類型有待下一步檢測(繼續);
b)如果能夠接受到服務器從(IP-2,Port-2)返回的應答UDP包,則說明客戶端是一個Full Cone NAT,這樣的客戶端能夠進行UDP-P2P通信。

STEP4:檢測客戶端NAT是否是SYMMETRIC NAT – Test1#2
客戶端建立UDP socket然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器返回客戶端的IP和Port, 客戶端發送請求后立即開始接受數據包。 重復這個過程直到收到回應(一定能夠收到,因為第一步保證了這個客戶端可以進行UDP通信)。
用同樣的方法用一個socket向服務器的(IP-2,Port-2)發送數據包要求服務器返回客戶端的IP和Port。
比較上面兩個過程從服務器返回的客戶端(IP,Port),如果兩個過程返回的(IP,Port)有一對不同則說明客戶端為Symmetric NAT,這樣的客戶端無法進行UDP-P2P通信(檢測停止)因為對稱型NAT,每次連接端口都不一樣,所以無法知道對稱NAT的客戶端,下一次會用什么端口。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(繼續)。

STEP5:檢測客戶端NAT是Restricted Cone 還是 Port Restricted Cone – Test3
客戶端建立UDP socket然后用這個socket向服務器的(IP-1,Port-1)發送數據包要求服務器用IP-1和一個不同于Port-1的端口發送一個UDP 數據包響應客戶端, 客戶端發送請求后立即開始接受數據包。重復這個過程若干次。如果每次都超時,無法接受到服務器的回應,則說明客戶端是一個Port Restricted Cone NAT,如果能夠收到服務器的響應則說明客戶端是一個Restricted Cone NAT。以上兩種NAT都可以進行UDP-P2P通信。

通過以上過程,至此,就可以分析和判斷出客戶端是否處于NAT之后,以及NAT的類型及其公網IP,以及判斷客戶端是否具備P2P通信的能力了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378832.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

duration java_Java Duration類| toNanos()方法與示例

duration javaDuration Class toNanos()方法 (Duration Class toNanos() method) toNanos() method is available in java.time package. toNanos()方法在java.time包中可用。 toNanos() method is used to convert this Duration into the number of nanoseconds. toNanos()方…

java 負載均衡_java負載均衡 - 歲月靜好I的個人空間 - OSCHINA - 中文開源技術交流社區...

作用對系統的高可用,網絡壓力的緩解,處理能力擴容的重要手段之一。服務器負載我們通常所說的負載是指:服務器負載軟硬件負載服務器負載又分為:軟件負載--硬件負載軟件負載:通過在服務器上安裝一些具有負載功能或模塊的…

b tree和b+tree_B TREE實施

b tree和btreeB TREE及其操作簡介 (Introduction to B TREE and its operations) A B tree is designed to store sorted data and allows search, insertion and deletion operation to be performed in logarithmic time. As In multiway search tree, there are so many nod…

黑色背景下,將照片內封閉空心圖案的空心區域染成Cyan并保存

在黑色背景下,將照片內封閉空心圖案的空心區域染色 import cv2 import numpy as np img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png,1)#第一個參數為選擇照片的路徑,注意照片路徑最后一個為正斜杠其他都為反斜杠;第二個參數…

Ubuntu輸入su提示認證失敗的解決方法

Ubuntu輸入su提示認證失敗的解決方法 啟動ubuntu服務時竟然提示權限不夠,用su切換,輸入密碼提示認證失敗,這下搞了吧,后來一經查閱原來Ubuntu安裝后,root用戶默認是被鎖定了的,不允許登錄,也不允…

SDP協議基本分析(RTSP、WebRTC使用)

目錄一、介紹二、標準 SDP 規范1. SDP 的格式2. SDP 的結構(1)會話描述(2)媒體描述三、WebRTC 中的 SDP一、介紹 SDP(Session Description Protocal)以文本描述各端(PC 端、Mac 端、Android 端…

MFC六大關鍵技術(第四部分)——永久保存(串行化)

MFC 六大關鍵技術 ( 第四部分 ) ——永久保存(串行化) 先用一句話來說明永久保存的重要:弄懂它以后,你就越來越像個程序員了! 如果我們的程序不需要永久保存,那幾乎可以肯定是一個小玩兒。那怕我們的記事本…

在網絡中配置思科交換機

By default, all ports of a switch are enabled. As we are talking about layer 2 switching, there is no need to configure IP address or any routing protocol on the switch. In such a situation, the configuration is not focused on the switch. 缺省情況下&#…

黑色背景下,描繪照片的輪廓形狀并保存

描繪照片的輪廓形狀并保存 import cv2 from matplotlib import pyplot as plt # 1.先找到輪廓 img cv2.imread(E:\Python-workspace\OpenCV\OpenCV/beyond.png, 0) _, thresh cv2.threshold(img, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) image, conturs, hierarchy c…

java pdf合并_Java 合并、拆分PDF文檔

本文將介紹如何在Java程序中合并及拆分PDF文檔,合并文檔時,包括合并多個不同PDF文檔為一個文檔,以及合并PDF文檔的不同頁面為一頁;拆分文檔是,包括將PDF文檔按每一頁拆分,以及按指定頁數范圍來拆分。下面將…

HDU4405 期望

對于期望,首先,對于這個公式中p表示概率,x表示隨機變量 展開則為 ex p1*x1p2*x2p3*x3....... 對于本題 假設 ex[ i ]表示當前 i 走到 n 的期望值。所以若 i 處沒有飛機,ex[ i ]sigma(1/6*ex[ik])1 其中(k1...6) (1表示…

調用本地電腦攝像頭并進行按P進行捕獲照片并保存,按下Q退出

調用本地電腦攝像頭并進行按P進行捕獲照片并保存,按下Q退出 灰度攝像頭顯示: import cv2 cap cv2.VideoCapture(0) if not cap.isOpened():print("Cannot open camera")exit() while True:# 逐幀捕獲ret, frame cap.read()# 如果正確讀取幀…

intersect函數_PHP array_intersect()函數與示例

intersect函數PHP array_intersect()函數 (PHP array_intersect() Function ) array_intersect() function is used to find the matched elements from two or more elements. Function “array_intersect()” compares the values of the first array with the other arrays …

很全的SQL注入語句

1、返回的是連接的數據庫名and db_name()>02、作用是獲取連接用戶名and user>03、將數據庫備份到Web目錄下面;backup database 數據庫名 to diskc:\inetpub\wwwroot\1.db;--4、顯示SQL系統版本and 1(select VERSION) 或and 1convert(int,version)--5、判斷xp_cmdshell擴展…

使用DataTable更新數據庫

1、修改數據 DataRow dr hRDataSet.Tables["emp"].Rows.Find(textBox3.Text);//DataRow dr hRDataSet.Tables["emp"].Select("id"textBox3.Text)[0];dr.BeginEdit();dr["name"] textBox1.Text;dr.EndEdit();SqlCommandBuilder cmdn…

java異常體系_JAVA異常體系結構詳解

一、什么是異常異常:程序在運行過程中發生由于硬件設備問題、軟件設計錯誤等導致的程序異常事件。(在Java等面向對象的編程語言中)異常本身是一個對象,產生異常就是產生了一個異常對象。 ——百度百科二、異常體系Java把異常當作對象來處理&#xf…

對照片質量進行壓縮

對照片質量進行壓縮 其實無論是jpg還是png都是已經壓縮編碼化的格式罷了,原圖片的大小要遠遠大于壓縮編碼后的格式 1,像素:圖片放大到一定程度之后的一個個的小方塊 2,RGB:每一個像素(小方塊)都…

Silverlight訪問 Apache服務器(Tomcat,Geronimo)中部署的Webservice

Silverlight 訪問 Apache服務器中的Webservice 開發環境 Vs2010 、 Silverlight4 、 Java Jdk1.6 U 21 、 Apache-tomcat-6.0.20 、 Myeclipse8.5 、 Apache-ant-1.8.1 、 Axis2 、 Geronimo-tomcat6-javaee5-2.2. 下載地址: Apache-tomcat : http://apa…

那些幫助你成為優秀前端工程師的講座——《性能篇》

這篇文章是前端優秀講座和討論列表系列連載第七篇,介紹前端性能優化技巧。前端領域發展迅速,只有時刻掌握前端發展趨勢和技術動態,學習前沿的開發思想和理念才能讓自己跟上時代的步伐,保持自己的技術優勢。 您可能感興趣的相關文章…

mca終端_MCA的完整形式是什么?

mca終端1)MCA:計算機應用碩士 (1) MCA: Master of Computer Application) MCA is an abbreviation of Master of Computer Application. It is a masters degree program for post-graduation in Computer applications. This post-graduate course duration is abo…