關於NAT的一些基本知識,能夠參考NAT基本原理及穿透詳解。本文主要講當前工業場景中穿透NAT,使用最爲頻繁的STUN/TURN協議。html
STUN協議實現流程圖以下(本段參考其餘blog): 服務器
NAT的探測過程邏輯解釋:markdown
假設有UAC(p2p客戶端B),NAT(A),SERVER(打洞服務器C), UAC的IP爲 IPB, NAT的IP爲 IPA , SERVER的 IP爲IPC1 、IPC2。 請注意,服務器C有兩個IP。oop
B向C的IPC1的port1端口發送一個UDP包。 C收到這個包後,會把它收到包的源IP和port寫到UDP包中,而後把此包經過 IPC1 和 port1 發還給B。這個IP和port也就是NAT的外網IP和port,也就是說你在STEP1中就獲得了NAT的外網IP。post
熟悉NAT工做原理的應該都知道,C返回給B的這個UDP包B必定收到。 若是在你的應用中,向一個STUN服務器發送數據包後,你沒有收到STUN的任何迴應包,那只有兩種可能:spa
當B收到此UDP後,把此UDP中的IP和本身的IP作比較, 若是是同樣的,就說明本身是在公網,下步NAT將去探測防火牆類型,就很少說了。若是不同,說明有NAT的存在,系統進行STEP2的操做。rest
B向C的IPC1發送一個UDP包,請求C經過另一個IPC2和PORT(不一樣與SETP1的IP1)向B返回一個UDP數據包(如今知道爲何C要有兩個IP了吧,爲了檢測cone NAT的類型)。咱們來分析一下,若是B收到了這個數據包,那說明什麼?說明NAT來着不拒,不對數據包進行任何過濾,這也就是STUN標準中的full cone NAT。遺憾的是,full cone nat太少了,這也意味着你能收到這個數據包的可能性不大。 若是沒收到,那麼系統進行STEP3的操做。code
B向C的IPC2的port2發送一個數據包,C收到數據包後,把它收到包的源IP和port寫到UDP包中,而後經過本身的IPC2和port2把此包發還給B。 和step1同樣,B確定能收到這個迴應UDP包。此包中的port是咱們最關心的數據,下面咱們來分析:若是這個port和step1中的port同樣,那麼能夠確定這個NAT是個CONE NAT,不然是對稱NAT。orm
道理很簡單:根據對稱NAT的規則,當目的地址的IP和port有任何一個改變,那麼NAT都會從新分配一個port使用,而在step3中,和step1對應,咱們改變了IP和port。所以,若是是對稱NAT,那這兩個port確定是不一樣的。若是在你的應用中,到此步的時候PORT是不一樣的,那就只能放棄P2P了,緣由同上面實現中的同樣。若是不一樣,那麼只剩下了restrict cone 和port restrict cone。系統用step4探測是是哪種。htm
B向C的IP2的一個端口PD發送一個數據請求包,要求C用IP2和不一樣於PD的port返回一個數據包給B。咱們來分析結果:若是B收到了,那也就意味着只要IP相同,即便port不一樣,NAT也容許UDP包經過。顯然這是restrict cone NAT。若是沒收到,沒別的好說,port restrict NAT。