xmpp协议 研究

xmpp是个什么呢?记得以前qq一个账号同一时间只能单独登陆,现在可以支持多个登陆了。

XMPP 抽象出一个在互联网上唯一的对象实体,用 JID 来表达。通常一个 JID 由三部分组成,node@domain/resource 。比 email 的表达形式多了一个 /resource 。就如同同一个ip,我们使用的是不同的port。google gtalk,spark,如意通都是基于xmpp的。通过这样xmpp可以支持多个登陆,只要resource在申请一个就可以了。

       xmpp内部使用tcp来连接的,流程如下:

  1. 确定要连接的IP地址和端口号, 典型的做法是对一个合格的域名做出解析( 3.2 )
  2. 打开一个传输控制协议 TCP 连接
  3. 通过TCP打开一个XML流 4.2
  4. 握手最好使用传输层安全性 TLS 来进行通道加密( 5 )
  5. 使用简单验证和安全层 SASL 机制来验证 ( 6 )
  6. 绑定一个资源到这个流上 ( 7 )
  7. 和其他网络上的实体交换不限数量的XML节( 8 )
  8. 关闭XML流 ( 4.4 )
  9. 关闭TCP连接

这里TLS 是什么呢?TLS是用来保护流的安全使其免于被篡改和窃听,是一个加密通道。客户端与服务器tcp连接后,服务器会发流特性给客户端(它是强制协商的),协商失败就会close tcp.协商成功后还要协商SASL。

       XMPP特有的简单验证和安全层协议用于验证一个流. SASL提供一个一般化的方法来给基于连接的协议添加验证支持。XML字符串数据使用base 64编码就在这里协商的。base 64的详细介绍:http://zh.wikipedia.org/zh-cn/Base64

xmpp有三个顶层元素:Message、Presence、IQ

       message:自然是用来发消息的,也可以发离线消息.

<message id="VwfPd-34" to="[email protected]/xxxx" from="[email protected]/Spark 2.6.3" type="chat"><body>Hallo</body></message>
presence:

在线离线等状态,以及subscribe(订阅消息),亦可以广播消息到所有订阅者。这里客户端退出后会自动发一个leave状态给所有订阅者

<presence id="presenceID2" type="unavailable"><show>away</show><status>Leave</status></presence>

        IQ:一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应.

Get:获取当前域值。

Set:设置或替换get查询的值。
Result:说明成功的响应了先前的查询。
Error: 查询和响应中出现的错误。
xmpp内部是用select来接收和发送数据的,有数据发送调用xmpp_send,数据就会保存到发送队列里去。 xmpp_conn_t的 xmpp_send_queue_t就是发送队列。xmpp里有很多定义,有个链表的time_handlers,我写函数的时候把message,presence等的处理函数都加到了这个timer_handler里,接收到对应消息后,就会经过回调函数调用我们定义好的处理函数,比如发消息过去或者发状态等.调用xmpp_handler_add加入handler.xmpp_connect_client成功后会把handler加入conn中,最后一切都交给xmpp吧。

你可能感兴趣的:(协议,XMPP)