穿透NAT类型以及STUN、TURN简单介绍
穿透NAT類型以及STUN、TURN簡單介紹
- 概述
- NAT的副作用以及解決方案
- NAT有4種不同的類型
- 錐形和對稱形NAT的區別
- STUN和TURN的簡單介紹
- STUN
- 基本思想
- STUN Server主要做了兩件事:
- TURN Server
- TURN Server也主要做了兩件事:
- 三種轉發情形
- 各種網絡環境下的P2P通信解決方法:
概述
NAT英文全稱是“Network Address Translation”,中文意思是“網絡地址轉換”,它是一個IETF(Internet Engineering Task Force, Internet工程任務組)標準,允許一個整體機構以一個公用IP(Internet Protocol)地址出現在Internet上。顧名思義,它是一種把內部私有網絡地址(IP地址)翻譯成合法網絡IP地址的技術。NAT 可以讓那些使用私有地址的內部網絡連接到Internet或其它IP網絡上,這個過程對用戶來說是透明的。NAT路由器在將內部網絡的數據包發送到公用網絡時,在IP包的報頭把私有地址轉換成合法的IP地址。因此我們可以認為,NAT在一定程度上能夠有效的解決公網地址不足的問題。
NAT的副作用以及解決方案
國內移動無線網絡運營商在鏈路上一段時間內沒有數據通訊后, 會淘汰NAT表中的對應項, 造成鏈路中斷。
這是NAT帶來的第一個副作用——NAT超時:
而國內的運營商一般NAT超時的時間為5分鐘,所以通常我們TCP長連接的心跳設置的時間間隔為3-5分鐘。
而第二個副作用就是——NAT墻。
NAT會有一個機制,所有外界對內網的請求,到達NAT的時候,都會被NAT所丟棄,這樣如果我們處于一個NAT設備后面,我們將無法得到任何外界的數據。
但是這種機制有一個解決方案:就是如果我們A主動往B發送一條信息,這樣A就在自己的NAT上打了一個通往B的洞。這樣A的這條消息到達B的NAT的時候,雖然被丟掉了,但是如果B這個時候在給A發信息,到達A的NAT的時候,就可以從A之前打的那個洞中,發送給到A手上了。
NAT有4種不同的類型
- 完全透明NAT(Full Cone NAT)
這種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)
- 受限NAT(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)
- 端口受限NAT(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 是指:只要是從同一個內部地址和端口出來的包,無論目的地址是否相同,NAT 都將它轉換成同一個外部地址和端口?!巴粋€外部地址和端口”與“無論目的地址是否相同”形成了一個類似錐形的網絡結構,也是這一名稱的由來。反過來,不滿足這一條件的即為對稱NAT 。
我們只能用這種NAT進行UDP打洞。
- Symmetric(對稱形)
對于這種NAT。連接不同的外部Server,NAT打開的端口會變化。也就是內部機器A連接外網機器B時,NAT會打開一個端口,連接外網機器C時又會打開另外一個端口。
Symmetric NAT會遵循兩個原則:
假設如下的情況( 內網有主機 A 和 D ,公網有主機 B 和 C ):
先后建立如下三條連接:
A ( 1000 ) —— > NAT ( 1000 )—— > B ( 2000 )
D ( 1000 ) —— > NAT ( 1000 )—— > C ( 2000 )
A ( 1000 ) —— > NAT ( 1001 )—— > C ( 2000 )
可以看到,前兩條連接遵循了原則 1 ,并且不違背原則 2,而第三條連接為了避免與第二條產生相同的 socket 而改變了源端口。比較第一和第三條連接,同樣來自 A(1000) 的數據包在經過 NAT 后源端口分別變為了 1000 和1001 。說明 Linux 的 NAT 是對稱 NAT 。
錐形和對稱形NAT的區別
- 如果是錐形 NAT :
那么成功連接后,狀態必然如下:
A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )
A ( 1000 ) —— > NAT ( 5001 )—— > C ( 3000 )
也就是說,只要是從 A 主機的 1000 端口發出的包,經過地址轉換后的源端口一定相同。
- 如果是對稱形 NAT :
連接后,狀態有可能(注意是可能,不是一定)如下:
A ( 1000 ) —— > NAT ( 5001 )—— > B ( 2000 )
A ( 1000 ) —— > NAT ( 5002 )—— > C ( 3000 )
兩者的區別顯而易見。
STUN和TURN的簡單介紹
STUN
STUN(Simple Traversal of UDP over NATs,NAT 的UDP簡單穿越)是一種網絡協議,它允許位于NAT(或多重NAT)后的客戶端找出自己的公網地址,查出自己位于哪種類型的NAT之后以及NAT為某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處于NAT 路由器之后的主機之間建立UDP通信。該協議由RFC 3489定義。
STUN,是為了實現透明的穿透NAT,而定義的一套協議。它使本地的內網的機器,具有取得,能夠得知它的NAT網關的IP,NAT類型的能力。
基本思想
在私網內部安裝一個STUN client,在公網上安裝一個STUN Server,STUN協議定義了一些消息格式,大體上分成Request/Response,client向server發送 request,server發送response給client。如何檢測STUN client是否在NAT后面呢?原理很簡單,Server在收到client的UDP包以后,Server將接收到該包的地址和端口利用udp傳回來給 client,client把這些地址和端口與本機的ip地址和端口進行比較,如果不同,說明在NAT后面,否則就位于NAT前面。為了檢測不同類型的 NAT,STUN協議定義了一些消息屬性,要求Server有不同的動作,比如發送響應的時候使用不同的IP地址和端口,或者改變端口等等。STUN協議 對NAT可能有效,但是對防火墻就無能為力了,因為防火墻可能不會打開UDP端口。
STUN Server主要做了兩件事:
- 接受客戶端的請求,并且把客戶端的公網IP、Port封裝到ICE Candidate中。
- 通過一個復雜的機制,得到客戶端的NAT類型。
TURN Server
TURN(Traversal Using Relay NAT),TURN是STUN協議的擴展,在實際應用中他也可以充當STUN的角色;如果一個位于NAT后面的設備想要和另外一個位于NAT后面的設備建立通信,當采用UDP打洞技術不能改實現的時候就必須要一臺中間服務器扮演數據包轉發的角色,這臺TURN服務器需要擁有公網的IP地址
TURN Server也主要做了兩件事:
-
為NAT打洞:
如果A和B要互相通信,那么TURN Server,會命令A和B互相發一條信息,這樣各自的NAT就留下了對方的洞,下次他們就可以之間進行通信了。 -
為對稱NAT提供消息轉發:
當A或者B其中一方是對稱NAT時,那么給這一方發信息,就只能通過TURN Server來轉發了。
三種轉發情形
STUN Server判斷出客戶端處于什么類型的NAT下,然后去做后續的處理,STUN Server會返回給客戶端它的公網IP、Port和NAT類型,除此之外:
-
如果A處于公網或者Full Cone Nat下,STUN不做其他的了,因為其他客戶端可以直接和A進行通信。
-
如果A處于Restrict Cone或者Port Restrict NAT下,STUN還會協調TURN進行NAT打洞。
- 如果A處于對稱NAT下,那么點對點連接下,NAT是無法進行打洞的。所以為了通信,只能采取最后的手段了,就是轉成C/S架構了,STUN會協調TURN進行消息轉發。
各種網絡環境下的P2P通信解決方法:
如果通信雙方在同一個局域網內,這種情況下可以不借助任何外力直接通過內網地址通信即可;
如果通信雙方都在有獨立的公網地址,這種情況下當然可以不借助任何外力直接通信即可;
如果通信雙方一方擁有獨立的公網地址另一方在NAT后面,那么可以由位于NAT后面的一方主動發起通信請求;
如果通信雙方都位于NAT后面,且雙方的NAT類型都是cone NAT,那么可以通過一個STUN服務器發現自己的NAT類型以及內網和外網傳輸地址映射信息,然后通過Signaling(信令服務器,實現了SIP協議的主機)交換彼此的NAT類型及內網和外網傳輸地址映射信息,然后通過UDP打洞的方式建立通信連接;
如果通信雙方有一方的NAT類型是Symmetric NAT,則無法直接建立P2P連接,這個時候就需要借助TURN(Traversal Using Relay NAT)即轉發服務器來實現間接通信。
總結
以上是生活随笔為你收集整理的穿透NAT类型以及STUN、TURN简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帆软单选按钮实例_HTML单选按钮示例教
- 下一篇: 计算机桌面刷新位置不可用,电脑桌面打开图