0 引言
隨著即時通信(IM)軟件已經(jīng)成為互聯(lián)網(wǎng)信息平臺的重要組成部分[4]。但基于自身利益的考慮,各個IM軟件均制定并保守自己支持的通信協(xié)議格式和標(biāo)準(zhǔn),導(dǎo)致了各個通信軟件不能互聯(lián)互通,客觀上制約了IM的發(fā)展。
XMPP協(xié)議標(biāo)準(zhǔn)解決了不同即時通信平臺信息互通的難題。基于XMPP擴(kuò)展P2P協(xié)議的應(yīng)用開源庫libjingle庫可以開發(fā)第三方IM軟件,最終實現(xiàn)第三方IM與支持XMPP協(xié)議的即時通信軟件的文本和語音等的互操作。
本文以libjingle為研究對象,重點討論libjingle支持的文件傳輸?shù)膶崿F(xiàn)原理和協(xié)議格式,以及介紹以libjingle庫開發(fā)文本傳輸?shù)幕緦崿F(xiàn)。
1 libjingle文件傳輸通信原理
1.1 libjingle介紹
libjingle是Google公司推出的基于語音和P2P通信的C++開源庫。利用libjingle開源庫能夠開發(fā)出第三方的Jingle點到點通信應(yīng)用程序,實現(xiàn)與所有支持XMPP以及Jingle擴(kuò)展協(xié)議的軟件實現(xiàn)通信。
1.2 libjingle通信系統(tǒng)構(gòu)架
libjingle在語音、視頻、文件等傳輸方面具有良好的健壯性,這要得益于libjingle采用信令和數(shù)據(jù)分信道傳輸?shù)臋C制,即libjingle采用了信令在帶內(nèi)信道傳輸,用戶數(shù)據(jù)在帶外信道上傳輸?shù)臋C制。
① libjingle通信信道
libjingle的連接包括2種信道(如圖1)[1,2]。一是會話協(xié)商信道,或者稱為XMPP信令信道,此為帶內(nèi)信道。會話協(xié)商信道協(xié)商信令必須通過中間Jingle Server。二是帶外信道也即數(shù)據(jù)信道。通過數(shù)據(jù)傳輸信道實現(xiàn)用戶數(shù)據(jù)的傳輸,這些數(shù)據(jù)包括語音、視頻、文本等。
② libjingle數(shù)據(jù)傳輸路徑
對于數(shù)據(jù)傳輸通道,在libjingle中,根據(jù)有無防火墻或者NAT設(shè)備,有3種不同數(shù)據(jù)傳輸路徑(如圖1)[1,2]。在有防火墻或者NAT設(shè)備的情況下,包括通信雙方的直接連接通信和通過中繼服務(wù)器轉(zhuǎn)發(fā)連接通信。
③ libjingle穿透防火墻或者NAT技術(shù)
libjingle一個最重要的能力就是能夠穿透防火墻或者NAT設(shè)備來協(xié)商連接。其使用ICE(Interactive Connectivity Establishment )技術(shù)來實現(xiàn)穿透防火墻。
---------------------------------
1.3 libjingle文件傳輸協(xié)議格式
libjingle文件傳輸協(xié)議基于P2P的通信協(xié)議。相對于音頻視頻采用UDP連接通信,文件傳輸采用一種TCP-Like(PseudoTCP)連接通信的格式[1]。PseudoTCP格式(如圖2)是TCP的改進(jìn)版,如下所示,其中PseudoTCP頭共24個字節(jié)。
① 會話數(shù)(Conversation Number):32位,記錄所有的會話數(shù)。
② 序列碼(Sequence Number):32位,用來表示從發(fā)送端到接收端字節(jié)流數(shù)。
③ 確認(rèn)碼序號(Acknowledgment Number):32位,如果設(shè)置了ACK控制位為1,確認(rèn)碼序號這個值表示一個準(zhǔn)備接收的下一個包的序列碼。
④ Pseudo控制位(PseudoCTL):8位,表示PseudoTCP連接過程的狀態(tài)。
⑤ 控制位(Control):共6位,依此包括URG位、ACK位、PSH位、 RST位、 SYN位、 FIN位。
⑥ 窗口(Window):16位;接收端告訴發(fā)送端,其要求收到的TCP數(shù)據(jù)段大小。
⑦ 發(fā)送時間戳(Timestamp sending):32位,表示發(fā)送數(shù)據(jù)報時間。
⑧ 接收時間戳(Timestamp receiving):32位,表示接收到數(shù)據(jù)報時間。
相對于TCP連接,UDP連接更加容易通過NAT,libjingle的TCP-Like數(shù)據(jù)報具有TCP報連接傳輸?shù)墓δ?,保證了文件傳輸?shù)目煽啃裕灰淄ㄟ^防火墻或者NAT [5]。通過PseudoTCP數(shù)據(jù)報頭加了UDP頭,組成了一個具有TCP功能的UDP數(shù)據(jù)報(如圖3)。
2 libjingle文件傳輸?shù)膶崿F(xiàn)
通過libjingle提供的C++源代碼庫,能夠開發(fā)出自己的Jingle Server和Jingle Client。
2.1 libjingle文件傳輸類
libjingle文件傳輸客戶端分文四個部分 [1],一是用戶應(yīng)用(Application)接口單元;二是XMPP報文傳輸單元(XMPP Messaging Component ),此單元是XMPP信令在應(yīng)用程序和網(wǎng)絡(luò)之間傳輸?shù)慕涌?;三是會話邏輯和會話管理單?span>(Session Logic and Management Component ),控制每一個會話類型具體的邏輯請求;四是點到點傳輸單元(Peer-to-Peer Component),主要作用是管理本地與遠(yuǎn)程計算機的連接。
在報文傳輸單元中,XmppPump是頂層管理類。XmppClient是應(yīng)用程序與網(wǎng)絡(luò)傳輸XMPP信號的出口與入口點。XmppTask以及其派生類作為異步的XMPP任務(wù)類,能夠扮演xmpp信令的發(fā)起者、偵聽者或者兩者兼有的角色。
會話邏輯和會話管理單元的主要類包括Session、Transpor、PseudoTCPChannel、TransportChannel、SessionManager、HttpPortAllocator等。Session類主要作用包括在XMPP隧道上協(xié)商文件數(shù)據(jù)傳輸隧道,以及監(jiān)測、建立、斷開數(shù)據(jù)傳輸連接。
2.2 libjingle文件傳輸具體流程
文件的P2P傳輸首先是登錄 XMPP服務(wù)器,然后才能在兩用戶端實現(xiàn)文件的傳輸。具體實現(xiàn)流程如下。
① 客戶端應(yīng)用程序啟動,登錄XMPP服務(wù)器。首先初始化SSL,保證數(shù)據(jù)傳輸安全,然后創(chuàng)建一個信令線程。從用戶那里得到用戶信息比如登錄名、密碼等信息初始化XmppClientSettings對象,創(chuàng)建一個XMPP任務(wù)管理對象XmppPump,由XmppPump創(chuàng)建XmppClient對象和控制登錄服務(wù)器。
② 協(xié)商建立文件傳輸會話連接,并在雙方傳輸文件。客戶端運行 HttpClient實例對象,HttpClient對象發(fā)送一個基本的GET請求通過P2PTransport對象實現(xiàn)連接協(xié)商。而在服務(wù)器端運行一個HttpServer實例對象,HttpServer實例對象接收連接請求,創(chuàng)建一個PseudoTcpChannel對象控制連接,然后創(chuàng)建和發(fā)送一個在本地存取文件的流接口點。使用數(shù)據(jù)流的形式讀文件,文件數(shù)據(jù)流的發(fā)送通過PseudoTcpChannel對象。文件數(shù)據(jù)流最終通過TransportChannel發(fā)送出并通過網(wǎng)絡(luò)到達(dá)接收方。在接收方,TransportChannel對象接收文件數(shù)據(jù)流信息,并把數(shù)據(jù)流轉(zhuǎn)換成StreamInterface流,最終通過PseudoTcpChannel把StreamInterface流反饋給HttpClient對象,由HttpClient對象把數(shù)據(jù)以文件的形式存儲在存儲器上。
結(jié)束語
本文分析了libjingle開源庫的文件傳輸原理,并描述了利用libjingle開發(fā)文件傳輸客戶端的實現(xiàn)過程。libjingle文件傳輸采用具有TCP功能的UDP連接,即具有良好的可靠性,又能方便的通過NAT,實現(xiàn)真正的全網(wǎng)無障礙通信。但是,libjingle的文件傳輸協(xié)議并沒有成為一個成熟的標(biāo)準(zhǔn),其通用性還有待改善。
[參考文獻(xiàn)]
[1] Google.libjingle[E B /OL].(2008-01-10) [2008 -10-20].http://code. google.com/apis/talk/libj ingle/.
[2]xmpp.org.XMPP Extensions[E B /OL].(2008-02-01) [2008-10-20]. http://xmpp. org/extensions/ .
[3] 張彥 . Jabber/XMPP技術(shù)的研究與應(yīng)用[J] . 科學(xué)技術(shù)與工程,2007,7(6):1032-1035.
[4] 張文茂等 . 互聯(lián)網(wǎng)即時消息(InstantMessag ing,IM)的研究現(xiàn)狀和展望[J] . 小型微型計算機系統(tǒng),2007,(7):62-68.