【札記】NAT類型

【札記_http://www.ppcn.net/n4366c38p2.aspx】
STUN標準中,根據內部終端的地址(P:p)到NAT出口的公網地址(A:b)的影射方式,把NAT分爲四種類型:


  1. Full Cone:來自相同的內部地址的請求消息映射爲相同的外部地址,與外部地址(目的地址)無關。映射關係爲P:p↔A:b,任何外部主機可通過(A:b)發送到數據到(P:p)上。

  2. Restricted Cone:來自相同的內部地址的請求消息映射爲相同的外部地址,返回的數據只接受該內部節點曾發數據的那個目的計算機地址X。映射關係爲P:p↔A:b↔X,只有來自X的數據包纔可通過(A:b)發送到數據到(P:p)上。

  3. Port Restricted Cone:來自相同的內部地址的請求消息映射爲相同的外部地址,返回的數據只接受該內部節點曾發數據的那個目的地址X:x。映射關係爲P:p↔A:b↔X:x,只有來自X:x的數據包纔可通過(A:b)發送到數據到(P:p)上。

  4. Symmetric(對稱) NAT:只有來自相同的內部地址(P:p),並且發送到同一個地址(X:x) 的請求消息,才被映射爲相同的外部地址(A:b),返回的數據只接受該內部節點曾發數據的那個目的地址X:x。映射關係爲P:p↔A:b↔X:x,當(P:p)訪問(Y:y)時,映射爲P:p↔B:c↔Y:y。

【NAT類型探測 _http://blog.csdn.net/formiss/article/details/4922705】
第二部: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達洞通信,可以進行端口預測打洞,不過不能保證成功。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章