跳至內容

UDP打洞

維基百科,自由的百科全書

計算機科學中,UDP打洞指的是一種普遍使用的NAT穿越技術。

描述

[編輯]

通過UDP打洞實現NAT穿越是一種在處於使用了NAT的私有網絡中的Internet主機之間建立雙向UDP連接的方法。由於NAT的行為是非標準化的,因此它並不能應用於所有類型的NAT。

其基本思想是這樣的:讓位於NAT後的兩台主機都與處於公共地址空間的、已知IP地址的第三台服務器相連,一旦NAT設備建立好UDP狀態信息就轉為直接通信,並讓NAT設備在從另外一個主機傳送過來時仍然保持當前狀態。

這項技術需要使用圓錐型NAT設備,對稱型NAT不能使用這項技術。

這項技術在P2P軟件和VoIP電話領域被廣泛採用,它是Skype用以繞過防火牆和NAT設備的技術之一。

相同的技術有時還被用於TCP連接——儘管遠沒有UDP成功。

算法

[編輯]

假設有兩台分別處於各自的私有網絡中的主機:A1和A2。N1和N2是兩個網絡的NAT設備,分別擁有IP地址P1和P2。 S是一個雙方共知的、從任何地方都能訪問得到的IP地址的公共服務器。

步驟一:A1和A2分別和S建立UDP連接,NAT設備N1和N2創建UDP轉換狀態並分配臨時的外部端口號;

步驟二:S檢查UDP包,看A1和A2的端口是否是正在使用的(否則N1和N2即應用了端口隨機分配,這會讓路由驗證變得更麻煩);

步驟三:如果端口不是隨機化的,那麼A1和A2各自選擇端口X和Y,並告知S。S會讓A1發送UDP包到P2:Y,讓A2發送UDP包到P1:X;

步驟四:A1和A2通過轉換好的IP地址和端口直接聯繫到對方的NAT設備。

應用

[編輯]

對於大型公司網絡中常見的對稱NAT設備(也稱為雙向NAT),UDP打洞不起作用。在對稱NAT中,與知名STUN服務器的連接關聯的NAT映射只會從知名服務器接收數據,因此已知第三台服務器看到的NAT映射不能有效連接。

在一個更詳細的方法中,兩個主機將開始發送給對方,並多次嘗試。在受限制的Cone NAT上,來自其他主機的第一個數據包將被阻止。在此之後,NAT設備就有記錄發送了一個數據包到另一台機器,並將所有數據包改為來自該IP地址和端口號。這項技術廣泛應用於點對點軟件和互聯網協議語音電話,它也可以用來協助建立通過UDP運行的虛擬專用網絡。相同的技術有時會擴展到傳輸控制協議(TCP)連接,但成功率較低,因為TCP連接流由主機操作系統控制,而不是應用程序,序列號隨機選擇。

外部連結

[編輯]