Asmack開發係列之XMPP基礎
今天,我們來說一下XMPP協議本身的一些東西。畢竟Asmack隻是該協議的一個實現版本。所以,我們又必要了解XMPP協議本身。
1,架構
什麼是架構,架構就是一係列實體如何組織、聯係和交換信息。例如萬維網,由成千上萬的服務器,他們運行著Apache或者是新的Nginx,客戶端由web瀏覽器,如IE,firefox和Chrome。他們之間交換的數據是HTML,他們之間交換數據的協議是HTTP。
類似的,對於即時通信,也有自己的架構。它的服務器端一般跑著像Openfire和ejabberd這樣服務器軟件,客戶端一般有像Adium,Gajim,Pidgin等。XMPP是協議,但為了描述方便,我也會那它當做是我們整個這類軟件,架構的代名詞。xmpp是decentralized client-server architecture,去中心化的客戶端-服務器架構。怎麼理解?就是它有服務器,不是純種的peer-to-peer那種架構,這樣管理方便,更可靠。但它的服務器不是一個,不是單點,而是散耦合的,這樣就魯棒。這也就得支持服務器到服務器的通信。
但是,xmpp和www是有區別的,萬維網的服務器是不會為你轉發信息的,它很少支持域間通信。這麼說吧,加入你訪問的了迅雷的一個網頁,但是這個網頁有一個URL圖片是指向優酷的,這個時候你的Chrome訪問迅雷後,還得它自己去訪問優酷來下載這個圖片,迅雷是不會為你下的然後傳給你。萬維網的示意如下:
在服務器傳遞消息這方麵,我們需要再說一下郵件係統,如下圖所示。郵件係統是多步轉發的。假如你用QQ郵箱給我的工作郵箱zengjinlong@xunlei.com發送一個郵件,首先你的郵箱客戶端會把你的郵件上傳到QQ郵箱,QQ郵箱就檢索,看是不是能夠直接投遞給迅雷郵箱服務器,假如哈,假如沒檢索到,於是騰訊就把郵件轉給了它覺得應該正確的下一步,比如說百度,百度郵箱收到之後一看,迅雷的郵件,有,於是直接轉給迅雷郵箱服務器。迅雷郵箱服務器收到之後幫你存儲,然後當你要的時候就推送給你。
xmpp呢,支持域間(服務器之間)通信,但是沒有郵件係統那麼複雜,它隻支持單步轉發。就好比剛才的郵件,如果騰訊沒有找到迅雷,他就不會說再投給百度試一下,不會的。它會選擇回複你一個不可達或者直接拋棄。如下圖所示
總結一下萬維網,郵件係統,xmpp係統的區別
2,地址
因為xmpp是一個網絡協議,包含客戶端和服務器,需要在網絡上傳輸數據。所以,他們需要一個地址。xmpp並不是直接建立在IP上,它依賴DNS(domain Name System)(事實上其實沒有域名也是可以的,至少我的係統沒有域名,但是你需要指定host(IP)和一個假定的域名(虛擬的,隨便填,但你要記得他))。xmpp的賬號都是這樣子的eg:micall@xunlei.com,後麵跟的是完整的域名。這個和傳統IM不太一樣。對了,這個唯一標示用戶的叫做JabberID(JID)。
一個JID包含三部分內容:
1)用戶名。
2)域名。
3)資源(Resources)。資源是xmpp支持一個賬號多終端登入的必要條件。還是這個賬號micall@xunlei.com,加入你在PC上登入,那麼一個完整的用戶名就是micall@xunlei/PC,加入你在你的android手機登入,micall@xunlei.com/android,你在你的ipad登入,那麼micall@xunlei/ipad。等等,這樣的機製是為了支持多終端登入,而且可以設定他們接收數據的優先級。
3,XML流
XMPP,本質上就是一種傳輸XML流的技術。和HTTP不一樣,HTTP是每次請求完之後,連接就斷開,然後要新開連接,HTTP的一些其他技術都導致它不夠實時。不能夠滿足一些例如即時通信的場合。xmpp不一樣,你可以發送多個請求,它也不會阻塞住,xmpp需要注意的是你需要用異步的思維來考慮事情。後續章節會知道。在這裏我給大家貼一個xml會話。
C: <stream:stream> C: <presence/> C: <iq type="get"> <query xmlns="jabber:iq:roster"/> </iq> S: <iq type="result"> <query xmlns="jabber:iq:roster"> <item j/> <item j/> <item j/> </query> </iq> C: <message from="queen@wonderland.lit" to="madhatter@wonderland.lit"> <body>Off with his head!</body> </message> S: <message from="king@wonderland.lit" to="party@conference.wonderland.lit"> <body>You are all pardoned.</body> </message> C: <presence type="unavailable"/> C: </stream:stream>
4,通信洪流(Communication Primitives)
對於這個標題,我暫且這麼翻譯吧,請不要吐槽,如果你有更好的名字,請留言,我將不客氣的更新這個名字。在xmpp中還有個字眼“stanzas"是非常常見的,翻譯為”局“?”節“?。我把它翻譯為”節“。它是個什麼概念呢,其實,你可以理解為packet。就是一次傳輸的數據包。
節的意義需要從以下幾個方麵來確定:
(1)節元素的名稱,例如message,presence,iq等。這幾個不同的節,服務器對它的處理時不一樣的,客戶端對他們的處理也是不一樣的。
(2)Type屬性。
(3)子節點。
下一節,我們詳細說明有哪些節以及他們的處理。
最後更新:2017-04-03 05:40:17