成功進行了一次UDP打洞


測試環境:
服務端是公網固定IP;兩個客戶端A和B分別位於不同電腦不同寬帶不同型號路由(一個家庭路由,一個企業路由),且路由沒有經過特別的設置。
測試沒有什么特別的地方,只是依照網絡資料進行實驗。

說明:
當A端用UDP向服務端發送了一個包后,在服務端就得到A端來路的IP和端口:xxx.xxx.xxx.101:5841
當B端用UDP向服務端發送了一個包后,在服務端就得到B端來路的IP和端口:xxx.xxx.xxx.105:12584

*上面的IP和端口獲取方式,C#用socket.RemoteEndPoint,VB的Winsock控件用RemoteHostIP和RemotePort屬性

這時A、B兩端的路由就相當於是打開一個通道來給A、B向外通信。不光是服務端可以和A、B通信,由於通道已經打開了,那么:
A就可以向B已經打開的通道(B=xxx.xxx.xxx.105:12584)直接發送信息。
同理:
B也可以向A已經打開的通道(A=xxx.xxx.xxx.101:5841)直接發送信息。

*貌似A、B之間通信有一個先后順序,我忘記了~,反正都發送試試就行了

最后:UDP通信在一些情況下比TCP要“靈敏”一些(可能用詞有點不妥,我也不知道該怎么形容)。
比如有的時候寬帶已經撥號成功了,TCP卻怎么都連接不上服務器,瀏覽器打開網頁也一樣,要等很久的時間后TCP才能正常通信。
而在TCP不能連接的這段時間,UDP卻是正常的。
但是使用UDP絕對不是一個省心的活:

 

--需要設計一套合理的通訊包協議
--數據不是有序的,分別發送幾個數據包,有可能先發的數據后到
--有丟包的可能,對信息完整性要求高的話,還需要重發處理
--由於是無連接協議,要自己考慮心跳包通知在線狀態判別
--對適應性要求高的需要配合TCP交叉使用

現在的網絡環境都比較好,UDP發送的成功率能達到98、99%,甚至更高吧(我沒有做足夠大量的測試,只是感覺)。

在當時復雜,不穩定的網絡環境下,QQ竟然選擇以UDP為主要的通信協議,而同期的ICQ和MSN等都以TCP為主,可以說馬化騰當時的設計是激進而大膽的。
模仿並不意味着追隨和落后,重要的能夠在一個舊框架下注入新的思維。這也應該是馬成功的必然性之一吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM