在XMPP规范中任意一个实体访问一个拥有服务的服务器,必须通过TCP协议建立连接(包括服务器到服务器的连接)。服务器访问端口为XMPP在IANA注册过的5222端口,此端口并不是强制的,但是建议使用。
在TCP连接建立以后,需要通过一定的安全措施开始协商,以验证通信双方身份的合法性。
1)最先开始的安全协商为通信双方协商是否使用TLS;在XMPP规范中明确说明服务器必须支持使用TLS,以增强其安全性。在客户端,XMPP规范没有强制客户端是否使用TLS,此时客户端可以和服务器协商是否使用TLS。当前绝大部分服务器端为了增强安全性,都必须要求客户端使用TLS。XMPP规范中明确说明服务器端到服务器端必须使用TLS。
2)在通信双方TLS连接建立以后,连接接受者开始验证连接发起者的身份,XMPP规范中规定了此时使用的验证方式为XMPP特定的SASL(简单验证和安全层),SASL提供了一个通用的方法为基于连接的协议增加验证支持。使用了多种验证方式例如DIGEST-MD5、KERBEROS_V4和CRAM-MD5等,供连接双方协商使用。
在SASL验证成功完成后,通信双方就可以正式的通过发送XML数据节开始通信了。以下示例演示了一个XMPP实体客户端通过连接到服务器后给另一个实体终端客户发送消息的XML流交互传输过程:
Client1-1:
<?xml version="1.0"?>
<stream:stream to="onepiece.com" xmlns="jabber:client"
xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
Server1-1:
<?xml version="1.0"?>
<stream:stream from="bleach.com" id="someid"
xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">
//此处省略TLS建立,SASL验证,客户端资源绑定等
Client1-2:
<presence xml:lang="cn">
<show>chat</show>
</presence>
Client1-3:
<iq from="[email protected]/home" type="get" id="roster_1">
<query xmlns="jabber:iq:roster">
</iq>
Server1-2:
<iq to="[email protected]/home" type="result" id="roster_1">
<query xmlns="jabber:iq:roster">
<item jid="[email protected]" name="Luffy" subscription="both">
<group>Friends</group>
</item>
</query>
</iq>
Client1-4:
<message from="[email protected]/home"
to="[email protected]" xml:lang="cn">
<body>Hi Luffy!</body>
</message>
Server1-3:
<message from="[email protected]"
to="[email protected]/home" xml:lang="cn">
<body>Hi Aizen!</body>
</message>
Client1-5:
</stream:stream>
Server1-4:
</stream:stream>
说明:
1) Client端首先发送一个打开流标记<stream/>,对应的Server端也返回一个打开流标记<stream/>,表明了Client和Server开始建立连接(过程Client1-1和Server1-1);
2)其后Client和Server分别进行了协商建立TLS连接与SASL验证身份;
3)在Client的身份确认后,Client首先发送了一个自身的出席信息(过程Client1-2)给服务器Server,服务器负责发送Client的出席信息给Client出席信息的订阅者;
4)之后Client向Server请求Client的花名册列表(过程Client1-3),Server返回Client的花名册列表(过程Server1-2);
5)Client:[email protected]/home 开始给终端[email protected]发送信息,Server端返回由“[email protected]”返回的消息。
6)最后通信结束Client端和Server端分别发送一个<stream/>关闭标签,关闭会话,整个交互过程结束。
综上,一次成功的会话中,首先通信双方必须发送一个流打开标记,表示会话的开始,之后双方协商TLS的使用,在TLS的使用协商完毕后,开始SASL身份验证过程,验证完毕后,终端客户端首先发送自身的出席信息给服务器,表明终端客户已经准备好和其他终端客户通信,之后请求终端客户的联系人花名册。在获得了联系人花名册之后,终端客户可以选择向其中一个用户发送消息。在成功发送一个消息后,一次会话成功。终端客户可以选择关闭会话,也可以选择继续发送其他信息。