轉(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驶睦、參考資料
《RFC3920》