成功进行了一次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为主,可以说马化腾当时的设计是激进而大胆的。
模仿并不意味着追随和落后,重要的能够在一个旧框架下注入新的思维。这也应该是马成功的必然性之一吧。

一路自学编程过来,时常一些闪光的文章点亮了孤身奋战的夜晚,那些默默分享的知识给了我巨大的帮助。所以开这个博客,致敬并传递这份分享精神,记录编程中的点滴心得。希望能帮助更多的人!
posted @ 2015-12-16 22:42  JustXIII  阅读(7863)  评论(0编辑  收藏  举报