P2P之NAT型別檢測方法

2021-06-16 14:28:46 字數 3361 閱讀 3337

網上找到的一些描述,留著備忘。

第一部分: nat介紹

各種不同型別的nat(according to rfc) 

(1)full cone nat: 

內網主機建立乙個udp socket(localip:localport) 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網(publicip:publicport),以後用這個socket向外面任何主機傳送資料都將使用這對(publicip:publicport)。此外,任何外部主機只要知道這個(publicip:publicport)就可以傳送資料給(publicip:publicport),內網的主機就能收到這個資料報。

(2)restricted cone nat: 

內網主機建立乙個udp socket(localip:localport) 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網(publicip:publicport),以後用這個socket向外面任何主機傳送資料都將使用這對(publicip:publicport)。此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(publicip:publicport)並且內網主機之前用這個socket曾向這個外部主機ip傳送過資料。只要滿足這兩個條件,這個外部主機就可以用自己的(ip,任何埠)傳送資料給(publicip:publicport),內網的主機就能收到這個資料報。

(3)port restricted cone nat:

內網主機建立乙個udp socket(localip:localport) 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網(publicip:publicport),以後用這個socket向外面任何主機傳送資料都將使用這對(publicip:publicport)。此外,如果任何外部主機想要傳送資料給這個內網主機,只要知道這個(publicip:publicport)並且內網主機之前用這個socket曾向這個外部主機(ip,port)傳送過資料。只要滿足這兩個條件,這個外部主機就可以用自己的(ip,port)傳送資料給(publicip:publicport),內網的主機就能收到這個資料報。

(4)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達洞通訊,可以進行埠**打洞,不過不能保證成功。

P2P之NAT型別檢測方法

p2p的nat研究 第一部分 nat介紹 第二部分 nat型別檢測 第一部分 nat介紹 各種不同型別的nat according to rfc full cone nat 內網主機建立乙個udp socket localip localport 第一次使用這個socket給外部主機傳送資料時nat...

P2P之NAT型別檢測方法

p2p的nat研究 第一部分 nat介紹 第二部分 nat型別檢測 第一部分 nat介紹 各種不同型別的nat according to rfc full cone nat 內網主機建立乙個udp socket localip localport 第一次使用這個socket給外部主機傳送資料時nat...

P2P之NAT型別檢測方法

第一部分 nat介紹 各種不同型別的nat according to rfc 1 full cone nat 內網主機建立乙個udp socket localip localport 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網 publicip publicport 以後...