XMPP
XMPP(全称:Extensible Messaging and Presence Protocol,旧名Jabber[1],中文可译为可扩展消息和表示协议)是一种以XML為基礎的開放式即時通訊協定,是經由網際網路工程工作小組(IETF)通過的網際網路標準。
國際標準 | RFC 6120 (Core) (2011) RFC 6121 (IM & Presence) (2011) |
---|---|
規範發布 | 1999年 |
使用於 | 即時通訊 |
官方网站 | 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與IMPP、PRIM、SIP(SIMPLE)合稱四大IM協議主流,在此4大协议中,XMPP是最灵活的。
特色
编辑優點
编辑- 標準
- 網際網路工程工作小組(IETF)已經將Jabber的核心XML串流協定以XMPP之名,正式列為認可的即時通訊及Presence技術。而XMPP的技術規格已被定義在RFC 3920及RFC 3921。任何IM供应商在遵循XMPP协议下,都可與Google Talk实现连接。
- 證實可用
- 第一個Jabber(现在XMPP)技術是Jeremie Miller在1998年開發的,現在已經相當穩定;數以百計的開發者為XMPP技術而努力。今日的網際網路上有數以萬計的XMPP伺服器運作著,並有數以百萬計的人們使用XMPP即時傳訊軟體。
- 分散式
- XMPP網路的架構和電子郵件十分相像;XMPP核心协议通信方式是先建立一个stream,XMPP以TCP傳遞XML資料流,沒有中央主伺服器。任何人都可以運行自己的XMPP伺服器,使個人及組織能夠掌控他們的即時傳訊體驗。
- 彈性佳
- XMPP除了可用在即時通訊的應用程式,還能用在網路管理、內容供稿、協同工具、檔案共享、遊戲、遠端系統監控等。
- 多樣性
- 用XMPP協定來建造及布署即時應用程式及服務的公司及開放源碼計劃分布在各種領域;用XMPP技術開發軟體,資源及支援的來源是多樣的,使得使你不會陷於被「綁架」的困境。
缺點
编辑- 資料負載太重
- 隨著通常超過70%的XMPP協議的伺服器的資料流量的存在和近60%的被重複轉發,XMPP協議目前擁有一個大型架空中存在的資料提供給多個收件人。新的議定書正在研究,以減輕這一問題。
- 二進制資料傳輸受限
- XMPP傳輸單一的XML文件,因此要透過XMPP傳輸二進制資料,需先將二進制資料以Base64編碼。但是大量的二進制資料傳輸,較佳的作法是用外部的其他協定傳輸,而以XMPP進行溝通。至於其他二進制資料加密會話(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的伺服器上。當朱麗葉輸入訊息並按下傳送鈕之後,一連串的事件就發生了:
- 朱麗葉的XMPP客戶端將她的訊息傳送到Capulet.com XMPP伺服器。
- Capulet.com XMPP伺服器開啟與Montague.net XMPP伺服器的連接。
- Montague.net XMPP伺服器將訊息寄送給羅密歐。如果他目前不在線上,那麼儲存訊息以待稍後寄送。
|
|
|
|
羅密歐與朱麗葉兩人的XMPP服務是由兩家不同的業者所提供的,而他們彼此傳訊時,不須擁有對方伺服器的帳號,也不須成為對方業者的會員。
與其他協議互聯
编辑XMPP協議的另一功能是運輸(transports),也被稱為網關(gateways),可允許用戶透過網路使用其它協議。這可以是其他的即時通訊協議,也可以是不同協議,如短訊(SMS)或電子郵件。
XMPP協議通過HTTP運輸
编辑在原來的規格,XMPP協議可以使用HTTP的方式有兩種:輪詢(polling)[3]與綁定(binding)[4]。輪詢現在不推薦,基本上,輪詢意味著HTTP郵件存儲在伺服器端的資料庫上,客戶端必須一再地以HTTP的GET和POST的方式去抓取(以及刊出)其中的訊息。然而使用綁定的方式時,客戶端會保留一個長存的HTTP連線,等待一旦伺服器有新的訊息時,就立刻接收訊息。因為輪詢的結果往往是伺服端沒有新訊息,這種推送的通知模式比輪詢的方式更有效率。
由於客戶端使用HTTP,大多數防火牆允許客戶端獲取和留言沒有任何障礙。因此,即使使用XMPP協議的TCP端口被攔截,伺服器也能正常地傾聽一般的HTTP端口,其上的訊息也能保持暢通。還有一些網站更允許大眾經由瀏覽器登入進XMPP。尤有甚者,還有一些公共的伺服器同時擁有標準HTTP(80埠)和HTTPS(443埠),因此又有助於通過防火牆。
使用实例
编辑XMPP 服务器的高容错性和低开销[5]使得许多大公司使用 XMPP 作为其基础平台来创建私人信使和聊天,以及提供推送通知[6]。
- WhatsApp ~8 亿用户,使用修改后的XMPP协议进行聊天
- 艺电 ~4000 万用户,使用XMPP进行聊天
- Nintendo Switch NPNS ~3500万台设备。使用XMPP传递新闻、通知和其他消息。[7]
- Odnoklassniki ~4200万用户。 用户之间的内部消息传递通过XMPP客户端提供社交网络连接。
- 英雄联盟 ~2700万用户,使用XMPP进行聊天
- 无冬online ~1600万用户,使用XMPP进行聊天
- 堡垒之夜 ~2.5亿用户,使用XMPP进行聊天
- 星战前夜 ~90万用户,使用XMPP进行聊天
- Google ~15亿用户。使用XMPP传递推送通知。
- 蘋果公司 ~5亿用户。使用XMPP传递推送通知。
- 美国国家安全局 ~使用 XMPP 进行内部通信。[8]
- 欧洲议会 ~欧洲议会安全局建议议员使用Cisco Jabber而不是Signal或WhatsApp。[9]
實現
编辑XMPP客户端软件
编辑XMPP協議是由大量的XMPP協議的客戶端,伺服器和程式庫。主要的文章包含了幾個XMPP協議清單客戶的多種平台。
XMPP服务器端软件
编辑參見
编辑- 即时通讯软件比较
- 流文本定向消息協議(STOMP),由Codehaus開發,基於文本的消息的傳輸協議,使用類似JMS的`目的地`語義;
- 高級消息隊列協議(AMQP),一種面向消息中間件提供的開放的應用層協議;
- 消息隊列遙測傳輸(MQTT),一種輕量級訂閱-發布協議。
注釋
编辑- ^ Jabber Inc. - About Us. [2009-09-14]. (原始内容存档于2007-07-03).
- ^ Jabber Software Foundation Renamed to XMPP Standards Foundation (页面存档备份,存于互联网档案馆) 1月16日2007年 - jabber.org (页面存档备份,存于互联网档案馆)仍旧被维护
- ^ XEP-0025: Jabber HTTP Polling. [2009-09-08]. (原始内容存档于2020-10-29).
- ^ XEP-0124: Bidirectional-streams Over Synchronous HTTP (BOSH). [2009-09-08]. (原始内容存档于2021-02-13).
- ^ ejabberd Massive Scalability: 1 Node — 2+ Million Concurrent Users | ProcessOne Blog. [2018-06-22]. (原始内容存档于2018-06-22).
- ^ Uses of XMPP. [2018-06-22]. (原始内容存档于2018-06-22).
- ^ ejabberd & Nintendo Switch NPNS | ProcessOne Blog. [2019-06-05]. (原始内容存档于2019-06-05).
- ^ АНБ использует протокол Jabber для чатов — «Хакер». [2018-06-24]. (原始内容存档于2018-06-25).
- ^ EU-Parlament empfiehlt Jabber statt WhatsApp und prüft Signal | heise online. [2019-10-19]. (原始内容存档于2019-10-19).