1. 程式人生 > 其它 >第1年7月22日 stun

第1年7月22日 stun

1.

如果Client A的原來那個Socket(綁定了1234埠的那個UDP Socket)又接著向另外一個Server S2傳送了一個UDP包,那麼這個UDP包在通過NAT時會怎麼樣呢? 這時可能會有兩種情況發生,一種是NAT再次建立一個Session,並且再次為這個Session分配一個埠號(比如:62001)。另外一種是NAT再次建立一個Session,但是不會新分配一個埠號,而是用原來分配的埠號62000。前一種NAT叫做Symmetric NAT(對稱NAT),後一種叫做Cone NAT(錐形NAT)。如果你的NAT剛好是第一種,那麼很可能會有很多P2P軟體失靈。(可以慶幸的是,現在絕大多數的NAT屬於後者,即Cone NAT) peakflys注:Cone NAT具體又分為3種: (1)全圓錐( Full Cone) : NAT把所有來自相同內部IP地址和埠的請求對映到相同的外部IP地址和埠。任何一個外部主機均可通過該對映傳送IP包到該內部主機。 (2)限制性圓錐(Restricted Cone) : NAT把所有來自相同內部IP地址和埠的請求對映到相同的外部IP地址和埠。但是,只有當內部主機先給IP地址為X的外部主機發送IP包,該外部主機才能向該內部主機發送IP包。 (3)埠限制性圓錐( Port Restricted Cone) :埠限制性圓錐與限制性圓錐類似,只是多了埠號的限制,即只有內部主機先向IP地址為X,埠號為P的外部主機發送1個IP包,該外部主機才能夠把源埠號為P的IP包傳送給該內部主機。 STUN是RFC3489規定的一種NAT穿透方式,它採用輔助的方法探測NAT的IP和埠。毫無疑問的,它對穿越早期的NAT起了巨大的作用,並且還將繼續在NAT穿透中佔有一席之地。 STUN的探測過程需要有一個公網IP的STUN server,在NAT後面的UAC必須和此server配合,互相之間傳送若干個UDP資料包。UDP包中包含有UAC需要了解的資訊,比如NAT外網IP,PORT等等。UAC通過是否得到這個UDP包和包中的資料判斷自己的NAT型別。 假設有如下UAC(B),NAT(A),SERVER(C),UAC的IP為IPB,NAT的IP為 IPA ,SERVER的 IP為IPC1 、IPC2。請注意,伺服器C有兩個IP,後面你會理解為什麼需要兩個IP。 STEP3:B向C的IPC2的port2傳送一個數據包,C收到資料包後,把它收到包的源IP和port寫到UDP包中,然後通過自己的IPC2和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是不同的,那就只能放棄P2P了,原因同上面實現中的一樣。如果不同,那麼只剩下了restrict cone 和port restrict cone。系統用step4探測是是那一種。
STEP4:B向C的IP2的一個埠PD傳送一個數據請求包,要求C用IP2和不同於PD的port返回一個數據包給B。 我們來分析結果:如果B收到了,那也就意味著只要IP相同,即使port不同,NAT也允許UDP包通過。顯然這是restrict cone NAT。如果沒收到,沒別的好說,port restrict NAT.

http://www.cppblog.com/peakflys/archive/2014/02/06/197562.html#205647