先做個(gè)約定:
內(nèi)網(wǎng)A中有:A1(192.168.0.8)、A2(192.168.0.9)兩用戶,
網(wǎng)關(guān)X1(一個(gè)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(一個(gè)NAT設(shè)備)有公網(wǎng)IP 1.2.3.5
公網(wǎng)服務(wù)器:C (6.7.8.9) D (6.7.8.10)
NAT兩大類:
l NAT(Network Address Translators):稱為基本的NAT
在客戶機(jī)時(shí)
192.168.0.8:4000——6.7.8.9:8000
在網(wǎng)關(guān)時(shí)
1.2.3.4:4000——6.7.8.9:8000
服務(wù)器C
6.7.8.9:8000
其核心是替換IP地址而不是端口,這會(huì)導(dǎo)致192.168.0.8使用4000端口后,192.168.0.9如何處理?
具體參考RFC 1631
基本上這種類型的NAT設(shè)備已經(jīng)很少了?;蛟S根本我們就沒機(jī)會(huì)見到。
l NAPT(Network Address/Port Translators)
其實(shí)這種才是我們常說的 NAT
NAPT的特點(diǎn)是在網(wǎng)關(guān)時(shí),會(huì)使用網(wǎng)關(guān)的 IP,但端口會(huì)選擇一個(gè)和臨時(shí)會(huì)話對應(yīng)的臨時(shí)端口。
如下圖:
在客戶機(jī)時(shí) 192.168.0.8:4000——6.7.8.9:8000 |
在網(wǎng)關(guān)時(shí) 1.2.3.4:62000——6.7.8.9:8000 |
網(wǎng)關(guān)上建立保持了一個(gè)1.2.3.4:62000的會(huì)話,用于192.168.0.8:4000與6.7.8.9:8000之間的通訊。
對于NAPT,又分了兩個(gè)大的類型:
差別在于,當(dāng)兩個(gè)內(nèi)網(wǎng)用戶同時(shí)與6.7.8.9:8000的處理方式不同:
1、Symmetric NAT型 (對稱型)
在客戶機(jī)時(shí) 192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000 |
在網(wǎng)關(guān)時(shí),兩個(gè)不同session但端口號不同 1.2.3.4:62000——6.7.8.9:8000 1.2.3.4:62001——6.7.8.10:8000 |
這種形式會(huì)讓很多p2p軟件失靈。
2、Cone NAT型(圓錐型)
在客戶機(jī)時(shí)
192.168.0.8:4000——6.7.8.9:8000 192.168.0.8:4000——6.7.8.10:8000
在網(wǎng)關(guān)時(shí),兩個(gè)不同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)的所有請求都映射成同一個(gè)公網(wǎng)地址端口1.2.3.4:62000 ,192.168.0.8可以收到任意外部主機(jī)發(fā)到1.2.3.4:62000的數(shù)據(jù)報(bào)。
b) Address Restricted Cone NAT (地址限制圓錐型):從同一私網(wǎng)地址端口192.168.0.8:4000發(fā)至公網(wǎng)的所有請求都映射成同一個(gè)公網(wǎng)地址端口1.2.3.4:62000,只有當(dāng)內(nèi)部主機(jī)192.168.0.8先給服務(wù)器C 6.7.8.9發(fā)送一個(gè)數(shù)據(jù)報(bào)后,192.168.0.8才能收到6.7.8.9發(fā)送到1.2.3.4:62000的數(shù)據(jù)報(bào)。
c) Port Restricted Cone NAT(端口限制圓錐型):從同一私網(wǎng)地址端口192.168.0.8:4000發(fā)至公網(wǎng)的所有請求都映射成同一個(gè)公網(wǎng)地址端口1.2.3.4:62000,只有當(dāng)內(nèi)部主機(jī)192.168.0.8先向外部主機(jī)地址端口6.7.8.9:8000發(fā)送一個(gè)數(shù)據(jù)報(bào)后,192.168.0.8才能收到6.7.8.9:8000發(fā)送到1.2.3.4:62000的數(shù)據(jù)報(bào)。
請注意上述描敘中的區(qū)別!
穿越NAT的實(shí)現(xiàn):
A1在客戶機(jī)時(shí)
192.168.0.8:4000——6.7.8.9:8000
X1在網(wǎng)關(guān)時(shí)
1.2.3.4:62000——6.7.8.9:8000
服務(wù)器C
6.7.8.9:8000
B1在客戶機(jī)時(shí)
192.168.1.8:4000——6.7.8.9:8000
Y1在網(wǎng)關(guān)時(shí)
1.2.3.5:31000——6.7.8.9:8000
兩內(nèi)網(wǎng)用戶要實(shí)現(xiàn)通過各自網(wǎng)關(guān)的直接呼叫,需要以下過程:
1、 客戶機(jī)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、 此時(shí)A1發(fā)送給B1網(wǎng)關(guān)的1.2.3.5:31000是否會(huì)被B1收到?答案是基本上不行(除非Y1設(shè)置為完全圓錐型,但這種設(shè)置非常少),因?yàn)閅1上檢測到其存活的會(huì)話中沒有一個(gè)的目的IP或端口于1.2.3.4:62000有關(guān)而將數(shù)據(jù)包全部丟棄!
4、 此時(shí)要實(shí)現(xiàn)A1、B1通過X1、Y1來互訪,需要服務(wù)器C告訴它們各自在自己的網(wǎng)關(guān)上建立 “UDP隧道”,即命令A(yù)1發(fā)送一個(gè) 192.168.0.8:4000——1.2.3.5:31000的數(shù)據(jù)報(bào),B1發(fā)送一個(gè) 192.168.1.8:4000——1.2.3.4:62000的數(shù)據(jù)報(bào),UDP形式,這樣X1、Y1上均存在了IP端口相同的兩個(gè)不同會(huì)話(很顯然,這要求網(wǎng)關(guān)為Cone NAT型,否則,對稱型Symmetric NAT設(shè)置網(wǎng)關(guān)將導(dǎo)致對不同會(huì)話開啟了不同端口,而該端口無法為服務(wù)器和對方所知,也就沒有意義)。
5、 此時(shí)A1發(fā)給Y1,或者B1發(fā)給X1的數(shù)據(jù)報(bào)將不會(huì)被丟棄且正確的被對方收到
綜合P2P可實(shí)現(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ù)報(bào)給Y1到B1(因?yàn)閅1最多只進(jìn)行IP級別的甄別),但B2發(fā)送給X1的將會(huì)被丟棄(因?yàn)榘l(fā)送來的數(shù)據(jù)報(bào)中端口與X1上存在會(huì)話的端口不一致,雖然IP地址一致),所以同樣沒有什么意義。
5、 假如雙方均為Symmetric NAT的情形,新開了端口,對方可以在不知道的情況下嘗試猜解,也可以達(dá)到目的,但這種情形成功率很低,且?guī)眍~外的系統(tǒng)開支,不是個(gè)好的解決辦法。
6、 不同網(wǎng)關(guān)型設(shè)置的差異在于,對內(nèi)會(huì)采用替換IP的方式、使用不同端口不同會(huì)話的方式,使用相同端口不同會(huì)話的方式;對外會(huì)采用什么都不限制、限制IP地址、限制IP地址及端口。
7、 這里還沒有考慮同一內(nèi)網(wǎng)不同用戶同時(shí)訪問同一服務(wù)器的情形,如果此時(shí)網(wǎng)關(guān)采用Address Restricted Cone NAT 或Full Cone NAT型,有可能導(dǎo)致不同用戶客戶端可收到別人的數(shù)據(jù)包,這顯然是不合適的。
一些現(xiàn)在常用的技術(shù):
ALG(應(yīng)用層網(wǎng)關(guān)):它可以是一個(gè)設(shè)備或插件,用于支持SIP協(xié)議,主要類似與在網(wǎng)關(guān)上專門開辟一個(gè)通道,用于建立內(nèi)網(wǎng)與外網(wǎng)的連接,也就是說,這是一種定制的網(wǎng)關(guān)。更多只適用于使用他們的應(yīng)用群體內(nèi)部之間。
UpnP :它是讓網(wǎng)關(guān)設(shè)備在進(jìn)行工作時(shí)尋找一個(gè)全球共享的可路由IP來作為通道,這樣避免端口造成的影響。要求設(shè)備支持且開啟upnp功能,但大部分時(shí)候,這些功能處于安全考慮,是被關(guān)閉的。即時(shí)開啟,實(shí)際應(yīng)用效果還沒經(jīng)過測試。
STUN(Simple Traversalof UDP Through Network):這種方式即是類似于我們上面舉例中服務(wù)器C的處理方式。也是目前普遍采用的方式。但具體實(shí)現(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ù)雜性。