为啥QQ主要用UDP协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥QQ主要用UDP协议相关的知识,希望对你有一定的参考价值。

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

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

采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。大家都知道,UDP 协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是,作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。

很多人提到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也应用在很多跨运营商、跨地域、跨机房之间的服务调用当中。原因无它,就是网络烂到一定程度

winsock控件的TCP和UDP协议的判断问题

想用VB的winsock控件来编写一个局域网上网代理的程序,对于IE上网的问题已经解决,但QQ上网却不知道如果下手,听说QQ是用UDP协议的,问题是程序接收到上网软件的信息时如何判断是TCP协议还是UDP协议呢?TCP和UDP在上网信息有没有什么区别?
初学VB请高手们指点。
假如没有识别方法,那么从原理上讲,用winsock是否可以实现QQ的代理功能呢?请高手指点。

TCP和UDP协议相差挺大的。UDP代理相对,简单些,TCP难些。
QQ登陆器的设置可以选择 不使用高级协议/UDP/TCP 三种方式。。
不过没研究过有什么不同

我想 实现 局域网上网代理 有两种途径可以走。

1:底层直接转发其数据包(那么你台电脑就其一个网关作用),这种达到的话,你电脑的程序都能代理了。(vb的winsock应该无此能力,不知道我们的系统是不是有这项设置)
2:重建连接,在服务上实现(具体问题具体分析吧)
参考技术A TCP和UDP协议相差挺大的。UDP代理相对,简单些,TCP难些。
QQ登陆器的设置可以选择 不使用高级协议/UDP/TCP 三种方式。。
不过没研究过有什么不同

我想 实现 局域网上网代理 有两种途径可以走。

1:底层直接转发其数据包(那么你台电脑就其一个网关作用),这种达到的话,你电脑的程序都能代理了。(vb的winsock应该无此能力,不知道我们的系统是不是有这项设置)
2:重建连接,在服务上实现(具体问题具体分析吧)

代理这个没具体研究过,如果可以我们也交流交流--Q--271562312
参考技术B TCP 和UDP的包头是不一样的 QQ的UDP 提空不可靠地传输,但是速度比较快,对于你的程序,我也不懂VB 但是winsock的话 用高有专用识别UDP报头的函数的 用MSDN找一找 参考技术C 怎么可能判断...
winsock根本没这么高级的功能
参考技术D 恩,QQ这种,用UDP就可以了,UDP是无连接的,用的时候直接用就可以了,用TCP的话,要管理很多链接很麻烦。如果你要区分具体的内容,可以自己定义一下数据传输协议,
WinsockC.Protocol = sckUDPProtocol
这样用就OK

以上是关于为啥QQ主要用UDP协议的主要内容,如果未能解决你的问题,请参考以下文章

网络基础:TCP协议UDP协议均属于传输层协议;TCP和UDP协议有何不同?

QQ 为什么以 UDP 协议为主,以 TCP 协议为辅?

winsock控件的TCP和UDP协议的判断问题

QQ是一个基于TCP/UDP协议的通讯软件

为啥 DNS 使用 UDP 作为传输层协议?

qq协议 0825 和 0836 udp 登录包解析