XMPP 尚能饭否

概述

XMPP(可扩展的消息传递和存在协议)当年是专门为即时消息应用设计的协议。
XMPP 历史稍长,比较成熟,应用和库也比较多,比如Jabber, Google Talk(现在改为 Hangouts 环聊),WhatsApp。 但是所使用的 XML 也比较繁琐, 消息体比较大, 所以在移动网络和物联网中有些力不从心。

MQTT(MQ Telemetry Transport)专门为 IoT 物联网的设备所设计的一种通信协议,适用于功率, 容量和计算能力比较低的设备。 它快速和可靠,消息体小,传输和解析效率比较高。比如 Facebook Messenger 就使用 MQTT。

对于在线聊天,在线会议领域,使用 WebSocket + JSON 也许是更加方便的选择,如果考虑到传输带宽的限制, WebSocket + ProtoBuffer 也许更好。

回顾 XMPP

XMPP 即 eXtensible Messaging and Presence Protocol 扩展消息和出席协议
它是以一种双向的流式XML表示的即时消息应用协议

大家最熟悉的即时消息应用莫过于 QQ 和微信了, 腾讯使用的是自己的私有协议, 而 XMPP 是开放的公有协议, 任何人都可以参考和免费使用

XMPP 有两个主要的协议

  • XMPP Core - RFC6120 XMPP 核心协议
XMPP Core
  • XMPP Instant Messaging and Presence - RFC6121 XMPP 即时消息和出席协议
XMPP IM

还有许多扩展的协议(http://xmpp.org/extensions), 常用的有

XMPP MUC

术语

  • bare JID : 基本JID
    localpart@domainpart
  • full JID: 完整 JID, 区别是加上了资源部分
    localpart@domainpart/resourcepart
  • XML stanza: XML 节, 即一个XMPP的XML 消息
  • route: 路由, 一个消息经由什么路径发到目的地

XMPP stream 搭建过程

Simple connect flow
participant client as client
participant server as server

client->server: 1) start stream
server-->client: 2) start stream and features
client->server: 3) auth
server-->client: 4) success
note over client, server: sasl negotiation success
client->server: 5) restart stream
server-->client: 6) restart stream and features
client->server: 7) resource bind iq
server-->client: 8) iq result

connect, auth and resource bind
participant client as client
participant server as server

client->server: 1) start stream
server-->client: 2) start stream and features
client->server: 3) starttls
server-->client: 4) proceed
note over client, server: tls negotiation success
client->server: 5) restart stream
server-->client: 6) restart stream and features
client->server: 7) auth
server-->client: 8) challenge
client->server: 9) response
server-->client: 10) success
note over client, server: sasl negotiation success
client->server: 11) restart stream
server-->client: 12) restart stream and features
client->server: 13) resource bind iq
server-->client: 14) iq result
client->server: 15) session iq
server-->client: 16) iq result

架构

  • 使用全局统一的地址 Global addresses
  • 使用在线状态 Presence
  • 使用可持久化的流 Persistent Streams
  • 结构化的数据 Structured Data
  • 使用客户机和服务器的分布式网络 Distributed Network of Clients and Servers

XML stanza

XMPP 消息流由三种类型的 Stanza 构成

|--------------------|
| <stream>           |
|--------------------|
| <presence>         |
|   <show/>          |
| </presence>        |
|--------------------|
| <message to='foo'> |
|   <body/>          |
| </message>         |
|--------------------|
| <iq to='bar'>      |
|   <query/>         |
| </iq>              |
|--------------------|
| ...                |
|--------------------|
| </stream>          |
|--------------------|
</pre>

XML 节

    <message/>
    <presence/>
    <iq/>

例如

1. Presence 出席状态

<Presence
    from="alice@aaa.com"
    id="1232312312312"
    to="bob@bbb.com"
    >
      <show>online</show>
    </Presence>

2. Message 消息

 <message
 from="alice@aaa.com"
 id="1232312312312"
 to="bob@bbb.com"
 type="chat"
 >
 <body>Hi Bob</body>
 </message>

3. iq 请求与应答

  • IQ request
<iq id="1952c42c-8fbf-43d6-9b85-5b0e79c3e3f7:sendIQ" to="bob@bbb.com" type="get" xmlns="jabber:client">
<vCard xmlns="vcard-temp"/>
</iq>
  • iq response
<iq type="result" id="1952c42c-8fbf-43d6-9b85-5b0e79c3e3f7:sendIQ" from="bob@bbb.com" to="alice@aaa.com/converse.js-132196857" xmlns="jabber:client">
<vCard xmlns="vcard-temp">
    <FN>Bob</FN>
    <NICKNAME>boy</NICKNAME>
    <URL/>
    <ROLE>Dev</ROLE>
    <EMAIL>
        <INTERNET/><PREF/><USERID>bob@gmail.com</USERID
    </EMAIL>
    <PHOTO>
      <TYPE>image/png</TYPE>
      <BINVAL>iVBORw0KGgoAAAANSUhEU</BINVAL>
    </PHOTO>
</vCard>
</iq>

从上面的协议快速回顾看出来, XMPP 协议和它用的 XML 有太多冗余信息,信息全则全矣,不够精简。近年来 Googgle Hangout, Microsoft Skype, Cisco Webex 都逐渐不再或减少了对 XMPP 的使用。

我曾经想过基于 XMPP , 把它从 XML 改造成 JSON 格式, 不过没找到动力和时间干这事。

我仍然坚信,世界需要一下类似 XMPP 这样的协议将各种 Instant Message 协议格式统一起来,让各种 Instant Message 工具互边互通, 让 WhatsApp, Line , QQ,Skype 都能相互进行消息通信

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容