Xmpp

**XMPP**（全稱：E**x**tensible **M**essaging and **P**resence **P**rotocol，舊名 **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 的伺服器上。當朱麗葉輸入訊息並按下傳送鈕之後，一連串的事件就發生了：

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

羅密歐與朱麗葉兩人的 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 協定清單客戶的多種平台。

### XMPP 伺服器端軟體

## 參見

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

## 注釋

## 外部連結

* XMPP 標準基金會（頁面存檔備份，存於網際網路檔案館）
* Open list of public XMPP servers（頁面存檔備份，存於網際網路檔案館）
* XMPP Case Studies （頁面存檔備份，存於網際網路檔案館）
* XMPP (Jabber) 聊天快速指南由北京 GNU/Linux 使用者群組撰寫