jabber和XMPP简述原理

9月 9th, 2016 2,883 留下评论 阅读评论

为了实现不同IM(即时通讯软件,比如QQ、GTalk)之间可以互相通信,jabber和XMPP为此而生。jabber是Linux中的一个程序,设计了一套开源的协议,用于连接不通的IM,然后XMPP以jabber协议为基础并扩展之。每一个IM程序服务端与客户端之间肯定有一套保密并加密的协议,这个是不可能容易让外部获知的,不然IM软件聊天内容就泄露了,谁还敢用。XMPP是让不同的IM之间互相通信,跟IM程序本身毫无关系。

简单的说就是,QQ在自身服务器外,再搭建一个jabber服务器,GTalk也同理,分别称之为jabberQ和jabberG。QQ用户的标识以@qq.com即为,GTalk用户的标识以@gmail.com结尾。首先QQ用户想要与GTalk用户通信,QQ服务器发现这个请求要发给外部用户而非内部QQ用户,将请求转到jabberQ服务器,jabberQ服务器识别到此外部用户以@gmail.com结尾,需要知道jabberG服务器的IP地址是多少,通过DNS协议去查询gmail.com,其中的SRV Records有一项_xmpp-server._tcp.domain可以获知到对应的jabber服务器域名。

可以通过以下命令手动查询:

dig SRV _xmpp-server._tcp.gmail.com

;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42765
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;_xmpp-server._tcp.gmail.com. IN SRV

;; ANSWER SECTION:
_xmpp-server._tcp.gmail.com. 900 IN SRV 20 0 5269 alt1.xmpp-server.l.google.com.
_xmpp-server._tcp.gmail.com. 900 IN SRV 20 0 5269 alt2.xmpp-server.l.google.com.
_xmpp-server._tcp.gmail.com. 900 IN SRV 20 0 5269 alt3.xmpp-server.l.google.com.
_xmpp-server._tcp.gmail.com. 900 IN SRV 20 0 5269 alt4.xmpp-server.l.google.com.
_xmpp-server._tcp.gmail.com. 900 IN SRV 5 0 5269 xmpp-server.l.google.com.

具体详见:http://wiki.xmpp.org/web/SRV_Records#XMPP_SRV_records

然后jabberQ服务器,就通过域名alt1.xmpp-server.l.google.com获取到IP地址去与jabberG服务器建立Socket连接了,当然通过XMPP协议规定的xml内容交互,所以jabberQ服务器会将QQ服务器内部的请求转化为开源的XMPP请求。经过jabberG服务器确认后,连接建立,之后的XMPP协议就可以欢快的走起来了,包括加好友、好友上线/下线状态通知、发消息等。jabberG服务器获取到来自jabberQ的XMPP通知后,将此XMPP请求转化为GTalk内部的数据请求转发给GTalk服务器,然后推送到GTalk客户端。

简单地说就这样子,QQ客户端到GTalk客户端的一次数据请求就完成了。

Categories: Life in Coding 标签:,
  1. 还没有评论呢。