IM
各种聊天协议
首先我们以实现方式来切入,基本上有以下四种实现方式:
- 基于
Scoket
原生:代表框架CocoaAsyncSocket
。 - 基于
WebScoket
:代表框架SocketRocket
。 - 基于
MQTT
:代表框架MQTTKit
。 - 基于
XMPP
:代表框架XMPPFramework
。
注意:
MQTT
和XMPP
为聊天协议,它们是最上层的协议,
WebScoket
是传输通讯协议,它是基于Socket
封装的一个协议。
通常我们所说的腾讯IM的私有协议,就是基于WebScoket
或者Scoket
原生进行封装的一个聊天协议。
在使用 TCP 长连接的 IM 服务设计中,往往都会涉及到心跳。心跳一般是指某端(绝大多数情况下是客户端)每隔一定时间向对端发送自定义指令,以判断双方是否存活,因其按照一定间隔发送,类似于心跳,故被称为心跳指令。
TCP KeepAlive 是用于检测连接的死活,而心跳机制则附带一个额外的功能:检测通讯双方的存活状态。
真正需要心跳机制的原因其实主要是在于国内运营商NAT
超时。
一、MQTT
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽、高延迟或不可靠网络环境设计。它基于发布 - 订阅模式,广泛应用于物联网(IoT)、移动应用和实时数据传输场景。
1. 协议特点
- 轻量级:固定报头仅 2 字节,最小化网络开销。
- 低功耗:适合电池供电的 IoT 设备。
- 异步通信:基于发布 - 订阅模式,解耦生产者与消费者。
- QoS 支持:提供三种服务质量等级(QoS 0/1/2)。
- 遗言机制:客户端异常断开时Broker 自动发布预设消息。
2. 核心组件
Broker(代理服务器):中央消息服务器,接收发布者消息并路由至订阅者。
Client(客户端):发布者(Publisher)和订阅者(Subscriber)的统称。
Topic(主题):消息的逻辑分类,使用层级结构(如home/livingroom/temp
)。
QoS(服务质量):
- QoS 0:最多一次(可能丢失)。
- QoS 1:至少一次(可能重复)。
- QoS 2:恰好一次(确保不丢失、不重复)。
3. 消息流示例
- 客户端 A连接到 Broker。
- 客户端 A订阅主题
home/kitchen/temp
(QoS 1)。 - 客户端 B发布温度数据到主题
home/kitchen/temp
(QoS 1)。 - Broker将消息路由至所有订阅该主题的客户端(包括 A)。
- 客户端 A接收消息并处理。
4. 常用库:MQTTClient
pod 'MQTTClient'
二、XMPP
XMPP(Extensible Messaging and Presence Protocol)是一种基于 XML 的开放式实时通信协议,最初用于即时通讯(IM),现广泛应用于社交网络、物联网、协作工具等领域。
1. 协议特点
- 基于 XML:消息格式为 XML,易读性强,但开销较大。
- 去中心化:采用分布式架构,不同服务器可互相通信(Federation)。
- 扩展性:通过 XEP(XMPP Extension Protocols)支持丰富功能。
- 实时性:基于长连接,支持即时消息和状态通知(Presence)。
2. 消息流程
- 用户 A(
alice@example.com
)连接到服务器example.com
。 - 用户 B(
bob@example.net
)连接到服务器example.net
。 - A向B发送消息:
-
example.com服务器将消息路由至example.net服务器。
- **example.net**将消息转发给B。
<message to="bob@example.net" from="alice@example.com">
<body>Hello, Bob!</body>
</message>
三、总结与建议
协议 | MQTT | HTTP | WebSocket | AMQP | CoAP |
---|---|---|---|---|---|
协议层 | 应用层 | <