本页使用了标题或全文手工转换

XMPP

维基百科,自由的百科全书
跳转至: 导航搜索

XMPPExtensible Messaging and Presence Protocol,前稱Jabber[1])是一种以XML為基礎的開放式即時通訊協定,是經由網際網路工程工作小組(IETF)通過的網際網路標準。XMPP因为被Google Talk应用而被广大网民所接触。

歷史[编辑]

Jabber
 
XMPP

Jeremie Miller于1998年开始了这个项目。第一个公开版本于2000年5月发行。这个项目的主要产品是jabberd,XMPP的服务器端软件。它既可以创建私人的XMPP网络,也可以加入全球的公共XMPP网络。XMPP的關鍵特色是,分散式的即時通訊系統,以及使用XML串流。

Jabber已经由IETF XMPP协议(RFC3920)标准化。

Jabber是一個開放源碼形式組織產生的網絡即時通信協議。XMPP原本是為即时通讯而量身定製,但由於XML Stanza本身是XML元素,在基於XML靈活發展的特性下,使得XMPP也可以適用其他方面,已經得到了IETF的批准。XMPP與IMPPPRIMSIPSIMPLE)合稱四大IM協議主流,在此4大协议中,XMPP是最灵活的。

2005年,Google发布了Google Talk,這是一個IP電話及即時通訊的服務,即时通讯功能採用了開放的XMPP。预计这将对XMPP社区起很大的推动作用。初期此服務不支援伺服器到伺服器的通讯功能,所以未能完全發揮XMPP的分散式特色;雖然任何XMPP客戶端都能連接到Google Talk,但是用戶若欲登入Google Talk,必須擁有Google Talk帳號(即Gmail帳號),而用戶也無法與公共XMPP網路的用戶對談。自2006年1月17日起,伺服器到伺服器的通訊啟用了,Google Talk用戶可與其他XMPP公共網路的用戶對談。2013年5月,Google Talk升级为Hangouts,不再支持服务器到服务器的通讯。[2]

2007年,2001年成立的Jabber軟件基金會更名為XMPP標準基金會[3]

特色[编辑]

優點[编辑]

開放
XMPP協议是自由、開放、公開的,並且易於瞭解。而且在客戶端伺服器元件源碼庫等方面,都已經各自有多種實作。
標準
網際網路工程工作小組(IETF)已經將Jabber的核心XML串流協定以XMPP之名,正式列為認可的即時通訊及Presence技術。而XMPP的技術規格已被定義在RFC 3920RFC 3921。任何IM供应商在遵循XMPP协议下,都可與Google Talk实现连接。
證實可用
第一個Jabber(现在XMPP)技術是Jeremie Miller在1998年開發的,現在已經相當穩定;數以百計的開發者為XMPP技術而努力。今日的網際網路上有數以萬計的XMPP伺服器運作著,並有數以百萬計的人們使用XMPP即時傳訊軟體。
分散式
XMPP網路的架構和電子郵件十分相像;XMPP核心协议通信方式是先建立一个stream,XMPP以TCP傳遞XML資料流,沒有中央主服務器。任何人都可以運行自己的XMPP伺服器,使個人及組織能夠掌控他們的即時傳訊體驗。
安全
任何XMPP協議的伺服器可以獨立於公眾XMPP網路(例如在企業內部網路中),而使用SASLTLS等技術的可靠安全性,已內建於核心XMPP技術規格中。
可擴展
XML命名空間的威力可使任何人在核心協定的基礎上建造客製化的功能;為了維持通透性,常見的擴充套件由XMPP標準基金會英语XMPP Standards Foundation
彈性佳
XMPP除了可用在即時通訊的應用程式,還能用在網路管理、內容供稿、協同工具、檔案共享、遊戲、遠端系統監控等。
多樣性
用XMPP協定來建造及布署即時應用程式及服務的公司及開放源碼計劃分布在各種領域;用XMPP技術開發軟體,資源及支援的來源是多樣的,使得使你不會陷於被「綁架」的困境。

缺點[编辑]

資料負載太重 
隨著通常超過70%的XMPP協議的服務器的資料流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的資料提供給多個收件人。新的議定書正在研究,以減輕這一問題。
沒有二進制資料 
XMPP協議的方式被編碼為一個單一的長的XML文件,因此無法提供修改二進制資料。因此, 文件傳輸協議一樣使用外部的HTTP。如果不可避免,XMPP協議還提供了帶編碼的文件傳輸的所有資料使用的Base64。至於其他二進制資料加密會話(encrypted conversations)或圖形圖標(graphic icons)以嵌入式使用相同的方法。

運作方式[编辑]

XMPP網路是基於伺服器的(即客戶端之間彼此不直接交談),但是也是分散式的。不像AOL即時通或MSN Messenger等服務,XMPP沒有中央官方伺服器。Jabber.org的公眾伺服器上有大量的用戶,所以有些人誤解了,以為它是官方伺服器,不過事實上任何人都可以在自己的網域上運行XMPP伺服器。

Jabber識別符(JID)是用戶登入時所使用的帳號,看起来通常像一个电子邮件地址,如someone@example.com;前半部分为用户名,后半部分为XMPP服务器域名,兩個欄位以@符號區隔。

假設朱麗葉(juliet@capulet.com)想和羅密歐(romeo@montague.net)通話,他們兩人的帳號分別在Capulet.com及Montague.net的伺服器上。當朱麗葉輸入訊息並按下傳送鈕之後,一連串的事件就發生了:

  1. 朱麗葉的XMPP客戶端將她的訊息傳送到Capulet.com XMPP伺服器。
  2. Capulet.com XMPP伺服器開啟與Montague.net XMPP伺服器的連接。
  3. Montague.net XMPP伺服器將訊息寄送給羅密歐。如果他目前不在線上,那麼儲存訊息以待稍後寄送。
Juliet
\leftrightarrow
Capulet.com
\leftrightarrow
Montague.net
\leftrightarrow
Romeo

羅密歐與朱麗葉兩人的XMPP服務是由兩家不同的業者所提供的,而他們彼此傳訊時,不須擁有對方伺服器的帳號,也不須成為對方業者的會員。

與其他協議互聯[编辑]

各IM之間的互傳

XMPP協議的另一功能是運輸(transports),也被稱為網關(gateways),可允許用戶透過網路使用其它協議。這可以是其他的即時通訊協議,也可以是不同協議,如短訊(SMS)或電子郵件。

XMPP協議通過HTTP運輸[编辑]

在原來的規格,XMPP協議可以使用HTTP的方式有兩種:輪詢(polling)[4]與綁定(binding)[5]。輪詢現在不推薦,基本上,輪詢意味著HTTP郵件存儲在服務器端的資料庫上,客戶端必須一再地以HTTP的GET和POST的方式去抓取(以及刊出)其中的訊息。然而使用綁定的方式時,客戶端會保留一個長存的HTTP連線,等待一旦伺服器有新的訊息時,就立刻接收訊息。因為輪詢的結果往往是伺服端沒有新訊息,這種推送的通知模式比輪詢的方式更有效率。

由於客戶端使用HTTP,大多數防火牆允許客戶端獲取和留言沒有任何障礙。因此,即使使用XMPP協議的TCP端口被攔截,服務器也能正常地傾聽一般的HTTP端口,其上的訊息也能保持暢通。還有一些網站更允許大眾經由瀏覽器登入進XMPP。尤有甚者,還有一些公共的伺服器同時擁有標準HTTP(80埠)和HTTPS(443埠),因此又有助於通過防火牆。

實現[编辑]

XMPP客户端软件[编辑]

XMPP協議是由大量的XMPP協議的客戶端,服務器和程式庫。主要的文章包含了幾個XMPP協議清單客戶的多種平台。

XMPP服务器端软件[编辑]

使用XMPP协议的客户端与服务器端对话的例子[编辑]

客户端(kuusipuu)连接到一个XMPP服务器(amessage.de:5222/TCP),发送一条消息(主题和内容均为“test 1449”)到另一个客户端(tero),然后登出。

kuusipuu:

<?xml version="1.0"?>
<stream:stream xmlns:stream="http://etherx.jabber.org/streams"
xmlns="jabber:client" to="amessage.de">

amessage.de:

<stream:stream xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
from='amessage.de' id='1461777714'>

kuusipuu:

<iq type="set" id="auth_2" to="amessage.de" >
<query xmlns="jabber:iq:auth">
  <username>kuusipuu</username>
  <password>mypassword</password>
  <resource>Work</resource>
 </query>
</iq>

amessage.de:

<iq from="amessage.de" id='auth_2' type='result'/>

kuusipuu:

<message to="tero@example.com" >
<subject>test 1449</subject>
<body>test 1449</body>
</message>
<presence type="unavailable" >
<status>Logged out</status>
</presence>
</stream:stream>

amessage.de:

</stream:stream>

參見[编辑]

注釋[编辑]

外部連結[编辑]