具體例子:
nat211.133.*和nat211.134.*之間需要進行通訊,但開始不能直接就發資料報,我們需要乙個中間人,這個就是外部索引伺服器(我們假設是211.135.*:7000),當nat211.133.*向211.135.*:7000傳送資料報,211.135.*:7000是可以正常接收到資料,因為它是屬於對外型開放的服務埠。當211.135.*:7000收到資料報後可以獲知nat211.133.*對外通訊的臨時session資訊(這個臨時的埠,假設是6000會過期,具體的時間不同,但我個人的測試是每30秒傳送乙個心跳包keep住連線以保證埠維持住通訊連線不斷開),索引伺服器此時應將此資訊儲存起來。而同時,nat211.134.*也在時刻向索引伺服器傳送
心跳包,索引伺服器就向nat211.134.*傳送乙個通知,讓它向nat211.133.*:6000傳送探測包(這個資料報最好多發幾個),nat211.134.*在收到通知包之後再向索引伺服器傳送反饋包,說明自己已經向nat211.133.*:6000傳送了探測包,索引伺服器在接收到反饋包之後再向nat211.133.***反饋包,nat211.133.*在接收到資料報之後再向原本要請求的nat211.134.*傳送
資料報,此時連線已經打通,實現穿透,nat211.134.*會將資訊**給192.168.1.88的9000埠。
nat4種型別及檢測 **:原文
考 慮到udp的無狀態特性,目前針對其的nat實現大致可分為full cone、restricted cone、port restricted cone和symmetric nat四種。值得指出的是,對於tcp協議而言,一般來說,目前nat中針對tcp的實現基本上是一致的,其間並不存在太大差異,這是因為tcp協議本身 便是面向連線的,因此無需考慮網路連線無狀態所帶來複雜性。
p2p的nat研究
第一部分:nat介紹
第二部分:nat型別檢測
第一部分: 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達洞通訊,可以進行埠**打洞,不過不能保證成功。
NAT型別及打洞原理
nat是network address translation的縮寫,指的是主機位址與公網ip的對映規則 就是說比如你有乙個pc,連到區域網,然後你要訪問163.com,這時候區域網會你的ip和開啟的位址對映成1個 公網ip port 去訪問163.com 然後163.com發資料給你,它發的位址一...
NAT穿越 TCP打洞
在處於nat之後的兩台主機之間建立p2p tcp連線比建立相應的udp要稍微複雜,但在協議層次,tcp打洞非常類似與udp打洞。然而tcp協議本身比較複雜,因此支援的nat比較少。然而,在nat支援tcp打洞的情況下,tcp打洞像upd打洞那樣快並且可靠。穿透 行為良好 的nat的tcp p2p連線...
UDP TCP穿越NAT打洞
假定a要發起對b的直接連線,打洞 過程如下所示 endpoint指ip位址和埠的配對 1 a最初不知道如何向b發起連線,於是a向伺服器s傳送訊息,請求s幫助建立與b的udp連線。2 s將含有b的公網和內網的endpoint發給a,同時,s將含有a的公網和內網的endpoint的用於請求連線的訊息也發...