看过很多文章说 QQ 使用的是 udp 协议,其实不完全是 udp 协议,也包括 tcp 和 http/https 协议,只是不同的业务场景使用的协议不一样。我之前做过一个即时通讯软件,用的是基于 tcp 的异步通信框架 netty,后面的文章会讲解。我们知道 udp 是不需要建立连接的,所以速度快,但是它不能保证数据能否送达,那么 qq 使用 udp 是如何保证不丢消息,以及消息发送状态的呢,接下来让我们来了解下。
目录:
udp 简介udp 与 tcp 对比udp 的应用场景QQ udp 浅析Telegram 端对端加密
1. udp 简介
udp 和 tcp 一样,位于七层模型的传输层,下层使用 ip 协议传送数据报。它提供的是面向事务的简单不可靠信息传送服务,是一种无连接的协议。udp 报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为 udp 协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序。
2. udp 与 tcp 对比
1. tcp 面向连接,需要三次握手,四次挥手。udp 是无连接的,即发送数据之前不需要建立连接,直接丢过去。2. tcp 提供可靠的服务,通过 tcp 连接传送的数据,无差错、不丢失、不重复,且按序到达。udp 尽最大努力交付,即不保证可靠交付。3. tcp 面向字节流,实际上是 tcp 把数据看成一连串无结构的字节流。udp 是面向报文的,udp 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低 (对实时应用很有用,如 IP 电话,实时视频会议等)。4. 每一条 tcp 连接只能是点到点的,udp 支持一对一,一对多,多对一和多对多的交互通信。5. tcp 首部开销20字节,udp 的首部开销小,只有8个字节。6. tcp 的逻辑通信信道是全双工的可靠信道,udp 则是不可靠信道。
基于第2点,可靠性,解释下:
tcp 协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与 tcp 不同,udp 协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。相对于 tcp 协议,udp 协议的另外一个不同之处在于如何接收突发性的多个数据报。不同于 tcp,udp 并不能确保数据的发送和接收顺序。例如,一个位于客户端的应用程序向服务器发出了以下4个数据报:
a b c d
但是 udp 有可能按照以下顺序将所接收的数据提交到服务端的应用:
d a c b
事实上,udp 协议的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。
基于第3点,tcp把数据看成一连串无结构的字节流,解释下:
tcp 有一个缓冲,当应用程序传送的数据块太长,tcp 就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,tcp 也可以等待积累有足够多的字节后再构成报文段发送出去。
3. udp 的应用场景
在选择使用协议的时候,选择 udp 必须要谨慎,在网络质量令人十分不满意的环境下,udp 协议数据包丢失会比较严重。但是由于 udp 的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用udp 较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的 ICQ 和 QQ 就是使用的udp 协议。直播中也可以用 udp,感兴趣的同学可以看看这篇文章:RTMP、WebRTC、UDP 三种互动直播方案的优劣比较
4. QQ udp 浅析
首先每一个 QQ 客户端实际上都适合服务器交互,再由服务器转发给正在通信的用户,如果每一个 QQ 从一上线到下线的这段时间全部采用 tcp 长连接,这对服务器的负担很大,而如果采用 tcp 短连接,频繁的连接断开也会造成网络负担,而采用 udp 则可以避开上述麻烦,减少服务器的负担。
不管 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 协议发回一个应答包,如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到"消息发送失败"但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。
QQ 并不是端对端的聊天软件,是得经过服务器转发消息的,通过 QQ 聊天,数据是 A 发到服务器,服务器再转发到 B。
5. Telegram 端对端加密
著名的开源 IM 软件 Telegram,基于端对端加密技术,个人觉得无论是从体验还是从技术上讲,都比国内 IM 强,而且就是纯粹的聊天软件,没有多余功能。Telegram android git 链接:https://github.com/DrKLO/Telegram
端对端加密:
我们可以将端到端加密 (E2EE) 视作一种目前比较安全的通信系统。在这个系统中,只有参与通信的双方用户可以读取通信数据。不仅网络犯罪分子无法窃听到这种通信信息,甚至连互联网服务提供商、通信服务提供商、以及电信服务提供商都无法获取到这类通信数据。除此之外,端到端加密还可以防止攻击者轻易地获取到用于解密通信会话的加密密钥。这种通信系统可以有效地防止攻击者对用户的通信数据进行拦截或窃听,而且如果攻击者想要篡改通信内容的话,几乎也是一件不太可能完成的任务。这也就意味着,那些在文字聊天服务中采用了端到端加密的公司无法将客户的聊天内容转交给某些特殊的情报机构。所以在中国,这种软件肯定难以存活,因为上层原因,和区块链是一样的,不能被监管。