劉健 周仲文 劉洋
四川廣播電視大學(xué) 四川 610107
Internet飛速發(fā)展,IPv4地址日益不足,不得不使用NAT技術(shù)來提高地址使用率,從邏輯意義上擴(kuò)展地址空間。P2P技術(shù)的出現(xiàn)也是 Internet發(fā)展的結(jié)果,其優(yōu)點(diǎn)在于任意兩節(jié)點(diǎn)間可以隨意通信,擺脫了客戶端對服務(wù)器的依賴。
NAT背后的私有地址對公網(wǎng)地址節(jié)點(diǎn)不可見,雖然內(nèi)網(wǎng)主機(jī)可以主動訪問外部網(wǎng)絡(luò),但公網(wǎng)主機(jī)不能主動訪問內(nèi)網(wǎng)主機(jī)。同時,內(nèi)網(wǎng)主機(jī)間不能相互識別,進(jìn)而導(dǎo)致不能直接向?qū)Ψ教峁┓?wù)。這類問題與P2P技術(shù)的初衷——“對等”相違背,阻礙了P2P的發(fā)展。在目前NAT技術(shù)大面積應(yīng)用的狀態(tài)下,急需一種簡單有效的辦法解決這個問題,同時還要滿足“不需要改變現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)”的要求。
根據(jù)端口映射方式不同,NAT主要分為兩大類:ConeNAT(克隆式 NAT)和 SymmetricNAT(對稱式 NAT)。ConeNAT把來自于同一個內(nèi)網(wǎng)地址 A:B的請求都映射到一個公網(wǎng)地址X:Y上。SymmetricNAT把來自于同一內(nèi)網(wǎng)地址A:B,去往同一個外網(wǎng)地址C:D的請求映射成同一個公網(wǎng)地址X:Y1,去往另外一個外網(wǎng)地址E:F的請求映射成同一個公網(wǎng)地址,但端口不同X:Y2。
研究表明,現(xiàn)存的NAT有88.1%是屬于第一種類型,只有2.3%左右的NAT屬于第二種。因此,針對ConeNAT的穿透研究更具有實(shí)際應(yīng)用價值。
最新的STUN已經(jīng)規(guī)定其自身只是一種應(yīng)用于NAT的工具,不再是一整套解決方案。結(jié)合TCP建立連接的特點(diǎn),即要經(jīng)過三次握手,此過程需要第三方的服務(wù)器協(xié)助才能穿透NAT,具體步驟見圖1。
圖1 TCP穿透NAT流程
(1)用戶A與公網(wǎng)上的服務(wù)器S建立TCP連接。S判斷A所連接的NAT A類型,并記錄下A的私有地址(172.16.1.2: 4001)以及經(jīng)過轉(zhuǎn)換后的公網(wǎng)地址(211.0.0.2:5001)(第1步)。同樣的信息在用戶B與服務(wù)器S建立連接后也記錄下來:私有地址(192.168.1.3:6001)和公網(wǎng)地址(222.0.0.3:7001)(第2步)。
(2)當(dāng)A與B之間需要建立TCP連接時,A先向S發(fā)送一個請求(第3步),S把B的公網(wǎng)地址(222.0.0.3:7001)回復(fù)給A(第4步)。于是A斷開與S的連接,并且向B發(fā)出一個SYN(A->B)信息,接著A保持監(jiān)聽狀態(tài),并每隔一段時間向B發(fā)送一個SYN(A->B)(第6步)。當(dāng)?shù)谝粋€SYN信息到達(dá)NAT A后,NAT A記錄下A主動與B通信的狀態(tài),此后來自B的數(shù)據(jù)包可以自由穿透NAT A。
(3)S在把B的公網(wǎng)地址回復(fù)給A的同時,也把A的公網(wǎng)地址通知給B(第5步)。
(4)B收到S的通知后,斷開與S的連接,并且向A發(fā)送一個SYN(B->A)信息(第7步),接著B保持監(jiān)聽狀態(tài)。當(dāng)這個SYN(B->A)到達(dá)NAT B后,NAT B記錄下B主動與A通信的狀態(tài),此后來自A的數(shù)據(jù)包可以自由穿透NAT B。如果SYN(A->B)比SYN(B->A)先到達(dá)NAT B,SYN(A->B)會被認(rèn)為是非法而拋棄,如第6步的SYN(A->B);只有比SYN (B->A)晚到達(dá)NAT B的SYN(A->B)才會被認(rèn)為是合法,如第8步的SYN(A->B)。
(5)當(dāng)合法的SYN(A->B)穿透NAT B到達(dá)B(第8步)后,B向A回發(fā)一個SYN+ACK(B->A)信息(第9步)。此時來自 B的數(shù)據(jù)包都被 NAT A認(rèn)為是合法,所以這個SYN+ACK(B->A)可以自由穿透NAT A到達(dá)A。
(6)當(dāng) A收到 SYN+ACK(B->A)后,向 B回發(fā)一個ACK(A->B)(第10步)。這個ACK(A->B)也可以自由穿透NAT B到達(dá)B。于是雙方的TCP經(jīng)過三次握手,建立連接成功(第11步)。
此種穿透法可以在前述的大多數(shù)情況下正常建立P2P的TCP連接,具有實(shí)際應(yīng)用價值。但是如果其中有一個 NAT是 SymmetricNAT,那么上述方法就會失效。因?yàn)閷τ诓煌哪康墓W(wǎng)地址,都會映射成不同的端口。
通過第三方的協(xié)助,P2P順利穿透NAT,各節(jié)點(diǎn)間建立TCP連接。此方法的優(yōu)點(diǎn)在于簡單有效,不需要改變現(xiàn)有的網(wǎng)絡(luò)結(jié)構(gòu),在相當(dāng)長的一段時間都可以應(yīng)用于實(shí)踐當(dāng)中,為網(wǎng)絡(luò)結(jié)構(gòu)升級換代提供了更加充分的時間。缺點(diǎn)就是需要借助第三方的幫助,增加了設(shè)備購置的成本,也增加了管理的成本,同時還增加了安全風(fēng)險。
[1]Jennigs C. NAT Classification Results using STUN. IETF Internet Draft. October 2004.
[2]RFC5389 Session Traversal Utilities for NAT (STUN). J. Rosenberg, R. Mahy, P. Matthews, D. Wing. October 2008.
[3]BEHAVE-NAT MacDonald, D. and B. Lowekamp, "NAT Behavior Discovery Using STUN", Work in Progress, July 2008.
[4]BEHAVE-TURN Rosenberg, J., Mahy, R., and P. Matthews, "Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)", Work in Progress, July 2008.
[5]Jeffrey L. Eppinger. TCP connections for P2P apps: A software approach to solving the NAT problem. Technical Report CMUISRI-05-104, Carnegie Mello University. January 2005.
[6]Andrew Biggadike, Daniel Ferullo, Geoffrey Wilson, and Adrian Perrig. NAT BLASTER: Establishing TCP connections between hosts behind NATs. In ACMSIGCOMM Asia Workshop, Beijing China. April 2005.
[7]RFC2988 Computing TCP's Retransmission Timer. V. Paxson, M. Allman. November 2000.