XMPP協(xié)議學(xué)習(xí)筆記

轉(zhuǎn)載自 :?http://blog.csdn.net/imyfriend/article/details/8584360

一屯蹦、定義

? ? ? ?XMPP 是一種很類(lèi)似于http協(xié)議的一種數(shù)據(jù)傳輸協(xié)議,它的過(guò)程就如同“解包裝--〉包裝”的過(guò)程垮兑,用戶只需要明白它接受的類(lèi)型,并理解它返回的類(lèi)型茁瘦,就可以很好的利用xmpp來(lái)進(jìn)行數(shù)據(jù)通訊。

XMPP(可擴(kuò)展消息處理現(xiàn)場(chǎng)協(xié)議)是基于可擴(kuò)展標(biāo)記語(yǔ)言(XML)的協(xié)議坠韩,它用于即時(shí)消息(IM)以及在線現(xiàn)場(chǎng)探測(cè)。它在促進(jìn)服務(wù)器之間的準(zhǔn)即時(shí)操作炼列。這個(gè)協(xié)議可能最終允許因特網(wǎng)用戶向因特網(wǎng)上的其他任何人發(fā)送即時(shí)消息只搁,即使其操作系統(tǒng)和瀏覽器不同。

XMPP的前身是Jabber俭尖,一個(gè)開(kāi)源形式組織產(chǎn)生的網(wǎng)絡(luò)即時(shí)通信協(xié)議氢惋。XMPP目前被IETF國(guó)際標(biāo)準(zhǔn)組織完成了標(biāo)準(zhǔn)化工作。標(biāo)準(zhǔn)化的核心結(jié)果分為兩部分目溉;

核心協(xié)議

擴(kuò)展協(xié)議(XEP: XMPP Extension Protocol)

XMPP的核心協(xié)議的定義使得XMPP能夠在一個(gè)比以往網(wǎng)絡(luò)通信協(xié)議更規(guī)范的平臺(tái)上明肮。借助于XML易于解析和閱讀的特性,使得XMPP的協(xié)議能夠非常漂亮缭付。

XMPP的擴(kuò)展協(xié)議是根據(jù)IETF在這之前對(duì)即時(shí)通訊的一個(gè)抽象定義的柿估,與其他業(yè)已得到廣泛使用的即時(shí)通訊協(xié)議,諸如AIM陷猫,QQ等有功能完整秫舌,完善等先進(jìn)性。

XMPP的擴(kuò)展協(xié)議Jingle使得其支持語(yǔ)音和視頻绣檬。

XMPP的官方文檔是RFC 3920足陨。

二、網(wǎng)絡(luò)結(jié)構(gòu)

XMPP中定義了三個(gè)角色娇未,客戶端墨缘,服務(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吃溅。


注意,分屬于不同server的client之間要通信的話鸯檬,中間不能再經(jīng)過(guò)其他server罕偎,這2個(gè)server必須直接通信。對(duì)于XMPP來(lái)說(shuō)京闰,server不能象email server那樣颜及,中間可以經(jīng)過(guò)若干個(gè)server才能把郵件發(fā)送到目的地甩苛。

2.1 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ù)類(lèi)型墨林。

XMPP 將復(fù)雜性從客戶端轉(zhuǎn)移到服務(wù)器端。這使得客戶端編寫(xiě)變得非常容易犯祠,更新系統(tǒng)功能也同樣變得容易旭等。XMPP 客戶端與服務(wù)端通過(guò)XML 在TCP 套接字的5222 端口進(jìn)行通信,而不需要客戶端之間直接進(jìn)行通信衡载。

基本的XMPP 客戶端必須實(shí)現(xiàn)以下標(biāo)準(zhǔn)協(xié)議(XEP-0211):

RFC3920 核心協(xié)議Core

RFC3921 即時(shí)消息和出席協(xié)議Instant Messaging and Presence

XEP-0030 服務(wù)發(fā)現(xiàn)Service Discovery

XEP-0115 實(shí)體能力Entity Capabilities

2.2?XMPP服務(wù)器

XMPP 服務(wù)器遵循兩個(gè)主要法則:

監(jiān)聽(tīng)客戶端連接搔耕,并直接與客戶端應(yīng)用程序通信;

與其他 XMPP 服務(wù)器通信痰娱;

XMPP開(kāi)源服務(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)。

基本的XMPP 服務(wù)器必須實(shí)現(xiàn)以下標(biāo)準(zhǔn)協(xié)議

RFC3920 核心協(xié)議Core

RFC3921 即時(shí)消息和出席協(xié)議Instant Messaging and Presence

XEP-0030 服務(wù)發(fā)現(xiàn)Service Discovery

2.3?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)有公開(kā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ò)展性。

三肾筐、系統(tǒng)特點(diǎn)

客戶機(jī)/服務(wù)器通信模式哆料;

分布式網(wǎng)絡(luò);

簡(jiǎn)單的客戶端吗铐;

XML的數(shù)據(jù)格式东亦;

四、地址格式

XMPP的地址叫做JabberID(簡(jiǎn)寫(xiě)為JID)抓歼,它用來(lái)標(biāo)示XMPP網(wǎng)絡(luò)中的各個(gè)XMPP實(shí)體讥此。JID由三部分組成:domain,node identifier和resource谣妻。JID中domain是必不可少的部分萄喳。注意:domain和user部分是不分大小寫(xiě)的,但是resource區(qū)分大小寫(xiě)蹋半。

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種類(lèi)有:

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:

五、通信原語(yǔ)

XMPP通信原語(yǔ)有3種:message瘸恼、presence和iq劣挫。

5.1 message

message是一種基本推送消息方法,它不要求響應(yīng)钞脂。主要用于IM揣云、groupChat、alert和notification之類(lèi)的應(yīng)用中冰啃。

主要屬性如下:

5.1.1?type屬性邓夕,它主要有5種類(lèi)型:

normal:類(lèi)似于email,主要特點(diǎn)是不要求響應(yīng)阎毅;

chat:類(lèi)似于qq里的好友即時(shí)聊天焚刚,主要特點(diǎn)是實(shí)時(shí)通訊;

groupchat:類(lèi)似于聊天室里的群聊扇调;

headline:用于發(fā)送alert和notification矿咕;

error:如果發(fā)送message出錯(cuò),發(fā)現(xiàn)錯(cuò)誤的實(shí)體會(huì)用這個(gè)類(lèi)別來(lái)通知發(fā)送者出錯(cuò)了狼钮;

5.1.2?to屬性:標(biāo)識(shí)消息的接收方碳柱。

5.1.3?from屬性:指發(fā)送方的名字或標(biāo)示。為防止地址外泄熬芜,這個(gè)地址通常由發(fā)送者的server填寫(xiě)莲镣,而不是發(fā)送者。

載荷(payload):例如body涎拉,subject

例子:

to="lily@jabber.org/contact"

type="chat" >

你好瑞侮,在忙嗎

5.2 presence

presence用來(lái)表明用戶的狀態(tài),如:online鼓拧、away半火、dnd(請(qǐng)勿打擾)等。當(dāng)改變自己的狀態(tài)時(shí)季俩,就會(huì)在stream的上下文中插入一個(gè)Presence元素钮糖,來(lái)表明自身的狀態(tài)。要想接受presence消息酌住,必須經(jīng)過(guò)一個(gè)叫做presence subscription的授權(quán)過(guò)程店归。

5.2.1 屬性

5.2.1.1 type屬性,非必須赂韵。有以下類(lèi)別

subscribe:訂閱其他用戶的狀態(tài)

probe:請(qǐng)求獲取其他用戶的狀態(tài)

unavailable:不可用娱节,離線(offline)狀態(tài)

5.2.1.2 to屬性:標(biāo)識(shí)消息的接收方挠蛉。

5.2.1.3 from屬性:指發(fā)送方的名字或標(biāo)示祭示。

5.2.2 載荷(payload):

5.2.2.1 show:

chat:聊天中

away:暫時(shí)離開(kāi)

xa:eXtend Away,長(zhǎng)時(shí)間離開(kāi)

dnd:勿打擾

5.2.2.2 status:格式自由,可閱讀的文本质涛。也叫做rich presence或者extended presence稠歉,常用來(lái)表示用戶當(dāng)前心情,活動(dòng)汇陆,聽(tīng)的歌曲怒炸,看的視頻,所在的聊天室毡代,訪問(wèn)的網(wǎng)頁(yè)阅羹,玩的游戲等等。

5.2.2.3 priority:范圍-128~127教寂。高優(yōu)先級(jí)的resource能接受發(fā)送到bare JID的消息捏鱼,低優(yōu)先級(jí)的resource不能。優(yōu)先級(jí)為負(fù)數(shù)的resource不能收到發(fā)送到bare JID的消息酪耕。

例子:

xa

down the rabbit hole!

5.3 iq (Info / Query)

一種請(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)前域值。類(lèi)似于http get方法谷炸。

Set :設(shè)置或替換get查詢的值北专。類(lèi)似于http put方法。

Result :說(shuō)明成功的響應(yīng)了先前的查詢旬陡。類(lèi)似于http狀態(tài)碼200拓颓。

Error: 查詢和響應(yīng)中出現(xiàn)的錯(cuò)誤。

例子:

id="rr82a1z7"

to="alice@wonderland.lit"

type="get">

備注:

1描孟、單詞縮寫(xiě):

IETF:?Internet Engineering Task Force.

XSF:?XMPP Standards Foundation.

XEP: XMPP Extension Protocols.

URI:?Uniform Resource Identifier

TLS: Transport Layer Security

SASL: Simple Authentication and Security Layer

BOSH: Bidirectional-streams Over Synchronous HTTP

2驶睦、參考資料

XMPP協(xié)議的原理介紹

RFC3920

XMPP: The Definitive Guide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匿醒,隨后出現(xiàn)的幾起案子场航,更是在濱河造成了極大的恐慌,老刑警劉巖廉羔,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溉痢,死亡現(xiàn)場(chǎng)離奇詭異餐曹,居然都是意外死亡鹤盒,警方通過(guò)查閱死者的電腦和手機(jī)释牺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)才写,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人镀娶,你說(shuō)我怎么就攤上這事立膛。” “怎么了梯码?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵宝泵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我轩娶,道長(zhǎng)鲁猩,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任罢坝,我火速辦了婚禮廓握,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘁酿。我一直安慰自己隙券,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布闹司。 她就那樣靜靜地躺著娱仔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪游桩。 梳的紋絲不亂的頭發(fā)上牲迫,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音借卧,去河邊找鬼盹憎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铐刘,可吹牛的內(nèi)容都是我干的陪每。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼镰吵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檩禾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疤祭,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盼产,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后勺馆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體戏售,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啦辐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜈项。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡续挟,死狀恐怖紧卒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诗祸,我是刑警寧澤跑芳,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站直颅,受9級(jí)特大地震影響博个,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜功偿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一盆佣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧械荷,春花似錦共耍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至颤诀,卻和暖如春字旭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崖叫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工遗淳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人心傀。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓洲脂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剧包。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恐锦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359