《For Graduate》---XMPP通信链路的建立过程

XMPP规范中任意一个实体访问一个拥有服务的服务器,必须通过TCP协议建立连接(包括服务器到服务器的连接)。服务器访问端口为XMPPIANA注册过的5222端口,此端口并不是强制的,但是建议使用。

TCP连接建立以后,需要通过一定的安全措施开始协商,以验证通信双方身份的合法性。

1)最先开始的安全协商为通信双方协商是否使用TLS;在XMPP规范中明确说明服务器必须支持使用TLS,以增强其安全性。在客户端,XMPP规范没有强制客户端是否使用TLS,此时客户端可以和服务器协商是否使用TLS。当前绝大部分服务器端为了增强安全性,都必须要求客户端使用TLSXMPP规范中明确说明服务器端到服务器端必须使用TLS

2)在通信双方TLS连接建立以后,连接接受者开始验证连接发起者的身份,XMPP规范中规定了此时使用的验证方式为XMPP特定的SASL(简单验证和安全层),SASL提供了一个通用的方法为基于连接的协议增加验证支持。使用了多种验证方式例如DIGEST-MD5KERBEROS_V4CRAM-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>

说明:

1Client端首先发送一个打开流标记<stream/>,对应的Server端也返回一个打开流标记<stream/>,表明了ClientServer开始建立连接(过程Client1-1Server1-1)

2)其后ClientServer分别进行了协商建立TLS连接与SASL验证身份;

3)在Client的身份确认后,Client首先发送了一个自身的出席信息(过程Client1-2)给服务器Server,服务器负责发送Client的出席信息给Client出席信息的订阅者;

4)之后ClientServer请求Client的花名册列表(过程Client1-3)Server返回Client的花名册列表(过程Server1-2)

5Client[email protected]/home 开始给终端[email protected]发送信息,Server端返回由“[email protected]”返回的消息。

6)最后通信结束Client端和Server端分别发送一个<stream/>关闭标签,关闭会话,整个交互过程结束。

综上,一次成功的会话中,首先通信双方必须发送一个流打开标记,表示会话的开始,之后双方协商TLS的使用,在TLS的使用协商完毕后,开始SASL身份验证过程,验证完毕后,终端客户端首先发送自身的出席信息给服务器,表明终端客户已经准备好和其他终端客户通信,之后请求终端客户的联系人花名册。在获得了联系人花名册之后,终端客户可以选择向其中一个用户发送消息。在成功发送一个消息后,一次会话成功。终端客户可以选择关闭会话,也可以选择继续发送其他信息。

你可能感兴趣的:(XMPP)