P2P鏈接建立

NAT

NAT有4種不同的類型

1) Full Cone

這種NAT內部的機器A連接過外網機器C後,NAT會打開一個端口.然後外網的任何發到這個打開的端口的UDP數據報都可以到達A.不管是不是C發過來的.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
任何發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

2) Address Restricted Cone

這種NAT內部的機器A連接過外網的機器C後,NAT打開一個端口.然後C可以用任何端口和A通信.其他的外網機器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
任何從C發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

3) Port Restricted Cone

這種NAT內部的機器A連接過外網的機器C後,NAT打開一個端口.然後C可以用原來的端口和A通信.其他的外網機器不行.
例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88
A(192.168.8.100:5000) -> NAT(202.100.100.100 : 8000) -> C(292.88.88.88:2000)
C(202.88.88.88:2000)發送到 NAT(202.100.100.100:8000)的數據都可以到達A(192.168.8.100:5000)

以上三種NAT通稱Cone NAT(圓錐形NAT).我們只能用這種NAT進行UDP打洞.

4) Symmetric(對稱形)

對於這種NAT。連接不同的外部Server,NAT打開的端口會變化。也就是內部機器A連接外網機器B時,NAT會打開一個端口,連接外網機器C時又會打開另外一個端口。

對於雙方都是Port Restricted Cone NAT的時候,則需要利用UDP打洞原理進行“先打洞,然後才能直接通信”。
對 於Cone NAT.要採用UDP打洞.需要一個公網機器server C來充當”介紹人”.處於NAT之後的內網的A,B先分別和C通信,打開各自的NAT端口.C這個時候知道A,B的公網IP: Port. 現在A和B想直接連接.比如A給B直接發包,除非B是Full Cone,否則不能通信.反之亦然.
爲什麼啊?因爲對於處於NAT之後的A,B。 如果想A要與外界的D通信,則首先必須要A發包到D,然後A經過NAT設備NA,NA把A的內網地址和端口轉換爲NA的外網地址和端口。和D通信之後,D 才能經過NA和A通信。也就是說,只能A和外界主動通信,外界不能主動和處於NA之後的A通信。這種包會被NA直接丟棄的。這也就是上面所說的Port Restricted Cone 的情形啊! A(192.168.8.100:5000) -> NA(202.100.100.100:8000) -> D(292.88.88.88:2000)但是我們可以這樣.
A --- NA --- Server C --- NB --- B

    A,B 爲主機;
    NA, NB 爲NAT設備;
    Server C爲外網的機器;

    如果A想與B通信;
    A首先連接 C, C得到A的外網NA的地址和端口;
    B也要連接C,C得到B的外網NB的地址和端口;
    A告訴C說我要和B通訊;
    C通過NB發信息給B,告訴B A的外網NA的地址和端口;
    B向NA發數據包(肯定會被NA丟棄,因爲NA上並沒有 A->NB 的合法session),但是NB上就建立了有B->NA的合法session了;
    B發數據包給C,讓 C 通知 A,我已經把洞打好了;
    A接受到通知後向 B 的外網發NB數據包,這樣就不會被丟棄掉了。因爲對於NB來說,它看到的是A的外網NA的地址,而通過第6步,B已經讓NA成爲NB的合法通信對象了。所以當NA發數據包給NB時,NB就會接收並轉發給B;

注意: 路由器和防火牆的UDP打洞的端口有個時間限制的,在一定時間內如果沒有數據通訊會自動關閉

STUN

STUN 的全稱是Simple Traversal of UDP Through NAT,即UDP對NAT的簡單穿越方式。應用程序(即STUN CLIENT)向NAT外的STUN SERVER通過UDP發送請求STUN 消息詢問自身的轉換後地址,STUN SERVER收到請求消息,產生響應消息,響應消息中攜帶請求消息的源端口,即STUN CLIENT在NAT上對應的外部端口。然後響應消息通過NAT發送給STUN CLIENT,STUN CLIENT通過響應消息體中的內容得知其在NAT上對應的外部地址,並且將其填入以後呼叫協議的UDP負載中,告知對端,同時還可以在終端註冊時直接注 冊這個轉換後的公有IP地址,這樣就解決了H.323/MGCP/SIP穿越NAT的通信建立問題以及作爲被叫時的問題。本端的接收地址和端口號爲NAT 外的地址和端口號。由於通過STUN協議已在NAT上預先建立媒體流的NAT映射表項,故媒體流可順利穿越NAT。
需要注意的是,NAT/PAT 對於地址轉換關係是有一定生命期的,某個地址轉換後在一段時間內沒有被使用將會被清除,當這個業務流再次出現時,將會建立一個新的地址轉換關係,這就意味 着STUN的詢問過程以及終端的註冊過程都需要再執行一遍才能保證通信的正確。解決這個問題一個比較通行的方案是採用某種方式保持NAT/PAT的轉換關 系,例如在NAT/PAT生命期內重複註冊一次,比如NAT/PAT的生命期是3分鐘,那麼就將註冊重複週期設置爲2分鐘。

另外STUN server並非指一個專用的服務器,而是指一種功能、一個協議,我們可以在softswitch或者任何一個需要此功能的服務器上內置此協議, 後面代碼也包含一個簡單的Server實現。

但 是在NAT採用對稱模式(symmetric NAT)工作時,STUN的方案就會出現問題。假如我們在softswitch上提供STUN server功能,終端A通過STUN可以獲得NAT爲終端A與softswitch之間通信分配的地址A',並將這個地址註冊在softswitch 上,當一個公網上的終端B呼叫終端A時,A'和B通過softswitch完成呼叫建立過程。當B試圖向A'發送媒體流時,問題就出現了。因爲對稱NAT 只允許從softswitch發送數據給地址A',從B發送的媒體流將被丟棄。所以STUN無法應用於工作在對稱模式的NAT.

STUN協議最大的優點是無需現有NAT/FW設備做任何改動,同時STUN方式可在多個NAT串聯的網絡環境中使用. STUN的侷限性在於STUN並不適合支持TCP連接的穿越,同時STUN方式不支持對對稱NAT(Symmetric NAT).

TURN

這 種方式又稱SPAN(Simple Protocol for Augmenting NATs)方式. TURN方式解決NAT問題的思路與STUN相似,也是基於私網接入用戶通過某種機制預先得到其私有地址對應在公網的地址(STUN方式得到的地址爲出口 NAT上的地址,TURN方式得到地址爲TURNServer上的地址),然後在報文負載中所描述的地址信息直接填寫該公網地址的方式,實際應用原理也是 一樣的。
TURN的全稱爲Traversal Using RelayNAT,即通過Relay方式穿越NAT,TURN應用模型通過分配TURNServer的地址和端口作爲客戶端對外的接受地址和端口,即私網 用戶發出的報文都要經過TURNServer進行Relay轉發,這種方式除了具有STUN方式的優點外,還解決了STUN應用無法穿透對稱 NAT(Symmetric NAT)以及類似的Firewall設備的缺陷,即無論企業網/駐地網出口爲哪種類型的NAT/FW,都可以實現NAT的穿透,同時TURN支持基於 TCP的應用,如H323協議。TURN的侷限性在於所有報文都必須經過TURNServer轉發,增大了包的延遲和丟包的可能性.

 

ICE

ICE跟STUN和TURN不一樣,ICE不是一種協議,而是一個framework,它整合了STUN和TURN。

 

UPnP

UPnP是若干網絡協議的組合,主要用於設備的互聯,但是一種叫做Internet Gateway Device (IGD) Protocol的防火牆穿越技術是基於UPnP的。
————————————————
版權聲明:本文爲CSDN博主「天才萌想家」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010491087/article/details/50801887

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章