P2P的NAT研究
第一部分:NAT介紹
第二部分:NAT類型檢測服務器
第一部分: NAT介紹socket
各類不一樣類型的NAT(according to RFC)spa
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),內網的主機就能收到這個數據包im
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達洞通訊,能夠進行端口預測打洞,不過不能保證成功。