默认
发表评论 44
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
为什么QQ用的是UDP协议而不是TCP协议?
阅读(496238) | 评论(44 收藏26 淘帖2 5
1金币
网上找到的资料都是说QQ用的是UDP协议,但计算机网络里还有各种资料都提到它的不可靠性,请问有人知道原因吗,新手求解答!

最佳答案

查看完整内容

先问是不是,再问为什么? QQ既有UDP也有TCP! 不管UDP还是TCP,最终登陆成功之后,QQ都会有一个TCP连接来保持在线状态。这个TCP连接的远程端口一般是80,采用UDP方式登陆的时候,端口是8000。 UDP协议是无连接方式的协议,它的效率高,速度快,占资源少,但是其传输机制为不可靠传送,必须依靠辅助的算法来完成传输控制。QQ采用的通信协议以UDP为主,辅以TCP协议。由于QQ的服务器设计容量是海量级的应用,一台服务器要同时容 ...
标签:即时通讯
上一篇:关于类似android版微信的后台Service常驻或保活的疑问?下一篇:完全自已开发的IM该如何设计“失败重试”机制?

本帖已收录至以下技术专辑

推荐方案
评论 44
先问是不是,再问为什么?
QQ既有UDP也有TCP!
不管UDP还是TCP,最终登陆成功之后,QQ都会有一个TCP连接来保持在线状态。这个TCP连接的远程端口一般是80,采用UDP方式登陆的时候,端口是8000。

UDP协议是无连接方式的协议,它的效率高,速度快,占资源少,但是其传输机制为不可靠传送,必须依靠辅助的算法来完成传输控制。QQ采用的通信协议以UDP为主,辅以TCP协议。由于QQ的服务器设计容量是海量级的应用,一台服务器要同时容纳十几万的并发连接,因此服务器端只有采用UDP协议与客户端进行通讯才能保证这种超大规模的服务。

QQ客户端之间的消息传送也采用了UDP模式,因为国内的网络环境非常复杂,而且很多用户采用的方式是通过代理服务器共享一条线路上网的方式,在这些复杂的情况下,客户端之间能彼此建立起来TCP连接的概率较小,严重影响传送信息的效率。而UDP包能够穿透大部分的代理服务器,因此QQ选择了UDP作为客户之间的主要通信协议。

采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。大家都知道,UDP 协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是,作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。
某次架构师大会上那个58同城做即时通信的人说:原因是因为当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用了udp,然后在udp上面封装了一下,模拟了一下tcp,解决了大并发的问题,之后因为做的很nb了,虽然epoll这种技术出现了,还是没有改回使用tcp了.现在再做类似的东西就不需要使用udp了.
这个说法应该比较可信的.
即时通讯时效性要求高,用TCP维持多人同时在线是个问题[1], 涉及到服务器数量,系统调优,编程手段等很多方面。记得QQ服务器最初只有一台,还是Windows。我不会Windows开发,可以等哪位Window开发老手讲下在Win 98的winsock接口下用什么手段能开发出支持高并发的服务器出来,难度多大。

即使是UDP协议,完全通过服务器中转、信息传输加密(用户到服务器之间的,= =)、保存聊天内容协助警方等都是钱多用户傻之后的事了。次早期的QQ官方客户端提供了默认不勾选的“通过服务器中转”选项,可见那时信息还是允许客户端和客户端之间直接发送的。

至于UDP穿墙之类的优势,国内最常见的NAT共享网络又不会影响客户端主动发起TCP链接,应该不是使用UDP的主要原因。
登陆采用TCP协议和HTTP协议,你和好友之间发送消息,主要采用UDP协议,内网传文件采用了P2P技术。总来的说:
1.登陆过程,客户端client 采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。
2.和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。
3.如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。
很多人提到keepalive,TCP无法感知网络中断这些问题。。。这个算是TCP一个容易踩的坑,但这并不能说明UDP就比TCP好(或者说解释为何要使用UDP)。因为在UDP上面一样需要面对这些问题,而解决这类问题的方法和在TCP上面进行应用层心跳的方法其实没有本质上的区别。而这就是为什么没有接触过这类问题的人会有题主提出的疑惑。

那么为什么呢?最本质上UDP的优势还是带宽的利用。这一切要回归到99~03年的网络状况,当时网络的特点就是接入带宽很窄而且抖动特别厉害。所谓抖动可能是多方面的,例如延时突发性地暴增、也有可能是由于路由层面的变化突然导致路由黑洞,还各种等等等等的问题。TCP因为拥塞控制、保证有序等原因,在这种网络状态上对带宽的利用是非常低的。而且因为网络抖动的原因,应用层心跳超时(一般不依靠keepalive)应用层主动断掉socket之后TCP需要三次握手才能重新建立链接,一旦出现频繁的小抖动就会使得带宽利用更低。而等待四次挥手的时间,也会占用服务器上宝贵的资源。

总结来说,当网络差到一定程度了,TCP的优势反而会成为劣势。

这时候我们再看看UDP在这种情况下的表现。使用UDP对抗网络抖动,说到底就是在应用层比TCP更快地探测和重传,一旦超过一定的时间没有收到回复,客户端可以选择马上重试或者换一个IP:PORT重试(假如你的服务像QQ一样有多个接入),在服务器端则可以果断地断掉socket。而可以应用UDP的时候,往往是你的应用层协议本身已经具备了一定的面向连接的特性。如果你应用层的协议已经达到了一定程度的消息幂等,客户端可以几乎无脑地进行重传,这样就可以尽可能地降低网络抖动的影响,同时也可以尽可能地利用整个带宽。而刚好QQ的协议,就具备类似的特点。

简单来说就是我们可以使用UDP实现一个面向连接协议,这个协议可以很好地适应当时的网络状况和QQ本身的业务。但凡事都有成本,成本就是你的应用层协议本身需要去实现抵抗网络异常带来的问题。例如乱序、例如业务数据的分片和重组、例如网络状态探测等等等等。。。

而现在UDP也应用在很多跨运营商、跨地域、跨机房之间的服务调用当中。原因无它,就是网络烂到一定程度了。

评分

2

查看评分

UDP才是最基础的协议,对于QQ这样级别的应用来说,TCP有诸多不便和限制,你可以认为QQ用的UDP其实是符合QQ的要求的一个升级版协议,根据自己的产品逻辑增加了很多TCP的特性比如丢包重发机制。
另外,QQ应该是优先采用UDP协议,如果不通的话会自动转为TCP
我在等积分满了去下载,话说这个网站真的不能直接充值么
引用:chylhzk 发表于 2016-10-09 14:09
我在等积分满了去下载,话说这个网站真的不能直接充值么

暂时不能。。
最佳答案说的很详细啊,谢谢~
签名: 。。。。。。。。。。。
mark
签名: 该会员没有填写今日想说内容.
mark
签名: 样样精通
赞啊 学习到不少东西。
不错
mark
赞啊 学习到不少东西。
签名: ········
那么现在有没有单纯使用tcp做的呢
引用:hailianghuang 发表于 2016-05-03 21:10
很多人提到keepalive,TCP无法感知网络中断这些问题。。。这个算是TCP一个容易踩的坑,但这并不能说明UDP就 ...

涨知识了,灰常感谢
签名: 大家早上好,鸿蒙系统
我也攒点积分
学习了
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部