NAT STURN,ICE
NAT原理與NAT穿越
最近在看東西的時候發(fā)現(xiàn)很多網(wǎng)絡(luò)程序中都需要NAT穿越,特意在此總結(jié)一下。
先做一個約定:
內(nèi)網(wǎng)A中有:A1(192.168.0.8)、A2(192.168.0.9)兩用戶
?????????????? 網(wǎng)關(guān)X1(一個NAT設(shè)備)有公網(wǎng)IP?1.2.3.4
內(nèi)網(wǎng)B中有:B1(192.168.1.8)、B2(192.168.1.9)兩用戶,
?????????????? 網(wǎng)關(guān)Y1(一個NAT設(shè)備)有公網(wǎng)IP?1.2.3.5
公網(wǎng)服務(wù)器:C (6.7.8.9) D (6.7.8.10)
-
NAT原理
???? 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT,Network Address Translation)屬接入廣域網(wǎng)(WAN)技術(shù),是一種將私有(保留)地址轉(zhuǎn)化為合法IP地址的轉(zhuǎn)換技術(shù)。下面介紹兩類不同方式實現(xiàn)的NAT:
在客戶機時????? 192.168.0.8:4000——6.7.8.9:8000
在網(wǎng)關(guān)時???????? 1.2.3.4:4000——6.7.8.9:8000
服務(wù)器C????????? 6.7.8.9:8000
其核心是替換IP地址而不是端口,這會導(dǎo)致192.168.0.8使用4000端口后,192.168.0.9如何處理?具體參考RFC 1631
基本上這種類型的NAT設(shè)備已經(jīng)很少了。或許根本我們就沒機會見到。
???? 2.?? NAPT(Network Address/Port Translators):其實這種才是我們常說的 NAT
NAPT的特點是在網(wǎng)關(guān)時,會使用網(wǎng)關(guān)的 IP,但端口會選擇一個和臨時會話對應(yīng)的臨時端口。如下圖:
在客戶機時?????????? 192.168.0.8:4000——6.7.8.9:8000
在網(wǎng)關(guān)時????????????? 1.2.3.4:62000——6.7.8.9:8000
服務(wù)器C?????????????? 6.7.8.9:8000
網(wǎng)關(guān)上建立保持了一個1.2.3.4:62000的會話,用于192.168.0.8:4000與6.7.8.9:8000之間的通訊。
對于NAPT,又分了兩個大的類型,差別在于,當(dāng)兩個內(nèi)網(wǎng)用戶同時與8000端口通信的處理方式不同:
???????? 2.1、Symmetric NAT型 (對稱型)
在客戶機時????????????? 192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000
在網(wǎng)關(guān)時,兩個不同session但端口號不同??????1.2.3.4:62000——6.7.8.9:8000 1.2.3.4:62001——6.7.8.10:8000
服務(wù)器C????? 6.7.8.9:8000
服務(wù)器 D???? 6.7.8.10:8000
這種形式會讓很多p2p軟件失靈。
??????? 2.2、Cone NAT型(圓錐型)
在客戶機時????????????? 192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000
在網(wǎng)關(guān)時,兩個不同session但端口號相同??????1.2.3.4:62000——6.7.8.9:8000 1.2.3.4:62000——6.7.8.10:8000
服務(wù)器C?????????? 6.7.8.9:8000
服務(wù)器D?????????? 6.7.8.10:8000
目前絕大多數(shù)屬于這種。Cone NAT又分了3種類型:
- a)Full Cone NAT(完全圓錐型):從同一私網(wǎng)地址端口192.168.0.8:4000發(fā)至公網(wǎng)的所有請求都映射成同一個公網(wǎng)地址端口1.2.3.4:62000 ,192.168.0.8可以收到任意外部主機發(fā)到1.2.3.4:62000的數(shù)據(jù)報。
- b)Address Restricted Cone NAT?(地址限制圓錐型):從同一私網(wǎng)地址端口192.168.0.8:4000發(fā)至公網(wǎng)的所有請求都映射成同一個公網(wǎng)地址端口1.2.3.4:62000,只有當(dāng)內(nèi)部主機192.168.0.8先給服務(wù)器C 6.7.8.9發(fā)送一個數(shù)據(jù)報后,192.168.0.8才能收到6.7.8.9發(fā)送到1.2.3.4:62000的數(shù)據(jù)報。
- c)Port Restricted Cone NAT(端口限制圓錐型):從同一私網(wǎng)地址端口192.168.0.8:4000發(fā)至公網(wǎng)的所有請求都映射成同一個公網(wǎng)地址端口1.2.3.4:62000,只有當(dāng)內(nèi)部主機192.168.0.8先向外部主機地址端口6.7.8.9:8000發(fā)送一個數(shù)據(jù)報后,192.168.0.8才能收到6.7.8.9:8000發(fā)送到1.2.3.4:62000的數(shù)據(jù)報。???
-
穿越NAT的實現(xiàn)
A1在客戶機時??????????????? 192.168.0.8:4000——6.7.8.9:8000
X1在網(wǎng)關(guān)時?????????????????? 1.2.3.4:62000——6.7.8.9:8000
服務(wù)器C?????????????????????? 6.7.8.9:8000
B1在客戶機時??????????????? 192.168.1.8:4000——6.7.8.9:8000
Y1在網(wǎng)關(guān)時?????????????????? 1.2.3.5:31000——6.7.8.9:8000
兩內(nèi)網(wǎng)用戶要實現(xiàn)通過各自網(wǎng)關(guān)的直接呼叫,需要以下過程:
1、 客戶機A1、B1順利通過格子網(wǎng)關(guān)訪問服務(wù)器C ,均沒有問題(類似于登錄)
2、 服務(wù)器C保存了 A1、B1各自在其網(wǎng)關(guān)的信息(1.2.3.4:62000、1.2.3.5:31000)沒有問題。并可將該信息告知A1、B2。
3、 此時A1發(fā)送給B1網(wǎng)關(guān)的1.2.3.5:31000是否會被B1收到?答案是基本上不行(除非Y1設(shè)置為完全圓錐型,但這種設(shè)置非常少),因為Y1上檢測到其存活的會話中沒有一個的目的IP或端口于1.2.3.4:62000有關(guān)而將數(shù)據(jù)包全部丟棄!
4、 此時要實現(xiàn)A1、B1通過X1、Y1來互訪,需要服務(wù)器C告訴它們各自在自己的網(wǎng)關(guān)上建立“UDP隧道”,即命令A(yù)1發(fā)送一個 192.168.0.8:4000——1.2.3.5:31000的數(shù)據(jù)報,B1發(fā)送一個192.168.1.8:4000——1.2.3.4:62000的數(shù)據(jù)報,UDP形式,這樣X1、Y1上均存在了IP端口相同的兩個不同會話(很顯然,這要求網(wǎng)關(guān)為Cone NAT型,否則,對稱型Symmetric NAT設(shè)置網(wǎng)關(guān)將導(dǎo)致對不同會話開啟了不同端口,而該端口無法為服務(wù)器和對方所知,也就沒有意義)。
5、 此時A1發(fā)給Y1,或者B1發(fā)給X1的數(shù)據(jù)報將不會被丟棄且正確的被對方收到.
綜合P2P可實現(xiàn)的條件需要:
1、 中間服務(wù)器保存信息、并能發(fā)出建立UDP隧道的命令
2、 網(wǎng)關(guān)均要求為Cone NAT類型。Symmetric NAT不適合。
3、 完全圓錐型網(wǎng)關(guān)可以無需建立udp隧道,但這種情況非常少,要求雙方均為這種類型網(wǎng)關(guān)的更少。
4、 假如X1網(wǎng)關(guān)為Symmetric NAT, Y1為Address Restricted Cone NAT 或Full Cone NAT型網(wǎng)關(guān),各自建立隧道后,A1可通過X1發(fā)送數(shù)據(jù)報給Y1到B1(因為Y1最多只進(jìn)行IP級別的甄別),但B2發(fā)送給X1的將會被丟棄(因為發(fā)送來的數(shù)據(jù)報中端口與X1上存在會話的端口不一致,雖然IP地址一致),所以同樣沒有什么意義。
5、 假如雙方均為Symmetric NAT的情形,新開了端口,對方可以在不知道的情況下嘗試猜解,也可以達(dá)到目的,但這種情形成功率很低,且?guī)眍~外的系統(tǒng)開支,不是個好的解決辦法。
6、 不同網(wǎng)關(guān)型設(shè)置的差異在于,對內(nèi)會采用替換IP的方式、使用不同端口不同會話的方式,使用相同端口不同會話的方式;對外會采用什么都不限制、限制IP地址、限制IP地址及端口。
7、 這里還沒有考慮同一內(nèi)網(wǎng)不同用戶同時訪問同一服務(wù)器的情形,如果此時網(wǎng)關(guān)采用AddressRestricted Cone NAT 或Full Cone NAT型,有可能導(dǎo)致不同用戶客戶端可收到別人的數(shù)據(jù)包,這顯然是不合適的。
?
一些現(xiàn)在常用的技術(shù):
ALG(應(yīng)用層網(wǎng)關(guān)):它可以是一個設(shè)備或插件,用于支持SIP協(xié)議,主要類似與在網(wǎng)關(guān)上專門開辟一個通道,用于建立內(nèi)網(wǎng)與外網(wǎng)的連接,也就是說,這是一種定制的網(wǎng)關(guān)。更多只適用于使用他們的應(yīng)用群體內(nèi)部之間。
UpnP:它是讓網(wǎng)關(guān)設(shè)備在進(jìn)行工作時尋找一個全球共享的可路由IP來作為通道,這樣避免端口造成的影響。要求設(shè)備支持且開啟upnp功能,但大部分時候,這些功能處于安全考慮,是被關(guān)閉的。即時開啟,實際應(yīng)用效果還沒經(jīng)過測試。
STUN(Simple Traversalof UDP Through Network):這種方式即是類似于我們上面舉例中服務(wù)器C的處理方式。也是目前普遍采用的方式。但具體實現(xiàn)要比我們描述的復(fù)雜許多,光是做網(wǎng)關(guān)Nat類型判斷就由許多工作,RFC3489中詳細(xì)描述了。
TURN(Traveral Using Relay NAT):該方式是將所有的數(shù)據(jù)交換都經(jīng)由服務(wù)器來完成,這樣NAT將沒有障礙,但服務(wù)器的負(fù)載、丟包、延遲性就是很大的問題。目前很多游戲均采用該方式避開NAT的問題。這種方式不叫p2p。
ICE(Interactive Connectivity Establishment):是對上述各種技術(shù)的綜合,但明顯帶來了復(fù)雜性。
轉(zhuǎn)載于:https://www.cnblogs.com/SZLLQ2000/p/6762063.html
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的NAT STURN,ICE的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第二十六讲:基础一开放封闭原则
- 下一篇: ZOJ 3962:Seven Segme