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