Skip to main content

WuKongIM协议

WuKongIM 协议是一个高效的二进制通信协议,专为即时通讯场景设计。本文档详细描述了协议的报文结构、控制类型和编码规范。

📋 控制报文结构

每个 WuKongIM 控制报文都由以下三个部分组成:

🔧 固定报头

每个 WuKongIM 控制报文都包含一个固定报头,用于标识报文类型和长度信息。

📝 WuKongIM 控制报文类型

WuKongIM 协议定义了10种不同的控制报文类型,每种类型都有特定的用途和数据结构。

🏷️ 控制报文标志位

不同的协议报文使用不同的标志位来控制消息行为: Send和Recv协议中的标志位 Connack协议中的标志位 Chunk协议中的标志位
标志位说明
  • DUP: 是否是重复的消息(客户端重发消息的时候需要将DUP标记为1)
  • SyncOnce: 只同步一次 在多端设备的情况下 如果有一个设备拉取过此消息,其他设备将不会再拉取到此消息(比如加好友消息)
  • RedDot: 客户端收到消息是否显示红点
  • NoPersist: 是否不存储此消息
  • Reserved: 保留位
  • HasServerVersion: 是否有服务端版本号
  • End: 是否是结束的消息块

📏 剩余长度编码

剩余长度字段表示在当前消息中剩余的字节数,包含可变头部和负荷(内容)。这是一个可变长度编码字段。
编码规则
  • 单个字节最大值:01111111 (0x7F, 127)
  • 第八位(最高位)为 1 表示还有后续字节
  • 最多允许 4 个字节表示剩余长度
  • 最大长度:0xFF,0xFF,0xFF,0x7F = 268,435,455 byte = 256MB
字节范围
编码理解
  • 第1字节基数:1
  • 第2字节基数:128 (2^7)
  • 第3字节基数:128×128 = 2^14
  • 第4字节基数:128×128×128 = 2^21
编码示例 表达 321 = 65 + 2×128 (2字节):11000001 00000010
字节顺序:第一个字节是低位,后续字节是高位,但字节内部是低位在右,高位在左。

🔤 字符串 UTF-8 编码

WuKongIM 采用修改版的 UTF-8 编码格式:

🔄 可变报头

某些控制报文包含一个可变报头部分,位于固定报头和有效载荷之间。可变报头的内容根据报文类型的不同而不同。


📡 协议报文规范

🔌 CONNECT 连接报文

客户端向服务端发起连接请求时使用的报文格式。

✅ CONNACK 连接确认

CONNACK 报文由服务端发送,作为对客户端 CONNECT 报文的响应。如果客户端在合理时间内没有收到 CONNACK 报文,应该关闭网络连接。

📤 SEND 发送消息

客户端向服务端发送消息时使用的报文格式。

✅ SENDACK 发送消息确认

服务端对客户端发送消息的确认响应。

📥 RECV 收消息

服务端向客户端推送消息时使用的报文格式。

✅ RECVACK 收消息确认

客户端对服务端推送消息的确认响应。

🏓 PING

客户端发送的心跳请求报文,用于保持连接活跃。

🏓 PONG

服务端对客户端 PING 请求的响应报文。

🔌 DISCONNECT

客户端或服务端请求断开连接时使用的报文格式。

📢 EVENT 事件通知

服务端向客户端推送事件通知时使用的报文格式。事件通知用于传递系统状态变化、用户行为通知等非消息类型的信息。
事件类型示例
  • user_online: 用户上线事件
  • user_offline: 用户下线事件
  • channel_update: 频道信息更新事件
  • member_join: 成员加入频道事件
  • member_leave: 成员离开频道事件
  • typing: 用户正在输入事件

⚙️ 消息设置

📊 消息设置位字段

消息设置为 1 byte (8 bit),用于控制消息的各种行为特性。

🔧 设置位说明

各位功能说明
  • Receipt: 消息已读回执,此标记表示此消息需要已读回执
  • Reserved: 保留位,暂未用到
  • Signal: 加密标记
  • NoEncrypt: 消息是否不开启加密
  • Topic: 消息是否包含 topic(如果为 1 则发送包和接受包都将包含 topic 字段)
  • Reserved: 保留位,暂未用到
  • Stream: 流式消息标记
  • Reserved: 保留位,暂未用到

完整协议文档: 本文档包含了 WuKongIM 协议的核心部分。完整的协议规范还包括 Payload 推荐结构、普通消息格式、系统消息格式等详细内容,请参考源文档获取完整信息。