測試環境:
服務端是公網固定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為主,可以說馬化騰當時的設計是激進而大膽的。
模仿並不意味着追隨和落后,重要的能夠在一個舊框架下注入新的思維。這也應該是馬成功的必然性之一吧。