XMPP 協(xié)議部分歸納和匯總
不只會(huì)技術(shù)的大牛
今天主要是解析一部分XMPP 中的術(shù)語(yǔ), 內(nèi)容有抄襲的嫌疑,主要是后續(xù)開發(fā)里面會(huì)有很多的新名稱出來(lái), 還不如整理到一篇文章中, 方便后續(xù)開發(fā)的碰到新名詞好來(lái)查詢方便
1.XMPP協(xié)議網(wǎng)絡(luò)架構(gòu)
XMPP是一個(gè)典型的C/S架構(gòu),而不是像大多數(shù)即時(shí)通訊軟件一樣,使用P2P客戶端到客戶端的架構(gòu),也就是說(shuō)在大多數(shù)情況下,當(dāng)兩個(gè)客戶端進(jìn)行通訊時(shí),他們的消息都是通過(guò)服務(wù)器傳遞的(也有例外,例如在兩個(gè)客戶端傳輸文件時(shí)).采用這種架構(gòu),主要是為了簡(jiǎn)化客戶端,將大多數(shù)工作放在服務(wù)器端進(jìn)行,這樣,客戶端的工作就比較簡(jiǎn)單,而且,當(dāng)增加功能時(shí),多數(shù)是在服務(wù)器端進(jìn)行.XMPP服務(wù)的框架結(jié)構(gòu)如下圖所示.XMPP中定義了三個(gè)角色,XMPP客戶端,XMPP服務(wù)器、網(wǎng)關(guān).通信能夠在這三者的任意兩個(gè)之間雙向發(fā)生.服務(wù)器同時(shí)承擔(dān)了客戶端信息記錄、連接管理和信息的路由功能.網(wǎng)關(guān)承擔(dān)著與異構(gòu)即時(shí)通信系統(tǒng)的互聯(lián)互通,異構(gòu)系統(tǒng)可以包括SMS(短信)、MSN、ICQ等.基本的網(wǎng)絡(luò)形式是單客戶端通過(guò)TCP/IP連接到單服務(wù)器,然后在之上傳輸XML,工作原理是:
(1)節(jié)點(diǎn)連接到服務(wù)器;
(2)服務(wù)器利用本地目錄系統(tǒng)中的證書對(duì)其認(rèn)證;
(3)節(jié)點(diǎn)指定目標(biāo)地址,讓服務(wù)器告知目標(biāo)狀態(tài);
(4)服務(wù)器查找、連接并進(jìn)行相互認(rèn)證;
(5)節(jié)點(diǎn)之間進(jìn)行交互.
2.XMPP客戶端
XMPP 系統(tǒng)的一個(gè)設(shè)計(jì)標(biāo)準(zhǔn)是必須支持簡(jiǎn)單的客戶端。事實(shí)上,XMPP 系統(tǒng)架構(gòu)對(duì)客戶端只有很少的幾個(gè)限制。一個(gè)XMPP 客戶端必須支持的功能有:
通過(guò) TCP 套接字與XMPP 服務(wù)器進(jìn)行通信;
解析組織好的 XML 信息包;
理解消息數(shù)據(jù)類型。
XMPP 將復(fù)雜性從客戶端轉(zhuǎn)移到服務(wù)器端。這使得客戶端編寫變得非常容易,更新系統(tǒng)功能也同樣變得容易。XMPP 客戶端與服務(wù)端通過(guò)XML 在TCP 套接字的5222 端口進(jìn)行通信,而不需要客戶端之間直接進(jìn)行通信。
3.XMPP服務(wù)器
XMPP 服務(wù)器遵循兩個(gè)主要法則:
l 監(jiān)聽客戶端連接,并直接與客戶端應(yīng)用程序通信;
l 與其他 XMPP 服務(wù)器通信;
XMPP開源服務(wù)器一般被設(shè)計(jì)成模塊化,由各個(gè)不同的代碼包構(gòu)成,這些代碼包分別處理Session管理、用戶和服務(wù)器之間的通信、服務(wù)器之間的通信、DNS(Domain Name System)轉(zhuǎn)換、存儲(chǔ)用戶的個(gè)人信息和朋友名單、保留用戶在下線時(shí)收到的信息、用戶注冊(cè)、用戶的身份和權(quán)限認(rèn)證、根據(jù)用戶的要求過(guò)濾信息和系統(tǒng)記錄等。另外,服務(wù)器可以通過(guò)附加服務(wù)來(lái)進(jìn)行擴(kuò)展,如完整的安全策略,允許服務(wù)器組件的連接或客戶端選擇,通向其他消息系統(tǒng)的網(wǎng)關(guān)。
4.XMPP網(wǎng)關(guān)
XMPP 突出的特點(diǎn)是可以和其他即時(shí)通信系統(tǒng)交換信息和用戶在線狀況。由于協(xié)議不同,XMPP 和其他系統(tǒng)交換信息必須通過(guò)協(xié)議的轉(zhuǎn)換來(lái)實(shí)現(xiàn),目前幾種主流即時(shí)通信協(xié)議都沒(méi)有公開,所以XMPP 服務(wù)器本身并沒(méi)有實(shí)現(xiàn)和其他協(xié)議的轉(zhuǎn)換,但它的架構(gòu)允許轉(zhuǎn)換的實(shí)現(xiàn)。實(shí)現(xiàn)這個(gè)特殊功能的服務(wù)端在XMPP 架構(gòu)里叫做網(wǎng)關(guān)(gateway)。目前,XMPP 實(shí)現(xiàn)了和AIM、ICQ、IRC、MSN Massager、RSS0.9 和Yahoo Massager 的協(xié)議轉(zhuǎn)換。由于網(wǎng)關(guān)的存在,XMPP 架構(gòu)事實(shí)上兼容所有其他即時(shí)通信網(wǎng)絡(luò),這無(wú)疑大大提高了XMPP 的靈活性和可擴(kuò)展性。
5.XMPP地址格式
一個(gè)實(shí)體在XMPP網(wǎng)絡(luò)結(jié)構(gòu)中被稱為一個(gè)接點(diǎn),它有唯一的標(biāo)示符jabber identifier(JID),即實(shí)體地址,用來(lái)表示一個(gè)Jabber用戶,但是也可以表示其他內(nèi)容,例如一個(gè)聊天室.一個(gè)有效的JID包括一系列元素:(1)域名(domain identifier);(2)節(jié)點(diǎn)(node identifier);(3)源(resource identifier).它的格式是node@domain/resource,node@domain,類似電子郵件的地址格式.domain用來(lái)表示接點(diǎn)不同的設(shè)備或位置,這個(gè)是可選的,例如a在Server1上注冊(cè)了一個(gè)用戶,用戶名為doom,那么a的JID就是doom@serverl,在發(fā)送消息時(shí),指明doom@serverl就可以了,resource可以不用指定,但a在登錄到這個(gè)Server時(shí),fl的JID可能是doom@serverl、exodus(如果a用Exodus軟件登錄),也可能是doom@serverl/psi(如果a用psi軟件登錄).資源只用來(lái)識(shí)別屬于用戶的位置或設(shè)備等,一個(gè)用戶可以同時(shí)以多種資源與同一個(gè)XMPP服務(wù)器連接。
6.XMPP消息格式
XMPP中定義了3個(gè)頂層X(jué)ML元素: Message、Presence、IQ,下面針對(duì)這三種元素進(jìn)行介紹。
用于在兩個(gè)jabber用戶之間發(fā)送信息。Jsm(jabber會(huì)話管理器)負(fù)責(zé)滿足所有的消息,不管目標(biāo)用戶的狀態(tài)如何。如果用戶在線jsm立即提交;否則jsm就存儲(chǔ)。 To :標(biāo)識(shí)消息的接收方。 from : 指發(fā)送方的名字或標(biāo)示(id)o Text: 此元素包含了要提交給目標(biāo)用戶的信息。 結(jié)構(gòu)如下所示: 你好,在忙嗎 用來(lái)表明用戶的狀態(tài),如:online、away、dnd(請(qǐng)勿打擾)等。當(dāng)用戶離線或改變自己的狀態(tài)時(shí),就會(huì)在stream的上下文中插入一個(gè)Presence元素,來(lái)表明自身的狀態(tài).結(jié)構(gòu)如下所示: From =‘lily @ jabber.com/contact’ To = ‘yaoman @ jabber.com/contact' Online
元素可以取下面幾種值:
Probe :用于向接受消息方法發(fā)送特殊的請(qǐng)求
subscribe:當(dāng)接受方狀態(tài)改變時(shí),自動(dòng)向發(fā)送方發(fā)送presence信息。
< IQ >
一種請(qǐng)求/響應(yīng)機(jī)制,從一個(gè)實(shí)體從發(fā)送請(qǐng)求,另外一個(gè)實(shí)體接受請(qǐng)求,并進(jìn)行響應(yīng).例如,client在stream的上下文中插入一個(gè)元素,向Server請(qǐng)求得到自己的好友列表,Server返回一個(gè),里面是請(qǐng)求的結(jié)果.
主要的屬性是type。包括:
Get :獲取當(dāng)前域值。
Set :設(shè)置或替換get查詢的值。
Result :說(shuō)明成功的響應(yīng)了先前的查詢。
Error: 查詢和響應(yīng)中出現(xiàn)的錯(cuò)誤。
結(jié)構(gòu)如下所示:
另外協(xié)議中還有一些概念需要重復(fù)一下,便于理解!
什么是stanza(節(jié))?
消息節(jié)點(diǎn)(類似于xml中的節(jié)點(diǎn)元素),可以理解為各種各樣的消息節(jié)點(diǎn)(plugin可以對(duì)這些自定義消息進(jìn)行針對(duì)性識(shí)別和處理).
RFC 3920 XMPP:核心。定義了XMPP 協(xié)議框架下應(yīng)用的網(wǎng)絡(luò)架構(gòu),引入了XML Stream(XML 流)與XML Stanza(XML 節(jié)),并規(guī)定XMPP 協(xié)議在通信過(guò)程中使用的XML 標(biāo)簽。使用XML 標(biāo)簽從根本上說(shuō)是協(xié)議開放性與擴(kuò)展性的需要。此外,在通信的安全方面,把TLS 安全傳輸機(jī)制與SASL 認(rèn)證機(jī)制引入到內(nèi)核,與XMPP 進(jìn)行無(wú)縫的連接,為協(xié)議的安全性、可靠性奠定了基礎(chǔ)。Core 文檔還規(guī)定了錯(cuò)誤的定義及處理、XML 的使用規(guī)范、JID(Jabber Identifier,Jabber 標(biāo)識(shí)符)的定義、命名規(guī)范等等。所以這是所有基于XMPP 協(xié)議的應(yīng)用都必需支持的文檔。
RFC 3921:用戶成功登陸到服務(wù)器之后,發(fā)布更新自己的在線好友管理、發(fā)送即時(shí)聊天消息等業(yè)務(wù)。所有的這些業(yè)務(wù)都是通過(guò)三種基本的XML 節(jié)來(lái)完成的:IQ Stanza(IQ 節(jié)), Presence Stanza(Presence 節(jié)), Message Stanza(Message 節(jié))。RFC3921 還對(duì)阻塞策略進(jìn)行了定義,定義是多種阻塞方式??梢哉f(shuō),RFC3921 是RFC3920 的充分補(bǔ)充。兩個(gè)文檔結(jié)合起來(lái),就形成了一個(gè)基本的即時(shí)通信協(xié)議平臺(tái),在這個(gè)平臺(tái)上可以開發(fā)出各種各樣的應(yīng)用。
什么是JID?
XMPP的地址叫做JabberID(簡(jiǎn)寫為JID),它用來(lái)標(biāo)示XMPP網(wǎng)絡(luò)中的各個(gè)XMPP實(shí)體。JID由三部分組成:domain,node identifier和resource。JID中domain是必不可少的部分。注意:domain和user部分是不分大小寫的,但是resource區(qū)分大小寫。
jid = [ node “@” ] domain [ “/” resource ]
domain = fqdn / address-literal
fqdn = (sub-domain 1*("." sub-domain))
sub-domain = (internationalized domain label)
address-literal = IPv4address / IPv6address
domain:通常指網(wǎng)絡(luò)中的網(wǎng)關(guān)或者服務(wù)器。
node identifier:通常表示一個(gè)向服務(wù)器或網(wǎng)關(guān)請(qǐng)求和使用網(wǎng)絡(luò)服務(wù)的實(shí)體(比如一個(gè)客戶端),當(dāng)然它也能夠表示其他的實(shí)體(比如在多用戶聊天系統(tǒng)中的一個(gè)房間)。
resource:通常表示一個(gè)特定的會(huì)話(與某個(gè)設(shè)備),連接(與某個(gè)地址),或者一個(gè)附屬于某個(gè)節(jié)點(diǎn)ID實(shí)體相關(guān)實(shí)體的對(duì)象(比如多用戶聊天室中的一個(gè)參加者)。
JID種類有:
bare JID:user@domain.tld
full JID:user@domain.tld/resource
例子:
stpeter@jabber.org:表示服務(wù)器jabber.org上的用戶stpeter。
room@service:一個(gè)用來(lái)提供多用戶聊天服務(wù)的特定的聊天室。這里 “room“ 是聊天室的名字, ”service“ 是多用戶聊天服務(wù)的主機(jī)名。
room@service/nick:加入了聊天室的用戶nick的地址。這里 “room“ 是聊天室的名字, ”service“ 是多用戶聊天服務(wù)的主機(jī)名,”nick“ 是用戶在聊天室的昵稱。
為了標(biāo)示JID,XMPP也有自己的URI,例如xmpp:stpeter@jabber.org,默認(rèn)規(guī)則是在JID前加 xmpp:。
上面部分基本開發(fā)中的用的最多, 比如 BareJID , 基本到處是 BareJID 和 String 的轉(zhuǎn)換
所以先提交做一章文章,記錄在這里面, 方便后續(xù)不清楚的來(lái)找
消息結(jié)構(gòu)基本就是 Message , Presence和 IQ查詢
IQ Stanza(IQ 節(jié)), Presence Stanza(Presence 節(jié)), Message Stanza(Message 節(jié))
這個(gè)也是用的很多, 消息體里面全部是 Stanza 別搞不明白
下面把一部分消息大約出來(lái), 大家就能直觀的明白了。
登錄成功后返回的消息消息
接受到的消息格式

現(xiàn)階段產(chǎn)品已經(jīng)成熟上線
鉑信 (http://botalk.net)
一款純私有化APP(包括IM,短視頻, 直播)
技術(shù)合作QQ: 8838610
不只會(huì)技術(shù)的大牛 的 2020 年之路
轉(zhuǎn)載自本人CSDN:?https://blog.csdn.net/longhai1982/article/details/111609489