step1.判斷客戶端是否在nat後:
b向c的ip1的pot1埠傳送乙個udp 包。c收到這個包後,會把它收到包的源ip和port寫到udp包中,然後把此包通過ip1和port1發還給b。這個ip和port也就是nat的外網 ip和port(如果你不理解,那麼請你去看我的blog裡面的nat的原理和分類),也就是說你在step1中就得到了nat的外網ip。
熟悉nat工作原理的朋友可以知道,c返回給b的這個udp包b一定收到。如果在你的應用中,向乙個stun伺服器傳送資料報後,你沒有收到stun的任何回應包,那只有兩種可能:1、stun伺服器不存在,或者你弄錯了port。2、你的nat拒絕一切udp包從外部向內部通過。
當b收到此udp後,把此udp中的ip和自己的ip做比較,如果是一樣的,就說明自己是在公網,下步nat將去探測防火牆型別,我不想多說。如果不一樣,說明有nat的存在,系統進行step2的操作。
step2.判斷是否處於full cone nat下:
b向c的ip1傳送乙個udp包,請求c通過另外乙個ip2和port(不同與setp1的ip1)向b返回乙個udp資料報(現在知道為什麼c要有兩個ip了吧,雖然還不理解為什麼,呵呵)。
我們來分析一下,如果b收到了這個資料報,那說明什麼?說明nat來著不拒,不對資料報進行任何過濾,這也就是stun標準中的full cone nat。遺憾的是,full cone nat太少了,這也意味著你能收到這個資料報的可能性不大。如果沒收到,那麼系統進行step3的操作。
step3.判斷是否處於對稱nat下:
b向c的ip2的port2傳送乙個資料報,c收到資料報後,把它收到包的源ip和port寫到udp包中,然後通過自己的ip2和port2把此包發還給b。
和step1一樣,b肯定能收到這個回應udp包。此包中的port是我們最關心的資料,下面我們來分析:
如果這個port和step1中的port一樣,那麼可以肯定這個nat是個cone nat,否則是對稱nat。道理很簡單:根據對稱nat的規則,當目的位址的ip和port有任何乙個改變,那麼nat都會重新分配乙個port使用,而在step3中,和step1對應,我們改變了ip和port。因此,如果是對稱nat,那這兩個port肯定是不同的。
如果在你的應用中,到此步的時候port是不同的,那麼這個它就是處在乙個對稱nat下了。如果相同,那麼只剩下了restrict cone 和port restrict cone。系統用step4探測是是那一種。
step4.判斷是處於restrict cone nat還是port restrict nat之下:
b向c的ip2的乙個埠pd傳送乙個資料請求包,要求c用ip2和不同於pd的port返回乙個資料報給b。
我們來分析結果:如果b收到了,那也就意味著只要ip相同,即使port不同,nat也允許udp包通過。顯然這是restrict cone nat。如果沒收到,沒別的好說,port restrict nat.
NAT型別判斷
本文給出nat型別判斷方法。具體實現框圖如下 若server a和server b返回給client的port1和port2相等,則該nat為cone nat,否則為symmetric nat。具體實現框圖如下 若client能收到server b返回的資料,則nat為full cone nat。具...
Udp打洞,判斷Nat網路型別
一種基於udp協議實現p2p智慧型穿越nat的方案 於仁崗1常州工學院,常州 e mail yurengang123 126.com 摘 要 由於目前nat network address translation 網路位址轉換協議 的廣泛運用,處於internet上的公網主機與處於 nat之後的主機...
js如何判斷陣列是Array型別
在說明如何判斷乙個物件為陣列型別前,我們先鞏固下js的資料型別,js一共有六大資料型別 number string object boolean null undefined。var str string console.log typeof str string var num 1 console...