兼具高效与易用,融云 IM 即时通讯长连接协议设计思路

484 阅读7分钟

无论是 PC 端还是移动端,接入网络实现通信都需要建立双端的连接。关注【融云全球互联网通信云】了解更多

客户端和服务端建立连接后不断开,然后进行通信(也就是发送报文)的方式就是长连接。与之相反,短连接是创建一个连接,在程序执行完毕后,就会自动断掉。

二者相比,短连接会频繁地创建和释放连接,比较耗费资源。长连接就可以避免每次请求都创建连接的开销,节省了时间和消耗,提高了性能。

本文梳理自 8 月 2 日的“IM 进阶实战高手课”内容,通过分析对比常见长连接协议、长连接协议的演进过程来拆解长连接协议设计要点,及融云的最佳实践。

长连接常见问题

安全性

首先是传输上的安全性,数据传输时需要经过通道层及应用层的加密,如 IPSec、TLS、PB 等。其次,还需保证数据的实效性,具备防重放的特性。类似 5G 终端的认证是通过 SQN 带上时间戳进行矢量校验,保证数据的完整性和加密性。

最后会进行异常客户端的检测,通过动态认证密钥,保证客户端是可信的。 微信图片_20220824140545.jpg (长连接安全性)

可靠性

包括连接保持、快速重连和消息可达。主要通过心跳保活、弱网处理、就近接入等进行连接保持,设计快速认证重连策略实现低开销,并由 QoS 质量保障确保消息可达。 微信图片_20220824140553.jpg (长连接可靠性)

低开销

低开销最根本的就是保证协议包体的大小合适,减少流量消耗,以及在解析协议包的时候,减少电量消耗。并且,在应用及数据存储上减少资源的消耗,以获得更高的吞吐量和接入数。 微信图片_20220824140557.jpg (长连接低开销)

长连接协议设计要点

长连接协议的设计要点,其实就是主要围绕如何做到低开销、安全性、可靠性以及协议的扩展性、完备性展开的。 微信图片_20220824140601.png (长连接协议设计要点)

业界常见的长连接协议如下: 微信图片_20220824140605.png 我们详细看看其中常用的几种,SIP 是一个文本协议,支持 TCP、UDP、IPSec,比较符合国际规范,主要的应用领域是在电信领域如手机短信、手机音视频通话、5G 消息(RCS)、SIP 话机、话务台,它的协议设计规范和业务规范都是咱们可以去参考的。

XMPP 是一个文本协议,通过 XML 传输,具备一定的通信协议规范,易读性比较高,主要应用在即时通讯系统、游戏平台、协作空间以及语音和视频会议系统。这个协议的冗余系数特别高,会带来比较大的流量消耗。

MQTT 是一个开放消息协议,简单易实现。采用发布订阅模式,一对多消息发布。基于 TCP/IP 网络连接,提供有序、无损的双向连接。相较于上面两种协议,它的协议包体特别小。1 字节固定报头,2 字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。

MQTT 协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。

接下来咱们看一下这几种协议一般在哪些场景或者层次上应用。 微信图片_20220824140609.png 首先手机连网后如果要打电话,会通过 GTP 发送通话或者音视频相关的数据信息。如果需要调用像运营商等技术能力,会通过类似于 XMPP 或者 SIP 去调一些开发能力。在搭建云平台的时候,需要有长连接通道,一般会有导航或者配置服务去下发地址,然后通过这个地址连上长连接服务。业务的内部通信,一般通过 RPC 进行,比如单聊、群聊、聊天室和超级群。

如果要将这些能力开放出来,就需要有一个开放网关,针对长连接的一些技术做能力开放。

整体而言,常见协议的扩展性和完备性是相反的。

SIP 主要应用在电信领域,它的完备性或者标准业务的设计规范比较高,与此相应,它的扩展性会相对不足。

XMPP 虽然本身协议的开销比较大,但是它的业务接口规范以及逻辑模型是可以参考的。

MQTT 协议的开销比较少,但是它整个上层业务的架设并不是特别丰富。

从演进历史的角度看,网络演进基本上是 10 年一个迭代,每个阶段都会催生不同的应用。

为了解决不同阶段的相应需求问题,传输层协议的演进也有其阶段性。 微信图片_20220824140613.jpg UDP 和 GDP 的产生基本上是在相同的时间,分别保证传输的速率和可靠性。SCTP 是保证可靠的同时,又保证吞吐量。但是因为它的基础网络相对来说比较稳定,针对时延的考虑不是特别多,后来又有了低时延多链路数据传输的 QUIC 协议。

比起传输层的协议,应用层协议的变化就不是特别大了。它们大部分是在上世纪 90 年代末产生,分别应用于不同的领域,像 HTTP 主要是 WEB,MQTT 主要是物联网,SIP 主要是电信领域在用,XMPP 主要是即时通讯。

融云长连接特性

融云的长连接协议主要考虑了高效性易用性两大方面。其中,高效性包括对安全性、可靠性、完备性、扩展性以及低消耗的综合考量设计。

图片

安全性主要通过通道加密保证通道传输的安全,但是如果架设了中间层和中间人,就需要通过消息体加密保证数据传输的可靠性;在保证了传输层的安全性之后,还需要通过动态密钥和认证码去保证客户端认证的安全性;最后就是保证数据的防重放

可靠性就是需要通过客户端和服务端的双向心跳保活保证电路的可靠性;通过全球网络电路的架设,比如节点之间架设专线,让客户端通过一个比较可靠的就近地址接入,保证数据传输的高效和低时延;然后通过包括 QoS 质量保障、状态送达和弱网优化等来做应用层的消息送达保障。完备性方面,融云提供内容、通知等多种消息类型,单群聊、聊天室、超级群等多种业务类型服务。另外,为了保证排查问题的高效,融云还在协议上进行了全链路消息的串联,实现全链路消息的追踪。

融云在长连接协议的设计上,参考了业界常见协议的优势特点,在保证数据传输低开销的同时,又通过自定义消息类型和多层级消息通道、自定义业务流转去保证扩展性

在保证高效性的同时,融云长连接设计还要通过丰富、多端、简便、扩展、统一等特点实现易用性。

微信图片_20220824140620.png 业务丰富,单群聊、聊天室、超级群等经典和新兴的业务类型都能满足,同时具备消息的多样性,包括文本、图片、音视频、表情包等消息类型及其他业务场景的自定义消息。

多端覆盖,原生的 Android、iOS,跨平台的 RN、Flutter 等全平台覆盖,保证各端协议的一致性,多端覆盖且易于迭代。

多方统一,保证多端的统一性,长期协议的技术能力与融云通信服务的开放能力是统一的。

开箱即用,通道简便、协议简洁。

高扩展性,在协议层保证业务架设可扩展。