xmpp即時通訊詳解

2021-06-20 08:19:00 字數 4651 閱讀 3626

摘要:

此文件定義了可擴充套件訊息出席協議(xmpp)的核心特性:協議使用xml元素在任意兩個網路端點間近實時的交換結構化資訊。當xmpp為交換xml資料提供一般化,可擴充套件的框架時,它主要用於建立滿足rfc2779的即時訊息與出席應用的需求。

1 介紹

1.1 概要

xmpp是乙個開放的可擴充套件標記語言[xml]協議,用於近實時的訊息、出席與請求-響應服務。基本語法語義最初是由jabber開源社群在2023年開發的。2023年,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位址的資源識別符號來區別(例如:vs. )。客戶端與伺服器的推薦連線埠為5222,已由iana註冊(參考埠編號(15.9節))。

2.4 閘道器

閘道器是伺服器端的一種特殊服務,它的主要功能是將xmpp翻譯成外部訊息系統所使用的協議(非xmpp),也可將資料翻譯回xmpp。例如email閘道器(參考[smtp]),internet relay chat(參考[irc]),******(參考[siimple],session initiation protocol for instant messaging and presence leveraging extensions),短訊息服務(sms),遺留即時訊息服務,諸如aim,icq,msn messenger,yahoo! instant messenger。閘道器與伺服器間的通訊,閘道器與外部訊息系統間的通訊,均未在此文件中定義。

2.5 網路

由於每個伺服器由網路位址指定,並且由於伺服器與伺服器間的通訊是客戶與伺服器協議的直接擴充套件,實際上,系統由互相通訊的伺服器網路組成。舉個例子,能與交換訊息、出席,以及其它資訊。這是使用網路定址標準的訊息協議(例如[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均基於前述規則。此結構最普通的用法就是使用者以形式標識乙個即時訊息使用者、使用者連線的伺服器、使用者連線的資源(例如:特別的客戶端)。

然而,結點型別可能不僅是客戶端,舉個例子,乙個提供多使用者聊天服務的特別聊天室,可以以(「room」是聊天室名,「service」是多使用者聊天服務的主機名)作為位址。並且,此聊天室的特別擁有者可能以(「nick」是此擁有者的房間暱稱)作位址,許多其它jid型別均有可能(例如:可能是乙個伺服器端指令碼或服務)。

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」,形式為

結點識別符號必須像the nodeprep profile of [stringprep]這樣格式化,可以無錯應用。比較兩個結點識別符號之前,伺服器必須(客戶端應該)首先對每個識別符號應用nameprep profile。

3.4 資源識別符號

資源識別符號是乙個可選的第三位識別符號,位於域識別符號之後,後跟『/』作為分隔符。資源識別符號可以修改也可以只是位址。它通常表示乙個特別的會話、連線(例如:乙個裝置或位置),或屬於帶有節點識別符號的物件(例如:在多使用者聊天室的乙個參與者)。當提供必要的資訊來完成資源繫結(第7節)時,資源識別符號對伺服器與其它客戶端均不透明,並且由客戶端實現來定義,以後,它作為乙個「已連線資源」參考。實體可能同時維護多連線,每個已連線的資源均由資源識別符號來進行區別。

資源識別符號必須按resourceprep profile of [stringprep]格式化,才能無錯應用。比較兩個資源識別符號前,伺服器必須(客戶端應該)首先為每個識別符號應用resourceprep profile。

3.5 決定位址

sasl協商後(第6節),如果正確,資源繫結(第7節),流接收實體必須決定初始實體的jid。

如果sasl協商(第6節)期間未指定授權身份,對伺服器與伺服器間的通訊,初始實體的jid應當被授權身份,派生於認證身份,在sasl(****** authentication and security layer簡單授權與安全層)說明[sasl]中定義。

如果sasl協商(第6節)期間未指定授權身份,對客戶端到伺服器的通訊,「bare jid」()應該被授權身份,被派生於授權認證,定義在[sasl]。在資源繫結期間(第7節)「full jid」()的資源識別符號部分應當是客戶端與伺服器間協商的資源識別符號。

接收實體必須確保結果jid(包括結點識別符號,域識別符號,資源識別符號,分隔符)遵從此節中前面所定義的規則與格式;為滿足此限制,接收實體可能需要替代由接收實體所決定的規範的jid初始實體所傳送的jid。

基於XMPP協議的即時通訊

最近公司的專案需要用到即時通訊技術,就花了一點時間對即時通訊技術進行研究。經過調研發現,通過openfire spark smack就可以實現。廢話不多說,下面我們就來講一下具體的實現。1.什麼叫openfire?openfire是乙個即時通訊伺服器,也稱之為即時通訊平台。它是基於xmpp協議的,大...

即時通訊之xmpp協議簡析

最近的專案用到了阿里百川即時通訊雲。按照官網的demo以及官方開發文件整合和開發的過程還是相當的順利的。因此,今天在這裡我並不打算贅述開發過程,而是簡單談一下自己對於即時通訊的原理的理解。目前im有四種協議 即時資訊和空間協議 impp 空間和即時資訊協議 prim 針對即時通訊和空間平衡擴充的程序...

mysql 即時通訊 即時通訊IM模板

更新記錄 1.0.3 2020 10 22 完成點對點通訊功能,修復若 ug。1.0.2 2020 06 02 1 增加登入 註冊 個人資訊頁面 speedy im 注意介紹 正在持續開發中,目前僅部分ui開發完成。demo im.apk 已有基礎ui以及登陸 點到點聊天等功能。開發客戶端測試賬號密...