??? 摘 要: XMPP最終要實現不同即時通信" title="即時通信">即時通信系統間的互通。主要介紹對XMPP與其他IM互連互通的網關原理及其應用進行的研究討論,并以jabber系統與MSN Messenger進行互發信息作為實例進行詳細闡述。
??? 關鍵詞: 即時通信(IM)? XMPP網關? 網絡通訊
?
??? 隨著互聯網的普及,即時通信軟件" title="通信軟件">通信軟件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)在服務端" title="服務端">服務端提供一種有特殊目的的服務,主要功能是把XMPP即時消息翻譯成使用非XMPP的即時通信協議格式,同時把返回的數據翻譯回XMPP,例如電子郵件(Email)、在線聊天系統(IRC)、SIMPLE、短消息(SMS)以及現在流行的即時通信軟件,如AIM、ICQ、MSN、Yahoo等。XMPP網關原理圖如圖1所示。
??????????????????????
??? 圖1顯示,XMPP服務端之間可以直接進行通信,而XMPP與其他IM進行互通時,在XMPP服務端與其他IM服務端之間就需要相應IM的網關來進行協議的翻譯,并且不同的外部IM需要不同網關完成協議翻譯功能。
3 XMPP網關的工作原理" title="工作原理">工作原理
??? 以與MSN Messengers進行互連互通為例說明XMPP網關的工作原理。MSN Messenger是微軟公司推出的當前很流行的即時通信軟件,它的協議建立在TCP/IP之上。除了文件傳輸和語音聊天是直接的“點對點”通信之外,其他所有的情況都是通過服務器進行。在邏輯上,一共有三種類型的服務器,各司其職:
??? (1)派遣服務器DS(Dispatch Server):客戶端" title="客戶端">客戶端最初連接的服務器,負責給客戶端分配合適的通知服務器。域名是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賬號:[email protected];使用MSN Messengers建立MSN賬號[email protected],昵稱Beauty。
??? (2)為[email protected]加入一個好友[email protected](昵稱Handsome),使得這兩個MSN賬號用戶互為好友。
??? (3)使用Exodus賬號[email protected]登錄到服務器jabber.com.cn,并且把賬號[email protected]注冊到jabber MSN網關服務器。
??? 在MSN 賬號[email protected]登錄后,就可以在Jabber客戶端的好友列表中看到多了一個好友boy88%hotmail.com@ msn.jabber.com.cn,原[email protected]變成了boy88%hotmail.com(為了不與Jabber賬號中的@混淆,原MSN賬號中的@改為%),并且在后面加上了jabber服務器的地址。
??? 下面以Jabber系統與MSN Messenger之間互發消息的過程說明XMPP網關的工作原理。
3.1 Jabber客戶端向MSN好友發出一次chat的請求
??? 當Jabber客戶端想和一個MSN的好友聊天時,首先需要按如下格式發送請求給Jabber服務端:
???
????
??? 在連接上SB服務器之后,網關將向此SB服務器發送以下命令:USR 1 [email protected] 989487642.2070896604,如果所發送的這個CKI雜列正確,SB服務器將返回USR 1 OK [email protected] Beauty。以上操作完成之后,接下來這個用戶要做的就是要把另一個用戶“叫到”此聊天session中。這可以通過發送下面的命令完成CAL 2 [email protected],此時服務器將會向此用戶回應一個session號,同時也會將此session號發送給另一個用戶。
??? 如果另一個用戶準備好聊天并做出回應,SB服務器將發送如下命令: JOI [email protected] Handsome。這條命令表示另一個用戶加入了聊天當中,通信雙方之間就建立起一個chat通道,相互之間可以互發消息了。
3.2 MSN好友向Jabber客戶端發出一次chat的請求
??? MSN好友[email protected]并不知道[email protected]已經注冊到了Jabber的網關服務,仍正常地向[email protected]發送一次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 [email protected] Handsome。從該命令行中獲取SB服務器的地址和端口以及CKI雜列和發起聊天方的用戶名和昵稱,然后Gateway方連接到該SB服務器上,并發送命令“ANS TrID LocalUserHandle AuthResponseInfo SessionID”。其中,LocalUserHandle為C端用戶,AuthResponseInfo和SessionID的值均要與收到的RNG命令中的值一致。如:ANS 1 [email protected] 989495494.750408580 11742066。當接收到SB服務器發送的命令字為IRO 1 1 1 [email protected] beauty 和ANS 1 OK的命令時,通信雙方就可以互發消息了。
3.3 Jabber客戶端MSN好友互發消息過程
??? 不管是Jabber客戶端先發出chat請求還是先接收chat請求,一旦與MSN服務器為該次chat分配的SB服務器之間建立了通信通道,Jabber客戶端和他的MSN好友之間就可以收發消息了。
??? (1)Jabber客戶端向MSN好友[email protected]發XML數據流信息,在Jabber客戶端看到的好友賬號是boy88%? [email protected]:
?????
????
??? 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客戶端賬號[email protected]向他的好友[email protected]按MSN格式發信息時,如:
????MSG [email protected] 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數據流,并且發送目標[email protected]改為[email protected],如下:
??? ??
????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.