成功进行了一次UDP打洞
本次测试参数:
服务端是公网固定IP;两个客户端A和B分别位于不同电脑,不同宽带,不同型号路由后面(一个家庭路由,一个企业路由),且路由没有经过特别的设置。
测试没有什么特别的地方,只是依照网络资料进行实验。如下图:
说明:
当A端用UDP向服务端发送了一个包后,在服务端就得到A端来路的IP和端口:xxx.xxx.xxx.101:5841
当B端用UDP向服务端发送了一个包后,在服务端就得到B端来路的IP和端口:xxx.xxx.xxx.105:12584
这时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为主,可以说马化腾当时的设计是激进而大胆的。
模仿并不意味着追随和落后,重要的能够在一个旧框架下注入新的思维。这也应该是马成功的必然性之一吧。
最新文章
- Ionic2系列——使用DeepLinker实现指定页面URL
- sql数据库表被锁,无法查询
- linux中用户、组的管理(密码管理、权限管理及其修改用户、组)(转)
- ios获取一个文件夹下的文件(夹)列表
- Windows Internals学习笔记(三)Procdump的使用
- [USACO精选] 第二章 动态规划(一)
- strlen() 和 sizeof() 在字符串中的使用
- js 前加分号和感叹号是什么意思?
- 设计模式之单例模式(Singleton Pattern)
- Codevs 3289 花匠 2013年NOIP全国联赛提高组
- TCP/IP 邮件的原理
- MVC插件实现
- java 导出blob图片到excel
- BZOJ2565: 最长双回文串(回文树)
- 测试修改gcs_server_processes参数
- JAVA 数组作为方法返回值—返回地址
- GMT\UTC YYYY-MM-DDTHH:mm:ss.sssZ、YYYY-MM-DDTHH:mm:ss.sss+8:00意义及与北京时间转换
- 转://Oracle中定义者权限和调用者权限案例分析
- 【SRM-06 D】五色战队&;&;【codeforces 788E】 New task
- 洛谷P1315 观光公交