NAT類(lèi)型有三種情況:
1、NAT1是指直連的 2、NAT2是通過(guò)路由器連接 3、網(wǎng)絡(luò)類(lèi)型為NAT3的意思是一些功能受限,電腦不能參加聯(lián)機(jī),參加派對(duì)不能說(shuō)話(huà),相當(dāng)于自己給自己關(guān)小黑屋。
NAT類(lèi)型檢測(cè) 前提條件:有一個(gè)公網(wǎng)的Server并且綁定了兩個(gè)公網(wǎng)IP(IP-1,IP-2)。這個(gè)Server做UDP監(jiān)聽(tīng)(IP-1,Port-1),(IP-2,Port-2)并根據(jù)客戶(hù)端的要求進(jìn)行應(yīng)答。第一步:檢測(cè)客戶(hù)端是否有能力進(jìn)行UDP通信以及客戶(hù)端是否位于NAT后?1、客戶(hù)端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶(hù)端的IP和Port, 客戶(hù)端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程若干次。如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶(hù)端無(wú)法進(jìn)行UDP通信,可能是防火墻或NAT阻止UDP通信,這樣的客戶(hù)端也就 不能P2P了(檢測(cè)停止)。
2、當(dāng)客戶(hù)端能夠接收到服務(wù)器的回應(yīng)時(shí),需要把服務(wù)器返回的客戶(hù)端(IP,Port)和這個(gè)客戶(hù)端socket的 (LocalIP,LocalPort)比較。如果完全相同則客戶(hù)端不在NAT后,這樣的客戶(hù)端具有公網(wǎng)IP可以直接監(jiān)聽(tīng)UDP端口接收數(shù)據(jù)進(jìn)行通信(檢 測(cè)停止)。否則客戶(hù)端在NAT后要做進(jìn)一步的NAT類(lèi)型檢測(cè)(繼續(xù))。第二步:檢測(cè)客戶(hù)端NAT是否是Full Cone NAT? 客戶(hù)端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用另一對(duì)(IP-2,Port-2)響應(yīng)客戶(hù)端的請(qǐng)求往回 發(fā)一個(gè)數(shù)據(jù)包,客戶(hù)端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程若干次。如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶(hù)端的NAT不是一個(gè)Full Cone NAT,具體類(lèi)型有待下一步檢測(cè)(繼續(xù))。如果能夠接受到服務(wù)器從(IP-2,Port-2)返回的應(yīng)答UDP包,則說(shuō)明客戶(hù)端是一個(gè)Full Cone NAT,這樣的客戶(hù)端能夠進(jìn)行UDP-P2P通信(檢測(cè)停止)。第三步:檢測(cè)客戶(hù)端NAT是否是Symmetric NAT?1、客戶(hù)端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶(hù)端的IP和Port, 客戶(hù)端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程直到收到回應(yīng)(一定能夠收到,因?yàn)榈谝徊奖WC了這個(gè)客戶(hù)端可以進(jìn)行UDP通信)。
2、用同樣的方法用一個(gè)socket向服務(wù)器的(IP-2,Port-2)發(fā)送數(shù)據(jù)包要求服務(wù)器返回客戶(hù)端的IP和Port。
3、比較上面兩個(gè)過(guò)程從服務(wù)器返回的客戶(hù)端(IP,Port),如果兩個(gè)過(guò)程返回的(IP,Port)有一對(duì)不同則說(shuō)明客戶(hù)端為Symmetric NAT,這樣的客戶(hù)端無(wú)法進(jìn)行UDP-P2P通信(檢測(cè)停止)。否則是Restricted Cone NAT,是否為Port Restricted Cone NAT有待檢測(cè)(繼續(xù))。第四步:檢測(cè)客戶(hù)端NAT是否是Restricted Cone NAT還是Port Restricted Cone NAT? 客戶(hù)端建立UDP socket然后用這個(gè)socket向服務(wù)器的(IP-1,Port-1)發(fā)送數(shù)據(jù)包要求服務(wù)器用IP-1和一個(gè)不同于Port-1的端口發(fā)送一個(gè)UDP 數(shù)據(jù)包響應(yīng)客戶(hù)端, 客戶(hù)端發(fā)送請(qǐng)求后立即開(kāi)始接受數(shù)據(jù)包,要設(shè)定socket Timeout(300ms),防止無(wú)限堵塞. 重復(fù)這個(gè)過(guò)程若干次。如果每次都超時(shí),無(wú)法接受到服務(wù)器的回應(yīng),則說(shuō)明客戶(hù)端是一個(gè)Port Restricted Cone NAT,如果能夠收到服務(wù)器的響應(yīng)則說(shuō)明客戶(hù)端是一個(gè)Restricted Cone NAT。以上兩種NAT都可以進(jìn)行UDP-P2P通信。注:以上檢測(cè)過(guò)程中只說(shuō)明了可否進(jìn)行UDP-P2P的打洞通信,具體怎么通信一般要借助于Rendezvous Server。另外對(duì)于Symmetric NAT不是說(shuō)完全不能進(jìn)行UDP-P2P達(dá)洞通信,可以進(jìn)行端口預(yù)測(cè)打洞,不過(guò)不能保證成功。