Udp打洞,判斷Nat網(wǎng)絡(luò)類型
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
一種基于UDP協(xié)議實(shí)現(xiàn)P2P智能穿越NAT的方案
摘 要: 由于目前NAT (Network Address Translation ,網(wǎng)絡(luò)地址轉(zhuǎn)換協(xié)議)的廣泛運(yùn)用,處于Internet上的公網(wǎng)主機(jī)與處于 NAT之后的主機(jī)建立對等連接是實(shí)現(xiàn) P2P (Peer - To - Peer ,點(diǎn)對點(diǎn)) 通信很關(guān)鍵的問題。本文在分析了基于 UDP(User Datagram Protocol ,用戶數(shù)據(jù)報(bào))協(xié)議穿透 NAT的實(shí)現(xiàn)原理的基礎(chǔ)上 ,給出了一個(gè)基于UDP協(xié)議,根據(jù)不同NAT類型情況自適應(yīng)選擇NAT穿越方案,實(shí)現(xiàn)P2P通信的實(shí)現(xiàn)方案。 關(guān)鍵詞:UDP, NAT,P2P 中圖分類號: TP273 1. 引 言 NAT技術(shù)不僅可以暫時(shí)解決IPv4中IP地址分配的限制,而且還可以隱藏內(nèi)部的網(wǎng)絡(luò)地址信息,使外界無法直接訪問網(wǎng)內(nèi)的網(wǎng)絡(luò)資源,保護(hù)了內(nèi)部網(wǎng)絡(luò),所以 NAT在防火墻中也得到了非常廣泛的應(yīng)用。基于以上原因,NAT在現(xiàn)有的網(wǎng)絡(luò)中是必不可少的[1]。 隨著 P2P技術(shù)的廣泛應(yīng)用,更多的網(wǎng)內(nèi)主機(jī)需要參與到 P2P網(wǎng)絡(luò)中來。由于 NAT的存在,局域網(wǎng)(私網(wǎng))IP地址在Internet上是不可見的,這也就造成了Internet上的主機(jī)不能主動(dòng)訪問NAT之后的主機(jī),而位于NAT之后的主機(jī)間更是無法相互識別和通信[2]。所以P2P網(wǎng)絡(luò)應(yīng)用必須解決穿透 NAT實(shí)現(xiàn)主機(jī)間相互發(fā)現(xiàn)、相互定位和相互尋址的關(guān)鍵技術(shù)。以建立起一個(gè)對等連接 ,進(jìn)行對等通訊。 2. UDP協(xié)議穿越NAT的原理及特點(diǎn) 2.1中繼轉(zhuǎn)發(fā)方式 這種方式是最簡單的,也是一種比較可靠的P2P通信方式。實(shí)現(xiàn)原理為位于兩個(gè)不同 NAT之后的兩臺主機(jī),都已經(jīng)各自發(fā)起 UDP 連接到一個(gè)眾所周知的、具有合法公網(wǎng) IP 地址的服務(wù)器上.以兩者間的通訊由服務(wù)器來中轉(zhuǎn)完成。 但是這種通信方式效率底下,消耗了服務(wù)器的處理能力和網(wǎng)絡(luò)帶寬, 同時(shí)主機(jī)之間的信息等待時(shí)間加長,且容納P2P用戶數(shù)有限。 2.2反向連接方式 這種方式僅工作在只有一個(gè)主機(jī)A在 NAT 后面,另外的主機(jī)B擁有合法公網(wǎng) IP 地址[2]。 在試圖建立一個(gè)直接到A 的連接失敗后,主機(jī)B 能夠通過服務(wù)器S來中轉(zhuǎn)一個(gè)請求到主機(jī)A ,使 A 發(fā)出一個(gè)“反向的”連接請求到主機(jī)B。主機(jī)A在收到這個(gè)要求后,開始發(fā)起一個(gè)到B的公網(wǎng)IP地址和端口號上UDP連接。這樣A與B就可以相互建立連接了。目前大部分的P2P系統(tǒng)都采用這種方式。 這種工作方式的主要局限性就是僅適合通訊點(diǎn)中的一方在NAT的后面。如果通訊點(diǎn)都在 NAT后面,那么這種方式就行不通了。因此反向連接不是一種通用的解決問題方法. 2.3UDP穿孔技術(shù) UDP穿孔技術(shù)(UDP Hole Punching)是根據(jù)建立好的 NAT 協(xié)議來允許 P2P 應(yīng)用程序“punch holes”(穿孔) 通過 NAT 和防火墻并且相互之間建立直接的連接技術(shù)[3]。以下考慮兩種情況典型情況——主機(jī)分別位于不同NAT后和主機(jī)位于相同NAT后。 2.3.1 主機(jī)位于不同NAT后面 如果兩個(gè)主機(jī)A和B都有私網(wǎng)IP地址并且位于不同的NAT后面。P2P 應(yīng)用程序運(yùn)行在主機(jī)A和B以及服務(wù)器S上。假設(shè)主機(jī)A想要與主機(jī)B直接建立一個(gè)UDP會話。那么B所在的NAT通常將會丟棄這個(gè)消息,因?yàn)樵吹刂泛投丝谔柵c和他所發(fā)起的外部會話建立連接的目的地址和端口號不匹配。類似的,B也我發(fā)主動(dòng)建立與A的連接。UDP穿孔的方式是:A發(fā)送UDP請求到B的公共地址,同時(shí)通過服務(wù)器S轉(zhuǎn)發(fā)一個(gè)消息到達(dá)B,消息內(nèi)容是要求B發(fā)送UDP請求到A的公共地址。A的請求直接到達(dá)B的公共地址的消息將會使得A所在的NAT在A的私有地址和B的公共地址之間建立一個(gè)新的通訊會話(即打一個(gè)孔),同時(shí)B的消息 (A通過S要求B發(fā)送的)到達(dá)A的公共地址將會使得B所在的NAT在B的私有地址和A公共地址之間建立一個(gè)新的通訊會話(也打了一個(gè)孔)[4]。一旦新的UDP會話在每一方向上都建立成功,那么主機(jī)A 和B就能夠相互直接通信而不再需要借助服務(wù)器S了。 2.3.2 主機(jī)位于相同NAT后面 兩臺主機(jī)處于相同NAT后,即雙方在同一私網(wǎng)內(nèi)的情況下。由于雙方并不知道這種情況,主機(jī)A如果需要連接主機(jī)B,仍然向B的外網(wǎng)地址發(fā)起連接請求,采用打孔方案進(jìn)行連接。只有在 NAT允許內(nèi)部的網(wǎng)絡(luò)主機(jī)能夠和內(nèi)部的其他主機(jī)進(jìn)行UDP會話的情況下連接也是可以實(shí)現(xiàn)的,但是顯然這種方式是完全沒必要的。同理,當(dāng)一臺主機(jī)位于NAT后,另一臺主機(jī)為公網(wǎng)地址時(shí),這種方式雖然可以建立直接連接,但仍然顯得過于麻煩[5]。 由此可見,在通信雙方同在相同NAT內(nèi)部,或只有一方在NAT內(nèi)部另一方在公網(wǎng)環(huán)境中時(shí),打孔方式效率較低下,增加了通信建立的反應(yīng)時(shí)間,而且還對服務(wù)器S產(chǎn)生不必要的額外負(fù)擔(dān)。 3. 一種自適應(yīng)的NAT穿越策略的方案 這種穿越策略的實(shí)現(xiàn),需要一臺具有公網(wǎng)地址的服務(wù)器,客戶端兩部分的支持。且此P2P應(yīng)用中的每一個(gè)用戶,都擁有一個(gè)唯一的標(biāo)識ID。 3.1服務(wù)器功能設(shè)計(jì) 穿越協(xié)助服務(wù)器包括三個(gè)服務(wù): 1)網(wǎng)絡(luò)類型監(jiān)測服務(wù)。此服務(wù)接收用戶請求并檢測此用戶的網(wǎng)絡(luò)類型,內(nèi)網(wǎng)/外網(wǎng)的IP、PORT信息,并將這些信息返回給用戶,以便用戶根據(jù)這些信息選擇策略。 2)查詢服務(wù)。如果某ID的主機(jī)已經(jīng)在此服務(wù)器上注冊過,則其他主機(jī)可以通過此ID,在服務(wù)器上查詢到該用戶的網(wǎng)絡(luò)信息。 3)轉(zhuǎn)發(fā)服務(wù)。此服務(wù)會根據(jù)已注冊用戶的信息,把某用戶的UDP包轉(zhuǎn)發(fā)給另一個(gè)用戶。轉(zhuǎn)發(fā)的消息包可以分為兩類:一類是穿越請求,此類請求用于協(xié)助主機(jī)間的NAT打孔。另一類是是轉(zhuǎn)發(fā)通信信息,當(dāng)所有直接建立UDP連接的嘗試失敗后,此服務(wù)可以轉(zhuǎn)發(fā)用戶的通信信息,建立用戶間間接的通信。 3.2客戶端自適應(yīng)的NAT穿越策略設(shè)計(jì) 假設(shè)在位置網(wǎng)絡(luò)環(huán)境下,某主機(jī)A需要與主機(jī)B建立P2P通信。首先,任意主機(jī)在啟動(dòng)時(shí)都與協(xié)助服務(wù)器進(jìn)行通信,獲取自身的網(wǎng)絡(luò)類型與地址信息,如果是在NAT內(nèi)部則得到的內(nèi)外網(wǎng)兩種地址信息,且始終保持和協(xié)助通信服務(wù)器的連接,以便接收服務(wù)器的消息。 自適應(yīng)穿越NAT實(shí)現(xiàn)P2P通信方案的流程如圖1所示: 圖1 自適應(yīng)NAT穿越策略流程圖 實(shí)現(xiàn)原理如下: 當(dāng)主機(jī)A得到與主機(jī)B建立連接的命令并得到其ID后,首先向協(xié)助服務(wù)器發(fā)出請求,詢問主機(jī)B所在的網(wǎng)絡(luò)類型與地址信息。查詢成功后主機(jī)A開始嘗試運(yùn)用策略嘗試與主機(jī)B建立直接連接: 1) 判斷主機(jī)B是否在NAT內(nèi)部,如果B不在NAT內(nèi)部,則無論A的網(wǎng)絡(luò)類型如何都可以直接向B發(fā)出連接請求,即便A在NAT內(nèi)部也不會影響直接通信的建立。 2) 如果主機(jī)B在NAT內(nèi)部,則主機(jī)A需要判斷自己所在的網(wǎng)絡(luò)類型,如果主機(jī)A不在NAT內(nèi)部則采用反向連接策略,主機(jī)A向服務(wù)器發(fā)送請求B反向連接的請求,服務(wù)器接到此請求后向主機(jī)B發(fā)送反向連接請求和主機(jī)A的地址信息,B收到服務(wù)器請求后,嘗試主動(dòng)與主機(jī)A進(jìn)行通信連接。 3) 如果主機(jī)A與主機(jī)B都在NAT內(nèi)部,這時(shí)需要判斷雙方是否處于同一NAT中,主機(jī)A比較自己與主機(jī)B的外網(wǎng)地址,如果地址相同則說明在同一NAT中,主機(jī)A直接向B的內(nèi)網(wǎng)地址發(fā)出連接請求即可[6]。 4) 如果雙方主機(jī)都在NAT內(nèi)部,且外網(wǎng)地址不相同,則說明A與B不在同一NAT中,需要使用NAT打孔技術(shù)。主機(jī)A向主機(jī)B發(fā)送連接請求的同時(shí),向服務(wù)器發(fā)出反向連接請求,并等待接收B的反向連接信息。 以上過程后,客戶端便完成了直接通信連接的嘗試,主機(jī)A等待B發(fā)送的連接確認(rèn)信息。如果接收到連接確認(rèn)信息,則證明直接連接建立成功,雙發(fā)開始P2P通信。如果主機(jī)A等待主機(jī)B的連接信息超時(shí),則證明NAT穿越失敗,雙方無法建立直接連接。雙方只能建立間接通信連接,主機(jī)A所有的通信消息都通過協(xié)助服務(wù)器轉(zhuǎn)發(fā)給主機(jī)B。 4. 結(jié)論 以上策略在建立連接的成功率和效率以及服務(wù)器開銷方面取得了較好的平衡,根據(jù)不同網(wǎng)絡(luò)特點(diǎn),動(dòng)態(tài)選擇連接策略。對每種情況,動(dòng)態(tài)選取最佳的連接方案。 目前,世界上有關(guān) P2P 的研究項(xiàng)目層出不窮 ,應(yīng)用也越來越廣。P2P身后所蘊(yùn)藏著無比的創(chuàng)造力是對P2P寄予厚望的原因所在。在可以預(yù)見的未來,隨著對P2P研究的進(jìn)一步深入和關(guān)注P2P的企業(yè)逐漸增多,P2P必將進(jìn)入一個(gè)飛速發(fā)展的新時(shí)期。 該文章在 2014/1/26 14:37:08 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |