XMPP

XMPP（全稱：Extensible Messaging and Presence Protocol，舊名Jabber，中文可譯為可擴展消息和表示協議）是一種以XML為基礎的開放式即時通訊協定，是經由網際網路工程工作小組（IETF）通過的網際網路標準。

## 歷史

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是最靈活的。

2007年，2001年成立的Jabber軟體基金會更名為XMPP標準基金會。

## 特色

### 優點

開放：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網路（例如在企業內部網路中），而使用SASL及TLS等技術的可靠安全性，已內建於核心XMPP技術規格中。

可擴展：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伺服器將訊息寄送給羅密歐。如果他目前不在線上，那麼儲存訊息以待稍後寄送。

$\leftrightarrow$｜Capulet.com｜$\leftrightarrow$｜Montague.net｜$\leftrightarrow$｜Romeo

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

## 與其他協議互聯

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

## XMPP協議通過HTTP運輸

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

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

## 使用實例

XMPP 伺服器的高容錯性和低開銷使得許多大公司使用 XMPP 作為其基礎平台來創建私人信使和聊天，以及提供推送通知。

- WhatsApp ~8 億使用者，使用修改後的XMPP協議進行聊天
- 藝電 ~4000 萬使用者，使用XMPP進行聊天
- Nintendo Switch NPNS ~3500萬台設備。使用XMPP傳遞新聞、通知和其他消息。
- Odnoklassniki ~4200萬使用者。使用者之間的內部消息傳遞通過XMPP客戶端提供社交網路連接。
- 英雄聯盟 ~2700萬使用者，使用XMPP進行聊天
- 無冬online ~1600萬使用者，使用XMPP進行聊天
- 堡壘之夜 ~2.5億使用者，使用XMPP進行聊天
- 星戰前夜 ~90萬使用者，使用XMPP進行聊天
- Google ~15億使用者。使用XMPP傳遞推送通知。
- 蘋果公司 ~5億使用者。使用XMPP傳遞推送通知。
- 美國國家安全局 ~使用 XMPP 進行內部通信。
- 歐洲議會 ~歐洲議會安全局建議議員使用Cisco Jabber而不是Signal或WhatsApp。

## 實現

### XMPP客戶端軟體

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

## 參見

- 即時通訊軟體比較
- 流文本定向消息協議(STOMP)，由Codehaus開發，基於文本的消息的傳輸協議，使用類似JMS的`目的地`語義。
- 高級消息隊列協議(AMQP)，一種面向消息中間件提供的開放的應用層協議。
- 消息隊列遙測傳輸(MQTT)，一種輕量級訂閱-發布協議。

## 外部連結

- XMPP標準基金會
- Open list of public XMPP servers
- XMPP Case Studies
- XMPP(Jabber) 聊天快速指南由北京GNU/Linux使用者組撰寫

## 基本資料

- 國際標準：RFC 6120 (Core) (2011)、RFC 6121 (IM & Presence) (2011)、RFC 7622 (Address Format) (2015)、RFC 3922 (CPIM) (2004)、RFC 3923 (Encryption) (2004)
- 規範發布：1999年
- 產業：即時通訊