NAT類型檢測方法

來源:互聯網
上載者:User

第一部分: NAT介紹

各種不同類型的NAT(according to RFC)

Full Cone NAT:

內網主機建立一個UDP socket(LocalIP:LocalPort) 第一次使用這個socket給外部主機發送資料時NAT會給其分配一個公網(PublicIP:PublicPort),以後用這個socket向外面任何主機發送資料都將使用這對(PublicIP:PublicPort)。此外,任何外部主機只要知道這個(PublicIP:PublicPort)就可以發送資料給(PublicIP:PublicPort),內網的主機就能收到這個資料包

Restricted Cone NAT:

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

Port Restricted Cone NAT:

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

Symmetric 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通訊。

第二部: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達洞通訊,可以進行連接埠預測打洞,不過不能保證成功。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.