天天看點

im即時通訊開發:IM通信協定設計詳解

本文要談的IM通信協定指的是應用層通信“語言”,并非指傳輸層協定(如TCP、UDP)。IM通信協定的制定是IM開發中起點,也是貫穿設計、開發、運維始終的核心所在,通信協定設計的好壞,直接影響後緒環節的使用者體驗(資料流量、耗電量、通信速度)、相容性(新老版本的無縫融合)、擴充性(後緒的版本更新怎麼辦)等,是個基礎且極其重要的工作之一。

im即時通訊開發:IM通信協定設計詳解

IM通信協定的分層設計

所謂“協定”是雙方共同遵守的規則,例如:離婚協定,停戰協定。

協定有文法、語義、時序三要素:

(1)文法:即資料與控制資訊的結構或格式

(2)語義:即需要發出何種控制資訊,完成何種動作以及做出何種響應

(3)時序:即事件實作順序的詳細說明

一套典型的IM通信協定設計分為三層:應用層、安全層、傳輸層。

IM應用層協定設計

應用層協定選型,常見的有三種:文本協定、二進制協定、流式XML協定。

文本協定

文本協定是指 “貼近人類書面語言表達”的通訊傳輸協定,典型的協定是http協定。一個http協定大緻長成這樣:

GET / HTTP/1.1

User-Agent: curl

Host: musicml.net

Accept: */*

文本協定的特點是:

a. 可讀性好,便于調試

b. 擴充性也好(通過key:value擴充)

c. 解析效率一般(一行一行讀入,按照冒号分割,解析key和value)

d. 對二進制的支援不好 ,比如語音/視訊

IM中,MSN使用的是文本協定。

im即時通訊開發:IM通信協定設計詳解

二進制協定

二進制協定是指binary協定,典型是ip協定。

二進制協定一般定長標頭和可擴充變長包體 ,每個字段固定了含義 ,例如IP協定的前4個bit表示協定版本号 (Version)。

二進制協定有這樣一些特點:

a. 可讀性差,難于調試

b. 擴充性不好 ,如果要擴充字段,舊版協定就不相容了,是以一般設計時會有一個Version字段

c. 解析效率超高(幾乎沒有解析代價)

d. 對二進制的支援不好 ,比如語音/視訊

IM中,QQ使用的時二進制協定。

流式XML協定

IM的準标準協定xmpp就是使用流式XML,像gtalk,校内通這些im都是基于xmpp的。讓我們來看一個xmpp協定的例子:

<message

to=’[url=mailto:[email protected]][email protected][/url]’

from=’[url=mailto:[email protected]][email protected][/url]’

type=’chat’

xml : lang=’en’>

<body>Wherefore art thou, Romeo?</body>

</message>

從xml标簽中大緻可以判斷這是一個romeo發給juliet的聊天消息。xmpp協定可以實作跨域的互通。例如gtalk和校内通使用者聊天。隻要服務端實作了s2s服務(server to server) ,不過現在的im基本沒有互通需求 ,是以這個服務基本沒有人實作。即時通訊開發

XMPP協定有幾個特點:

a.它是準标準協定,可以跨域互通

b.XML的優點,可讀性好,擴充性好

c.解析代價超高(dom解析)

d.有效資料傳輸率超低(大量的标簽)

個人旗幟鮮明的強烈不建議使用xmpp,特别是無線端im,如果要用,一定要自己做壓縮 ,減少網絡流量(用過xmpp的同學都清楚,發一個登入包需要多少互動,要浪費多少流量)。

IM安全層協定設計

im協定,消息的保密性非常重要 ,誰都不希望自己聊天内容被看到,是以安全層是必不可少的。

使用SSL

證書管理微微複雜,代價有點高。

自行加解密

自己來搞加解密,核心在于密鑰的生成與管理,密鑰管理方式有多種,主要有這麼三種:

(1)固定密鑰

服務端和用戶端約定好一個密鑰,同時約定好一個加密算法(eg:AES ),每次用戶端im在發送前,就用約定好的算法,以及約定好的密鑰加密再傳輸,服務端收到封包後,用約定好的算法,約定好的密鑰再解密。這種方式,密鑰和算法對程式員都是透明的。

(2)一人一密鑰

簡單說來就是每個人的密鑰是固定的,但是每個人之間又不同,其實就是在固定密鑰的算法中包含使用者的某一特殊屬性,比如使用者uid、手機号、qq号等。

(3)動态密鑰(一session一密鑰)

動态密鑰,一Session一密鑰的安全性更高,每次會話前協商密鑰。密鑰協商的過程要經過2次非對稱密鑰的随機生成,1次對稱加密密鑰的随機生成,具體詳情這裡不展開,有興趣的同學可以看下SSL密鑰協商額過程。

IM傳輸層協定設計

可選的協定有TCP和UDP。現在的IM傳輸層基本都是使用TCP,有了epoll等技術後,多連接配接就不是瓶頸了,單機幾十萬連結沒什麼問題。

繼續閱讀