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