閱讀260 返回首頁    go 京東網上商城


xmpp即時通訊詳解

摘要:

        此文檔定義了可擴展消息出席協議(XMPP)的核心特性:協議使用XML元素在任意兩個網絡端點間近實時的交換結構化信息。當XMPP為交換XML數據提供一般化,可擴展的框架時,它主要用於建立滿足RFC2779的即時消息與出席應用的需求。

1 介紹

1.1 概要

        XMPP是一個開放的可擴展標記語言[XML]協議,用於近實時的消息、出席與請求-響應服務。基本語法語義最初是由Jabber開源社區在1999年開發的。2002年,XMPP工作組授權開發一個Jabber協議的改寫本,將適用於IETF的即時消息(IM)與出席技術。
        作為XMPP工作組的成果,此文檔定義了XMPP 1.0的核心內容;提供即時消息與出席功能的擴展需求定義在RFC2779[IM-REQS]中,由XMPP:即時消息與出席[XMPP-IM]指定。

1.2 術語

        文檔中的大寫關鍵字:"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",  "MAY", "OPTIONAL"在BCP14, 在RFC 2119 [TERMS]中描述。

2 一般架構

2.1 概述

        雖然XMPP並未與任何特定網絡架構結合,但到目前為止,它大致上已經由一個客戶-服務器的架構實現了。其中,客戶端利用XMPP訪問基於[TCP]連接的一個服務器,並且,服務器間也通過TCP連接進行彼此間的通信。
          XMPP
Client------------Server------------Server              
           TCP               TCP
        下圖為此架構的高層視圖(“-”表示使用XMPP通信,“=”表示使用任何其它協議通信)
   C1----S1---S2---C3
         |
   C2----+--G1===FN1===FC1
符號表示如下:
1) C1,C2,C3 = XMPP客戶端
2) S1,S2 = XMPP服務器
3) G1 = 網關:在XMPP與外部協議(非XMPP)的消息網絡間轉換。
4) FN1 = 外部消息網絡
5) C1 = 外部消息網絡的客戶端

2.2 服務器

        服務器作為XMPP通信擔當智能抽象層。它的主要責任是:
1) 管理連接其它實體的會話,以XML流格式(第4節)在已授權的客戶端、服務器以及其它實體間來回傳送。
2) 通過XML流在實體間路由具有合適地址的XML節(第9節)。
        大多數與XMPP兼容的服務器設想有能力存儲客戶端的數據(例:基於XMPP即時消息與出席應用的用戶的聯係列表);在這種情況下,XML數據由服務器自身代表客戶端直接處理,並不路由到其它實體。

2.3 客戶端

        大多數客戶端通過[TCP]連接直接連到服務器,並且使用XMPP,充分利用由服務器及任何相關服務所提供的功能。多種資源(例如:設備或位置)可能代表每個被授權客戶端同時連到服務器上。每個資源均由定義在地址方案(第3節)下的XMPP地址的資源標識符來區別(例如:<node@domain/home> vs. <node@domain/work>)。客戶端與服務器的推薦連接端口為5222,已由IANA注冊(參考端口編號(15.9節))。

2.4 網關

        網關是服務器端的一種特殊服務,它的主要功能是將XMPP翻譯成外部消息係統所使用的協議(非XMPP),也可將數據翻譯回XMPP。例如EMAIL網關(參考[SMTP]),Internet Relay Chat(參考[IRC]),SIMPLE(參考[SIIMPLE],Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensions),短消息服務(SMS),遺留即時消息服務,諸如AIM,ICQ,MSN Messenger,Yahoo! Instant Messenger。網關與服務器間的通信,網關與外部消息係統間的通信,均未在此文檔中定義。

2.5 網絡

        由於每個服務器由網絡地址指定,並且由於服務器與服務器間的通信是客戶與服務器協議的直接擴展,實際上,係統由互相通信的服務器網絡組成。舉個例子,<juliet@example.com>能與<romeo@example.net>交換消息、出席,以及其它信息。這是使用網絡尋址標準的消息協議(例如[SMTP])所熟悉的模式。任意兩服務器間的通信是可選的。如果可通信,此類通信就應當發生在綁定到[TCP]連接的 XML流上。服務器間連接的推薦端口為5269,由IANA注冊(參考端口編號(15.9節))

3 尋址方案

3.1 概述

        實體可被看作是使用XMPP進行通信的任意網絡端點(例如:一個網絡上的ID)。任意此類實體均以與RFC2396[URI]一致的格式來唯一設定地址。由於曆史原因,XMPP實體的地址稱作Jabber標識符或JID。一個有效JID包含一套有序元素:域標識符,結點標識符,資源標識符。
        JID的語法定義如下,使用增廣巴斯科範式[ABNF](Augmented Backus-Naur Form)。(Ipv4地址與Ipv6地址規則定義在[Ipv6]的附錄B;符合結點規則的允許字符序列由Nodeprep profile of [STRINGPREP]定義,編入本文檔的附錄A;符合資源規則的允許字符序列由Resourceprep profile of [STRINGPREP]定義,編入本文檔的附錄B;子域規則參考國際化域標識的概念,在[IDNA]中有述)。

      jid             = [ node "@" ] domain [ "/" resource ]
      domain          = fqdn / address-literal
      fqdn            = (sub-domain 1*("." sub-domain))
      sub-domain      = (internationalized domain label)
      address-literal = IPv4address / IPv6address

        所有JID均基於前述規則。此結構最普通的用法就是用戶以<user@host/resource>形式標識一個即時消息用戶、用戶連接的服務器、用戶連接的資源(例如:特別的客戶端)。
        然而,結點類型可能不僅是客戶端,舉個例子,一個提供多用戶聊天服務的特別聊天室,可以以<room@service>(“room”是聊天室名,“service”是多用戶聊天服務的主機名)作為地址。並且,此聊天室的特別擁有者可能以<room@service/nick> (“nick”是此擁有者的房間昵稱)作地址,許多其它JID類型均有可能(例如:<domain/resource>可能是一個服務器端腳本或服務)。
        JID(結點標識符,域標識符,資源標識符)的每個可允許部分長度不準超過1023字節,結果,最大總長度(包括‘@’,‘/’分隔符)為3071字節。

3.2 域標識符

        域標識符是基本標識符,且是JID中僅有的一個必須的元素(僅有域標識符的JID是有效的)。它通常表示網絡網關與“主要的”服務器,具有為其它實體間的連接進行XML路由與數據管理的能力。然而,由域標識符作為參考的實體並不總是服務器,它可能是一項以服務器子域為地址的服務,提供多於服務器(例:多用戶聊天服務,用戶目錄,或外部消息係統的一個網關)的功能。
        每個服務器或服務的域標識符將通過網絡進行通信,它可能是IP地址,並應當是完全合法的域名(參考[DNS])。域標識符必須是一個“國際化的域名”,定義在[IDNA],Nameprep [NAMEPREP] profile of stringprep [STRINGPREP]可以無錯應用。比較兩個域標識符之前,服務器必須(客戶端是應該)首先對標簽(定義在[IDNA])應用Nameprep profile,以補足每個標識符。

3.3 節點標識符

        結點標識符是一個可選的輔助標識符,放在域標識符之前,後以‘@’字符分隔。它通常表示實體請求與使用由服務器或網關(例如:一個客戶端)提供的網絡訪問,雖然它也能表示其它種類的實體(例如:有多用戶聊天服務功能的聊天室)。由結點標識符表示的實體,在特定域上下文中,在XMPP即時消息與出席應用中被加以地址,此類地址稱作“bare JID”,形式為<node@domain>
        結點標識符必須像the Nodeprep profile of [STRINGPREP]這樣格式化,可以無錯應用。比較兩個結點標識符之前,服務器必須(客戶端應該)首先對每個標識符應用Nameprep profile。

3.4 資源標識符

        資源標識符是一個可選的第三位標識符,位於域標識符之後,後跟‘/’作為分隔符。資源標識符可以修改<node@domain>也可以隻是<domain>地址。它通常表示一個特別的會話、連接(例如:一個設備或位置),或屬於帶有節點標識符的對象(例如:在多用戶聊天室的一個參與者)。當提供必要的信息來完成資源綁定(第7節)時,資源標識符對服務器與其它客戶端均不透明,並且由客戶端實現來定義,以後,它作為一個“已連接資源”參考。實體可能同時維護多連接,每個已連接的資源均由資源標識符來進行區別。
        資源標識符必須按Resourceprep profile of [STRINGPREP]格式化,才能無錯應用。比較兩個資源標識符前,服務器必須(客戶端應該)首先為每個標識符應用Resourceprep profile。

3.5 決定地址

        SASL協商後(第6節),如果正確,資源綁定(第7節),流接收實體必須決定初始實體的JID。
        如果SASL協商(第6節)期間未指定授權身份,對服務器與服務器間的通信,初始實體的JID應當被授權身份,派生於認證身份,在SASL(Simple Authentication and Security Layer簡單授權與安全層)說明[SASL]中定義。
        如果SASL協商(第6節)期間未指定授權身份,對客戶端到服務器的通信,“bare JID”(<node@domain>)應該被授權身份,被派生於授權認證,定義在[SASL]。在資源綁定期間(第7節)“full JID”(<node@domain/resource>)的資源標識符部分應當是客戶端與服務器間協商的資源標識符。
        接收實體必須確保結果JID(包括結點標識符,域標識符,資源標識符,分隔符)遵從此節中前麵所定義的規則與格式;為滿足此限製,接收實體可能需要替代由接收實體所決定的規範的JID初始實體所發送的JID。

最後更新:2017-04-03 12:54:49

  上一篇:go android 之ndk開發
  下一篇:go 客戶端的web技術