1. 程式人生 > >UDP中四種不同的NAT型別及檢測方法【轉發與點評】

UDP中四種不同的NAT型別及檢測方法【轉發與點評】

UDP中四種不同的NAT型別及檢測方法

考慮到UDP的無狀態特性,目前針對其的NAT實現大致可分為Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四種。
值得指出的是,對於TCP協議而言,一般來說,目前NAT中針對TCP的實現基本上是一致的,其間並不存在太大差異,這是因為TCP協議本身便是面向連線的,因此無需考慮網路連線無狀態所帶來複雜性。

用語定義

  1. 內部Tuple:指內部主機的私有地址和埠號所構成的二元組,即內部主機所傳送報文的源地址、埠所構成的二元組
  2. 外部Tuple:指內部Tuple經過NAT的源地址/埠轉換之後,所獲得的外部地址、埠所構成的二元組,即外部主機收到經NAT轉換之後的報文時,它所看到的該報文的源地址(通常是NAT裝置的地址)和源埠
  3. 目標Tuple:指外部主機的地址、埠所構成的二元組,即內部主機所傳送報文的目標地址、埠所構成的二元組

詳細釋義

1. Full Cone NAT:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,而不管這些請求是不是屬於同一個應用或者是多個應用的。除此之外,當X-Y的轉換關係建立之後,任意外部主機均可隨時將Y中的地址和埠作為目標地址和目標埠,向內部主機發送UDP報文,由於對外部請求的來源無任何限制,因此這種方式雖然足夠簡單,但卻不那麼安全。
內網主機建立一個UDP socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機發送資料時NAT會給其分配一個公網(PublicIP:PublicPort),以後用這個socket向外面任何主機發送資料都將使用這對(PublicIP:PublicPort)。此外,任何外部主機只要知道這個(PublicIP:PublicPort)就可以傳送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包。

韓立金自由談:Full Cone NAT型別只關注((LocalIP:LocalPort)<-->(PublicIP:PublicPort))的關係,不關心內部主機是否向外部主機發送過資料。

 
2. Restricted Cone NAT: 它是Full Cone的受限版本:所有來自同一個內部Tuple X的請求均被NAT轉換至同一個外部Tuple Y,這與Full Cone相同,但不同的是,只有當內部主機曾經發送過報文給外部主機(假設其IP地址為Z)後,外部主機才能以Y中的資訊作為目標地址和目標埠,向內部主機發送UDP請求報文,這意味著,NAT裝置只向內轉發(目標地址/埠轉換)那些來自於當前已知的外部主機的UDP報文,從而保障了外部請求來源的安全性。

內網主機建立一個UDP socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機發送資料時NAT會給其分配一個公網(PublicIP:PublicPort),以後用這個socket向外面任何主機發送資料都將使用這對(PublicIP:PublicPort)。此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(PublicIP:PublicPort)並且內網主機之前用這個socket曾向這個外部主機IP傳送過資料。只要滿足這兩個條件,這個外部主機就可以用自己的(IP,任何埠)傳送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包。

韓立金自由談:Restricted Cone NAT型別關注((LocalIP:LocalPort)<-->(PublicIP:PublicPort)<-->(IP,任何埠))的關係,目的埠不受限。
 
3. Port Restricted Cone NAT:它是Restricted Cone NAT的進一步受限版。只有當內部主機曾經發送過報文給外部主機(假設其IP地址為Z且埠為P)之後,外部主機才能以Y中的資訊作為目標地址和目標端 口,向內部主機發送UDP報文,同時,其請求報文的源埠必須為P,這一要求進一步強化了對外部報文請求來源的限制,從而較Restrictd Cone更具安全性。

內網主機建立一個UDP socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機發送資料時NAT會給其分配一個公網(PublicIP:PublicPort),以後用這個socket向外面任何主機發送資料都將使用這對(PublicIP:PublicPort)。此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(PublicIP:PublicPort)並且內網主機之前用這個socket曾向這個外部主機(IP,Port)傳送過資料。只要滿足這兩個條件,這個外部主機就可以用自己的(IP,Port)傳送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包。

韓立金自由談:Restricted Cone NAT:關注((LocalIP:LocalPort)<-->(PublicIP:PublicPort)<-->(IP,Port))的關係,只有之前內部主機往這個外部主機發送過報文即可,不需要每個返回報文都有內部主機發出記錄。

 4. Symmetric NAT:這是一種比所有Cone NAT都要更為靈活的轉換方式:在Cone NAT中,內部主機的內部Tuple與外部Tuple的轉換對映關係是獨立於內部主機所發出的UDP報文中的目標地址及埠的,即與目標Tuple無關; 在Symmetric NAT中,目標Tuple則成為了NAT裝置建立轉換關係的一個重要考量:只有來自於同一個內部Tuple 、且針對同一目標Tuple的請求才被NAT轉換至同一個外部Tuple,否則的話,NAT將為之分配一個新的外部Tuple;打個比方,當內部主機以相 同的內部Tuple對2個不同的目標Tuple傳送UDP報文時,此時NAT將會為內部主機分配兩個不同的外部Tuple,並且建立起兩個不同的內、外部 Tuple轉換關係。與此同時,只有接收到了內部主機所傳送的資料包的外部主機才能向內部主機返回UDP報文,這裡對外部返回報文來源的限制是與Port Restricted Cone一致的。不難看出,如果說Full Cone是要求最寬鬆NAT UDP轉換方式,那麼,Symmetric NAT則是要求最嚴格的NAT方式,其不僅體現在轉換關係的建立上,而且還體現在對外部報文來源的限制方面。

內網主機建立一個UDP socket(LocalIP,LocalPort),當用這個socket第一次發資料給外部主機1時,NAT為其對映一個(PublicIP-1,Port-1),以後內網主機發送給外部主機1的所有資料都是用這個(PublicIP-1,Port-1),如果內網主機同時用這個socket給外部主機2傳送資料,第一次傳送時,NAT會為其分配一個(PublicIP-2,Port-2), 以後內網主機發送給外部主機2的所有資料都是用這個(PublicIP-2,Port-2).如果NAT有多於一個公網IP,則PublicIP-1和PublicIP-2可能不同,如果NAT只有一個公網IP,則Port-1和Port-2肯定不同,也就是說一定不能是PublicIP-1等於 PublicIP-2且Port-1等於Port-2。此外,如果任何外部主機想要傳送資料給這個內網主機,那麼它首先應該收到內網主機發給他的資料,然後才能往回傳送,否則即使他知道內網主機的一個(PublicIP,Port)也不能傳送資料給內網主機,這種NAT無法實現UDP-P2P通訊。

韓立金自由談:Restricted Cone NAT:關注((LocalIP:LocalPort)<-->(PublicIP:PublicPort)<-->(IP,Port))的關係,並且內部主機先發送報文才能往回傳送。
 
第二部:NAT型別檢測

前提條件:有一個公網的Server並且綁定了兩個公網IP(IP-1,IP-2)。這個Server做UDP監聽(IP-1,Port-1),(IP-2,Port-2)並根據客戶端的要求進行應答。

第一步:檢測客戶端是否有能力進行UDP通訊以及客戶端是否位於NAT後?

客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器返回客戶端的IP和Port, 客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到伺服器的迴應,則說明客戶端無法進行UDP通訊,可能是防火牆或NAT阻止UDP通訊,這樣的客戶端也就 不能P2P了(檢測停止)。
當客戶端能夠接收到伺服器的迴應時,需要把伺服器返回的客戶端(IP,Port)和這個客戶端socket的 (LocalIP,LocalPort)比較。如果完全相同則客戶端不在NAT後,這樣的客戶端具有公網IP可以直接監聽UDP埠接收資料進行通訊(檢 測停止)。否則客戶端在NAT後要做進一步的NAT型別檢測(繼續)。

第二步:檢測客戶端NAT是否是Full Cone NAT?

客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器用另一對(IP-2,Port-2)響應客戶端的請求往回發一個數據包,客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到伺服器的迴應,則說明客戶端的NAT不是一個Full Cone NAT,具體型別有待下一步檢測(繼續)。如果能夠接受到伺服器從(IP-2,Port-2)返回的應答UDP包,則說明客戶端是一個Full Cone NAT,這樣的客戶端能夠進行UDP-P2P通訊(檢測停止)。

第三步:檢測客戶端NAT是否是Symmetric NAT?

 客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器返回客戶端的IP和Port, 客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程直到收到迴應(一定能夠收到,因為第一步保證了這個客戶端可以進行UDP通訊)。用同樣的方法用一個socket向伺服器的(IP-2,Port-2)傳送資料包要求伺服器返回客戶端的IP和Port。

比較上面兩個過程從伺服器返回的客戶端(IP,Port),如果兩個過程返回的(IP,Port)有一對不同則說明客戶端為Symmetric NAT,這樣的客戶端無法進行UDP-P2P通訊(檢測停止)。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(繼續)。

第四步:檢測客戶端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT?

客戶端建立UDP socket然後用這個socket向伺服器的(IP-1,Port-1)傳送資料包要求伺服器用IP-1和一個不同於Port-1的埠傳送一個UDP 資料包響應客戶端, 客戶端傳送請求後立即開始接受資料包,要設定socket Timeout(300ms),防止無限堵塞. 重複這個過程若干次。如果每次都超時,無法接受到伺服器的迴應,則說明客戶端是一個Port Restricted Cone NAT,如果能夠收到伺服器的響應則說明客戶端是一個Restricted Cone NAT。以上兩種NAT都可以進行UDP-P2P通訊。

注:以上檢測過程中只說明瞭可否進行UDP-P2P的打洞通訊,具體怎麼通訊一般要藉助於Rendezvous Server。另外對於Symmetric NAT不是說完全不能進行UDP-P2P達洞通訊,可以進行埠預測打洞,不過不能保證成功。

相關推薦

UDP不同NAT型別檢測方法轉發點評

UDP中四種不同的NAT型別及檢測方法 考慮到UDP的無狀態特性,目前針對其的NAT實現大致可分為Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四種。 值得指出的是,對於TCP協議而言,一般來說,目

JavaScript不同的屬性檢測方式比較

bject 如果 cnblogs thead != () 繼承 rip left JavaScript中四種不同的屬性檢測方式比較 1. 用in方法 var o = {x:1}; "x" in o; //true "y" in o; //false "toStrin

Java併發程式設計執行緒池自定義執行緒使用教程

引言 通過前面的文章,我們學習了Executor框架中的核心類ThreadPoolExecutor ,對於執行緒池的核心排程機制有了一定的瞭解,並且成功使用ThreadPoolExecutor 建立了執行緒池。 而在Java中,除了ThreadPoolExecutor ,Executor框

分享phpwebservice實現的簡單架構方法例項

本人所瞭解的webservice有以下幾種:PHP本身的SOAP,開源的NUSOAP,商業版的PHPRPC,以及使用二進位制傳輸資料流的HessianPHP,那麼一下就簡單的介紹下這幾種webservice在php中的使用,雖然網上也有很多這方面的資料,但是這是我個人實踐所得,當然也是從網上找的資料

Hive表不同資料匯出方式以及如何自定義匯出列分隔符

問題導讀: 1、Hive表資料四種匯出方式是? 2、匯出命令中LOCAL的作用及有無的區別? 3、匯出命令中是否可以嚮導入命令一樣使用INTO? 4、如何自定義匯出檔案的列分隔符? 5、hive的-e和-f引數的作用及如何使用其來匯出資料? 6、hive shell環境中

oracle不同方法迴圈輸出1-10

set serveroutput ondeclare   i int:=10;  j int:=0;  begin   loop      j:=j+1;       if j<11 then         dbms_output.put_line(j);      elsif j>11 th

C++創建對象的方法

內存 stream self 一般來說 ron ref 支持 內存碎片 搜索 我們都知道C++中有三種創建對象的方法,如下: #include <iostream> using namespace std; class A { private: in

js資料型別檢測方法

###一、資料型別檢測方法 在js中,有四種用於檢測資料型別的方式,分別是: typeof  用來檢測資料型別的運算子 instanceof    檢測一個例項是否屬於某個類 constructor   建構函式 Object.prototype.toStrin

java訪問修飾符區別詳解全過程

HP dnv ax1 pci gda fmm utc dos rdp 客戶端程序員:即在其應用中使用數據類型的類消費者,他的目標是收集各種用來實現快速應用開發的類。   類創建者:即創建新數據類型的程序員,目標是構建類。     訪問控制存在的原因:a、讓客戶端程序員無法觸

Python內建資料型別(list,tuple,set,dict)的區別

List     list是一種有序集合,能隨時新增或刪除其中的元素,元素型別可以不一樣,也可以定義一個空list     構造list直接用[ ]將list的所有元素括起來,用逗號分割;通常把list賦值給

java引用型別

 今天看程式碼,裡面有一個類java.lang.ref.SoftReference把小弟弄神了,試想一下,接觸java已經有3年了哇,連lang包下面的類都不瞭解,怎麼混。後來在網上查資料,感覺收穫頗多,現記錄如下。        物件的強、軟、弱和虛引用在JDK 1.2以

Java引用強 軟 弱 虛 的詳細介紹理解

 Java中強軟弱虛四種引用 一:引用的目的: 在Java中垃圾回收器的執行是JVM操作的,但是我們仍然可以在一定程度上與垃圾回收器進行互動,其目的在於更好的幫助垃圾回收器管理好應用的記憶體,避免記憶

c++強制型別轉換(const_cast、static_cast應用最多)

c++動態型別轉換有四種const_cast、static_cast、dynamic_cast、reinterpreter_cast 前面兩個用的多,但是後面的針對其設計理念有許多其他的實現方法可達到同樣的效果 1. static_cast (1)用於基

JavaExecutors類建立各型別執行緒池的方法例項

Executors:提供了一系列靜態工廠方法用於建立各種執行緒池。 1.Executors.newCachedThreadPool建立可變執行緒池 如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。核心執行緒池大小為0,最大為Integer.MA

C++強轉型別

在C++中一共有四種強轉型別分別為:static_cast,const_cast,reinterpret_cast和dynamic_cast 型別轉換的一般形式為:cast-name<type&

java訪問修飾符

pub oid 默認 成員變量 修飾 對象 fault 其中 () Java中的四種訪問修飾符:public、protected、default(無修飾符,默認)、private。 四種修飾符可修飾的成分(類、方法、成員變量) public protect

MySQL常用存儲引擎的介紹

產生 存在 一個 訪問 內存 結構 高效 ins 刪除 MySQL常用的四種引擎的介紹 (1):MyISAM存儲引擎: 不支持事務、也不支持外鍵,優勢是訪問速度快,對事務完整性沒有 要求或者以select,insert為主的應用基本上可以用這個引擎來創建表 支持3種不同的存

1.4socket服務器打印信息的不同方式()

span 綁定 col tip ner 1.4 一次 +++ soc 方式一 socker 服務器 # -*- coding: utf-8 -*- import sys,os,multiprocessing from socket import * serverHost

Java引用的區分

isn 賦值 public medium 是否 comm 回調 ant container 強引用(StrongReference) 強引用就是指在程序代碼之中普遍存在的,比如下面這段代碼中的object和str都是強引用: 1 2 Object obje

java修飾符(private、default、protected、public)的訪問權限

ble ted span java 修飾符 20px col family style 權限如下: no. 範圍 private default protected public 1 同一包下的同一個類 √ √ √ √ 2 同一包下的不同類 × √ √ √