转帖:http://www.chinaaet.com/jishu/jslw/2008-07-16/13414.shtml
随着互联网的普及,即时通信软件IM(Instant Messaging)成为当前Internet上非常普及的通信工具,它从根本上改变了人们的传统通信方式。但是目前主流的IM产品都不能直接互通信息,IM成为网络通信方式的瓶颈,如:微软的MSN、Yahoo的雅虎通、ICQ以及腾讯公司的QQ等,它们所采用的相关标准和协议不统一,是造成瓶颈的原因。
目前即时通信的相关标准主要有IBM公司和微软公司联合提出的SIMPLE(SIP for Instant Messaging and Presence Leveraging Extensions)和互联网工程任务组IETF(The Internet Engineering Task Force)提出的可扩展的消息传递和出席协议XMPP(the eXtensible Messaging and Presence Protocol)。
1 基于XMPP的IM架构
XMPP是在XML基础上开发的用于即时通信的协议,于2004年被IETF批准为Internet标准。XMPP不局限于网络拓扑结构,但是网络通信必须采用TCP协议,它的典型应用是基于C/S结构的系统[1]。
基于XMPP的IM在结构上由三个部分组成:XML流(XML Stream)、流认证(Stream authentication)、 XML节(XML Stanza)。XML流为通信双方之间采用异步方式进行数据传输提供标准的方法,在整个XMPP通信过程中处于最外层,用以控制系统正常的通信。流认证采用SASL(Simple Authentication and Security Layer)和回拨(Dialback)协议完成通信认证,是XMPP安全机制的重要组成部分。XML节为通信双方进行真正的内容交换提供通信框架,是实际需要交换的信息所在处。
2 基于网关实现IM互联互通
基于XMPP的IM通过网关与其他协议IM实现通信。XMPP的网关(Gateway)在服务端提供一种有特殊目的的服务,主要功能是把XMPP即时消息翻译成使用非XMPP的即时通信协议格式,同时把返回的数据翻译回XMPP,例如电子邮件(Email)、在线聊天系统(IRC)、SIMPLE、短消息(SMS)以及现在流行的即时通信软件,如AIM、ICQ、MSN、Yahoo等。XMPP网关原理图如图1所示。
图1显示,XMPP服务端之间可以直接进行通信,而XMPP与其他IM进行互通时,在XMPP服务端与其他IM服务端之间就需要相应IM的网关来进行协议的翻译,并且不同的外部IM需要不同网关完成协议翻译功能。
3 XMPP网关的工作原理
以与MSN Messengers进行互连互通为例说明XMPP网关的工作原理。MSN Messenger是微软公司推出的当前很流行的即时通信软件,它的协议建立在TCP/IP之上。除了文件传输和语音聊天是直接的“点对点”通信之外,其他所有的情况都是通过服务器进行。在逻辑上,一共有三种类型的服务器,各司其职:
(1)派遣服务器DS(Dispatch Server):客户端最初连接的服务器,负责给客户端分配合适的通知服务器。域名是messenger.hotmail.com,标准服务端口是1863。完成派遣任务后,切断TCP连接。
(2)通知服务器NS(Notification Server):客户端需要一直保持连接的服务器。很多任务要在这个会话内完成,包括登录、改变状态、获取用户列表、修改用户信息、发起聊天、接收呼叫、邮件通知、退出等。服务端口通常也是1863,由派遣服务器指定。
(3)接线服务器SB(Switchboard Server):客户端之间聊天使用的中转服务器。每开一个聊天窗口,客户端和服务器就建立一个TCP会话。当客户端之间需要进行文件传输或语音聊天时,即发送系统消息,建立“点对点”会话通道(可能转为使用UDP)。服务端口通常也是1863。“点对点”通信使用的端口由客户端自动协商决定,如文件传输通常使用6891端口[2]。
MSN Messenger命令使用纯ASCII码,对非ASCII码字符使用URL编码。
现在XMPP的软件主要是各类Jabber IM。实现Jabber账号与MSN账号的关联如下:
(1)使用Jabber客户端Exodus软件建立一个jabber账号:phoenix@jabber.com.cn;使用MSN Messengers建立MSN账号girl88@hotmail.com,昵称Beauty。
(2)为girl88@hotmail.com加入一个好友boy88@hotmail.com(昵称Handsome),使得这两个MSN账号用户互为好友。
(3)使用Exodus账号phoenix@jabber.com.cn登录到服务器jabber.com.cn,并且把账号girl88@hotmail.com注册到jabber MSN网关服务器。
在MSN 账号boy88@hotmail.com登录后,就可以在Jabber客户端的好友列表中看到多了一个好友boy88%hotmail.com@ msn.jabber.com.cn,原boy88@hotmail.com变成了boy88%hotmail.com(为了不与Jabber账号中的@混淆,原MSN账号中的@改为%),并且在后面加上了jabber服务器的地址。
下面以Jabber系统与MSN Messenger之间互发消息的过程说明XMPP网关的工作原理。
3.1 Jabber客户端向MSN好友发出一次chat的请求
当Jabber客户端想和一个MSN的好友聊天时,首先需要按如下格式发送请求给Jabber服务端:
Jabber服务端接收到该请求后,网关按照MSN的通信协议转发该请求给MSN的服务器(NS)。首先发送命令字“XFR TrID SB”给MSN的服务器(NS),在收到MSN服务器返回的相同命令字的命令: XFR TrID SB 64.4.13.88:1863 CKI1989487642.2070896604后,从中获取MSN服务器分配给这次Chat的接线服务器(SB)的地址和端口,然后再重新连接到该SB服务器上[3]。
在连接上SB服务器之后,网关将向此SB服务器发送以下命令:USR 1 girl88@hotmail.com 989487642.2070896604,如果所发送的这个CKI杂列正确,SB服务器将返回USR 1 OK girl88@hotmail.com Beauty。以上操作完成之后,接下来这个用户要做的就是要把另一个用户“叫到”此聊天session中。这可以通过发送下面的命令完成CAL 2 boy88@hotmail.com,此时服务器将会向此用户回应一个session号,同时也会将此session号发送给另一个用户。
如果另一个用户准备好聊天并做出回应,SB服务器将发送如下命令: JOI boy88@hotmail.com Handsome。这条命令表示另一个用户加入了聊天当中,通信双方之间就建立起一个chat通道,相互之间可以互发消息了。
3.2 MSN好友向Jabber客户端发出一次chat的请求
MSN好友boy88@hotmail.com并不知道girl88@hotmail.com已经注册到了Jabber的网关服务,仍正常地向girl88@hotmail.com发送一次chat的请求,而MSN服务器(NS)已把MSN格式信息发送到了Jabber服务端,此时网关首先接收到该请求(MSN通信协议中命令字为RNG的命令,格式为“RNG SessionID SwitchboardServerAddress CKI AuthchallengeInfo CallingUserHandle CallingUser FriendlyName”),如:RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 boy88@hotmail.com Handsome。从该命令行中获取SB服务器的地址和端口以及CKI杂列和发起聊天方的用户名和昵称,然后Gateway方连接到该SB服务器上,并发送命令“ANS TrID LocalUserHandle AuthResponseInfo SessionID”。其中,LocalUserHandle为C端用户,AuthResponseInfo和SessionID的值均要与收到的RNG命令中的值一致。如:ANS 1 girl88@hotmail.com 989495494.750408580 11742066。当接收到SB服务器发送的命令字为IRO 1 1 1 girl88@hotmail.com beauty 和ANS 1 OK的命令时,通信双方就可以互发消息了。
3.3 Jabber客户端MSN好友互发消息过程
不管是Jabber客户端先发出chat请求还是先接收chat请求,一旦与MSN服务器为该次chat分配的SB服务器之间建立了通信通道,Jabber客户端和他的MSN好友之间就可以收发消息了。
(1)Jabber客户端向MSN好友boy88@hotmail.com发XML数据流信息,在Jabber客户端看到的好友账号是boy88% hotmail.com@msn.jabber.com.cn:
信息被Jabber服务端接后,网关转换为MSN的信息格式再发送到MSN服务端:
MSG 2 N 153
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif;
EF=; CO=0; CS=0; PF=22
Where are you, boy88?
其中,2是测试号,每发送一次信息,此号就会随着增加;153是指所发送信息的长度。在上面的例子中就是头信息和所发送的信息“Where are you, boy88?”的长度。
(2)当MSN客户端账号boy88@hotmail.com向他的好友girl88@hotmail.com按MSN格式发信息时,如:
MSG girl88@hotmail.com beauty 149
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif;
EF=; CO=0; CS=0; PF=22
I am from Sichuan.
Jabber服务端接收到MSN格式的信息后,网关需要把这些信息转化为Jabber客户端识别的XML数据流,并且发送目标girl88@hotmail.com改为phoenix@jabber.com.cn,如下:
Jabber客户端从接收到的XML流获取收到的即时信息:I am from Sichuan。
即时通信越来越流行,应用范围越来越大,但因各类主流IM软件相互间不能直接互通信息,必然会影响人际间信息的交流。作为即时通信服务的协议标准,基于XML的XMPP提供一个网关服务,通过在服务端与非XMPP的信息进行相互翻译,在一定程度上解决了这个问题,实现了各类不同IM软件的互通,为不同架构的即时通信系统进行通信提供了一种方式。
参考文献
[1] ANDRE P S. Extensible messaging and presence protocol(XMPP): core. RFC3920,.[S]. Internet Engineering Task Force,2004.
[2] MSN Messenger协议[EB/OL].http://www.cnitblog.com/tcpip2005/articles/879.html,2005-04-16.
[3] 黄昶,张燕,沈建国.即时消息传递系统的智能代理[J].计算机应用研究,2004,(6):256-257,260.