魏紹亮 周廣平 王學(xué)慧
摘 要: NAT穿透技術(shù)能夠有效解決由于IP地址短缺和路由表增大造成的用戶接入困難的問題,可緩解因網(wǎng)絡(luò)地址的嚴(yán)重消耗造成的IPv4資源稀缺的情況。針對這種情況進(jìn)行了基于UDP協(xié)議的NAT穿透技術(shù)研究與仿真。首先分析NAT穿透的類型及各自的原理,提出對于NAT穿透相對有效的UDP打洞方案,然后通過穿透原理得出算法結(jié)構(gòu)流程,最后在VC++環(huán)境下進(jìn)行仿真實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明,該算法結(jié)構(gòu)能夠有效地實(shí)現(xiàn)NAT穿透目的,而且具有可拓展性,可在較多情況下適用。
關(guān)鍵詞: 網(wǎng)絡(luò)地址; NAT穿透; NAT類型; UDP打洞
中圖分類號:TP393.02 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-88228(2014)06-12-03
0 引言
NAT又名網(wǎng)絡(luò)地址轉(zhuǎn)換,在如今IP地址越來越稀缺的情況下產(chǎn)生,主要為了解決地址重用的問題。眾所周知,在TCP/IP協(xié)議中,有三個IP地址區(qū)域作為私有地址而被專門保留。
1 NAT分類
1.1 基本的NAT
由于內(nèi)網(wǎng)的IP地址不允許在網(wǎng)絡(luò)上出現(xiàn),內(nèi)部數(shù)據(jù)包的 IP地址需轉(zhuǎn)換后才能對外發(fā)送,所以在同一時(shí)間內(nèi),全子網(wǎng)內(nèi)只有小部分IP地址能夠?qū)?yīng)到外部全球惟一的IP地址[2]?;镜腘AT設(shè)備將會改變數(shù)據(jù)包中的原IP地址,但是不會改變數(shù)據(jù)包中相應(yīng)的端口數(shù)據(jù)。
1.2 NAPT
NAPT全名為網(wǎng)絡(luò)地址/端口轉(zhuǎn)換器,由其名稱可以看出凡是經(jīng)過此設(shè)備的IP數(shù)據(jù)包,不僅數(shù)據(jù)包內(nèi)的IP地址會被修改,而且數(shù)據(jù)包內(nèi)的TCP/UDP端口數(shù)據(jù)也會被修改。它可允許內(nèi)網(wǎng)多個計(jì)算機(jī)對應(yīng)一個全球惟一的IP地址[3]。由于端口修改的方法不同,因而又可分為圓錐型和對稱型兩種。
⑴ Cone NAT(圓錐型)
在一個客戶機(jī)(擁有私有地址與端口號)與另一個客戶機(jī)(擁有公有地址與端口號)建立端口映射之后,只要是當(dāng)前仍然存在會話在利用此端口映射,那么它就可以用這個端口映射繼續(xù)處理后續(xù)的會話。然而,當(dāng)位于NAT后的主機(jī)與外網(wǎng)的主機(jī)建立連接之后,NAT接受外部連接的自由程度是不同的,由此可以把此類型進(jìn)一步分類。但是要注意這個分類一般只適用于UDP傳輸,因?yàn)閷τ赥CP連接,只有在有專門的配置情況下才會建立。Cone NAT分類之后為下面三種情況。
① Full Cone NAT(完全圓錐型)
2 NAT穿透原理分析
若想用軟件實(shí)現(xiàn)NAT技術(shù),一種方法是通過擴(kuò)展應(yīng)用層協(xié)議,使其具有NAT路由的功能;另一種方法則是把應(yīng)用層協(xié)議中的私有地址直接修改為公網(wǎng)地址。但是,由于NAT類型的不同,通過修改應(yīng)用層協(xié)議地址[4]的方法并不能通用,尤其當(dāng)是Symmetric NAT類型的時(shí)候,其預(yù)先獲得的公網(wǎng)地址與實(shí)際轉(zhuǎn)換后的公網(wǎng)地址有可能不相同[5]。
NAT穿透需要分析下面三種情況。首先,雙方都是Symmetric NAPT。此情況由于端口號分配的不同,不支持穿透。其次,雙方都是Cone NAPT。這種情況是我們所期望的,可以進(jìn)行穿透。最后,兩方分別是Symmetric NAPT和Cone NAPT。這種情況稍復(fù)雜些,假設(shè)A是Symmetric NAT,B是Cone NAT,由文獻(xiàn)分析[6]可知,不管是A先連接B還是B先連接A,在一方的NAT接收到數(shù)據(jù)包后,由于查詢自己的映射表無法找到相對應(yīng)映射項(xiàng)而會將包丟棄,從而導(dǎo)致連接失敗。
因此,根據(jù)上述分析可以得出,只有當(dāng)連接兩端的設(shè)備都為Cone NAT的情況下,才能實(shí)現(xiàn)基于UDP協(xié)議的內(nèi)網(wǎng)穿透。
3 UDP打洞技術(shù)
當(dāng)前發(fā)展較快的穿透技術(shù)是一種借助于公網(wǎng)服務(wù)器來完成NAT穿透的技術(shù),稱為Hole Punching技術(shù)[7]。此技術(shù)屬于一種中繼方案,主要用來解決通信兩端都在NAT設(shè)備之后的情況,如今這類情況比較常見。與其他解決方案相比,此技術(shù)比較簡單通用,穿透原理如圖5所示。
從圖5可以看出,客戶機(jī)A和客戶機(jī)B(下面簡稱A和B)分別向服務(wù)器S注冊,因此服務(wù)器知道了它們的私網(wǎng)地址和轉(zhuǎn)換后的公網(wǎng)地址。在A希望與B建立連接時(shí),A會先向服務(wù)器S發(fā)送連接請求,服務(wù)器S會把B的公網(wǎng)、私網(wǎng)的地址都返回給A,同時(shí)還會把A的連接請求和A的公網(wǎng)與私網(wǎng)地址發(fā)給 B。至此A和B都能知道彼此的公、私網(wǎng)地址。可知A、B與服務(wù)器之間的通訊僅僅是為了打開通往服務(wù)器的通道,并通過不斷發(fā)送消息保持通道的存在。
接下來,當(dāng)A得知B的公網(wǎng)、私網(wǎng)地址后,A會同時(shí)向這兩個地址發(fā)起連接。如果A和B同在一個NAT之后,B會先在私網(wǎng)地址上收到A的連接請求,這樣A與B之間的通訊就不會有NAT的介入;而如果A和B處在不同NAT之后,那么A發(fā)往B私網(wǎng)地址的連接將會無法路由或者被錯誤路由到不相關(guān)的終端,從而被丟棄,而A發(fā)往B公網(wǎng)地址的連接會順利到達(dá)B所在的NAT。同樣,在B得知A的公網(wǎng)、私網(wǎng)地址之后也會發(fā)起連接,情況與A相同。
此時(shí),A和B前的NAT設(shè)備已經(jīng)記住了對方的IP地址和端口信息,對彼此處于敞開狀態(tài),即被在內(nèi)部打洞,因此可建立新的對話,建立連接。由于發(fā)送的連接數(shù)據(jù)包都為UDP包,因此被稱為UDP打洞技術(shù)。而且,建立連接之后,雙方的NAT還可以作為中介將對方“介紹”給其他設(shè)備[8],從而降低S的工作量。
綜上所述,Hole Punching技術(shù)是通過公網(wǎng)Server保存的地址從而使客戶機(jī)之間能夠直接通信。但是,Server只幫助建立連接,而在建立連接之后就不會再介入了。
4 編程測試
既然上述基于UDP協(xié)議的穿透主要是靠公網(wǎng)服務(wù)器作為連接中介,那么,通信協(xié)議是必不可少的。根據(jù)上節(jié)所述的穿透原理可編寫通信協(xié)議。我們需要自定義以下幾種STRUCT:Client登錄時(shí)向服務(wù)器發(fā)送的消息格式、Client注銷時(shí)發(fā)送的消息格式、Client向服務(wù)器請求另外一個Client向自己方向發(fā)送UDP打洞消息格式、Client向服務(wù)器發(fā)送的消息格式、客戶節(jié)點(diǎn)信息格式、Server向Client發(fā)送的消息格式、客戶端之間發(fā)送消息格式。
關(guān)于所編寫的Server部分,由穿透原理可知,Server端主要負(fù)責(zé)兩件事,一是循環(huán)讀取客戶機(jī)登錄和注銷消息,并記錄客戶列表;二是循環(huán)轉(zhuǎn)發(fā)客戶P2P連接請求。這里要注意的是,我們應(yīng)事先定義一個循環(huán)最大值(MAXC),防止丟包之后進(jìn)入無限死循環(huán),下面的Client部分也一樣。Client端則主要有三部分:第一,登錄服務(wù)端,并接收服務(wù)器端發(fā)送的已登錄消息;第二,向外網(wǎng)IP發(fā)送消息,若發(fā)送超時(shí),則發(fā)送一個請求打洞信息到服務(wù)器端,此過程循環(huán)(MAXC)次;第三,循環(huán)讀取當(dāng)前服務(wù)器用戶。
我們選用Visual C++6.0作為編程環(huán)境,進(jìn)行此穿透實(shí)驗(yàn)的仿真實(shí)驗(yàn)。
5 實(shí)驗(yàn)運(yùn)行結(jié)果
由于此程序只是為了實(shí)現(xiàn)穿透通信,因此功能并不是很完善。部分源程序參考相關(guān)資料改編。首先需運(yùn)行服務(wù)器端,如圖6所示,由圖6可見,服務(wù)器端可以將已登錄用戶記錄在案,中轉(zhuǎn)連接功能則由后臺運(yùn)行。
由于編程條件的限制,現(xiàn)將服務(wù)器端與兩個客戶機(jī)端在同一臺電腦上運(yùn)行,因此要指向的服務(wù)器IP為同一個地址。將客戶機(jī)端分別命名為11和22,先模擬登錄客戶端主機(jī)11,然后模擬登錄客戶端主機(jī)22,所發(fā)送信息為“hello!”,兩個客戶機(jī)端的運(yùn)行結(jié)果分別如圖7、圖8所示。
由圖7、圖8可見,兩個客戶端主機(jī)已連接成功,并且發(fā)送的信息也已送達(dá)目的客戶機(jī)。
根據(jù)此實(shí)驗(yàn)結(jié)果分析,UDP穿透的目的已經(jīng)達(dá)到。根據(jù)多次實(shí)驗(yàn)分析,由于客戶端主機(jī)運(yùn)行背景不同,同一局域網(wǎng)內(nèi)可能需要在路由器端開通端口映射功能。
6 結(jié)束語
本文淺析了NAT的相關(guān)分類以及基于UDP協(xié)議穿透NAT的相關(guān)技術(shù),并根據(jù)研究結(jié)果將其進(jìn)行編程實(shí)現(xiàn)。該程序主要是根據(jù)UDP打洞技術(shù)來實(shí)現(xiàn)有關(guān)NAT穿透的基本功能,程序具有一定的適應(yīng)性(針對Cone NAT),若結(jié)合硬件設(shè)施,可實(shí)現(xiàn)遠(yuǎn)程操控,因此有擴(kuò)展開發(fā)空間。NAT穿透技術(shù)涉及很多內(nèi)容,就傳輸層的穿透而言,本文只限于UDP協(xié)議,但就實(shí)際而言是不夠的。目前網(wǎng)絡(luò)上使用最多的傳輸層協(xié)議是TCP協(xié)議,而在實(shí)際應(yīng)用中,基于TCP協(xié)議的穿透比基于UDP協(xié)議的穿透復(fù)雜的多。綜上所述,本文所研究的NAT穿透技術(shù)還有待進(jìn)一步開發(fā)與完善。
參考文獻(xiàn):
[1] 余以勝.P2P網(wǎng)絡(luò)的NAT穿越技術(shù)研究[J].微型電腦應(yīng)用,2012.1:34-36
[2] 張靜頤,趙雪巖,陳愛網(wǎng).基于NAT穿透P2P即時(shí)通訊系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電子設(shè)計(jì)工程,2011.7:96-98
[3] 杜經(jīng)緯,王春紅.在P2P網(wǎng)絡(luò)環(huán)境下基于UDP協(xié)議穿越NAT的研究[J].吉林師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2012.1:93-94
[4] 劉健,周仲文,劉洋.基于P2P的TCP穿透NAT技術(shù)研究[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2011.3:40-41
[5] Guha S, Francis P. Characterization and Measurement of TCPTaversal through NATs and Firewalls [EB/0L].http://nutss.gforge.cis.cornell.edu/pub/imc05-tcp nat.pdf.
[6] 孔令旺.NAT技術(shù)及應(yīng)用淺析[J].科技資訊,2011.32:26-26
[7] 張知青,王碧玉.淺談網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)的三種方式[J].中小企業(yè)管理與科技(上旬刊),2011.10:206-207
[8] 劉澤陽,徐武平.P2P應(yīng)用中一種多層NAT穿透解決方案的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2011.7:1980-1983