深入淺出即時通訊(1)_即時通訊協(xié)議對比

1. 即時通訊協(xié)議對比

業(yè)界上用來做即時通訊的解決方案有:1. 基于http 的輪詢; 2. 基于websocket 長連接; 3. 基于tcp或udp的自定義協(xié)議, 這種若在要在Web端使用, 需要套一層websocket 封裝. 此外早期還有基于Comet 技術(shù)的長連接课舍,基于xmpp 的開源客戶端應用等谷婆。

1.1 即時通訊協(xié)議比較

名稱 特點 Web支持 模式
http短輪詢/長輪詢 實現(xiàn)簡單; 開銷大蜈彼,耗費服務器性能與帶寬 支持 請求-響應
Websocket 連接快媒吗,開銷小 支持 雙向通訊
xmpp 協(xié)議沉重,不支持二進制包文 不支持 雙向通訊
mqtt 常用于物聯(lián)網(wǎng)場景,協(xié)議簡單 不支持 發(fā)布-訂閱
socket.io 在websocket封裝的基礎上實現(xiàn)了連接管理,群組卿操,命名空間等特性。 支持 發(fā)布-訂閱
基于tcp自定義協(xié)議 連接可靠孙援,開發(fā)難度中等 不支持 -
基于udp自定義協(xié)議 連接與發(fā)送數(shù)據(jù)不可靠害淤,開發(fā)難度大 不支持 -

1.1.1 http短輪詢/長輪詢

一個http的請求有如下的特點:

  1. 連接必須由客戶端發(fā)起, 服務端被動等待請求, 模式為請求-響應方式.
  2. 每次請求是無狀態(tài)的,每次請求之間彼此獨立.
  3. 一個http 請求包括 請求方法+請求資源地址+請求頭部+請求體拓售,見【圖1.1.1 】窥摄,同理一個http 響應包括 相應頭+響應頭部+響應體, 見【圖1.1.2 】
圖1.1.1.png
圖1.1.2.png

由于http連接必須由客戶端發(fā)起的通訊特點,服務器要往客戶推送消息础淤,必須依賴由客戶端發(fā)起的這條連接崭放。因此在http的協(xié)議上做服務端的消息推送,需要客戶端不斷輪詢鸽凶,服務器有需要發(fā)送的消息時币砂,就在輪詢結(jié)果中返回給客戶端。根據(jù)輪詢類型的不同玻侥,又分為短輪詢和長輪詢决摧。

http短輪詢:

圖1.1.3.png

短輪詢的處理如下:

  1. 客戶端請求服務器,服務器立即返回;
  2. 客戶端間隔一段時間;
  3. 客戶端請求服務器凑兰,服務器立即返回;

**http長輪詢: **

1.1.4.png

短輪詢的處理如下:

  1. 客戶端請求服務器掌桩,服務器若有數(shù)據(jù),立即返回姑食,否則阻塞等待;
  2. 客戶端再次請求服務器波岛,服務器若有數(shù)據(jù),立即返回音半,否則阻塞等待;

總結(jié): 不管是http短輪詢或http長輪詢则拷,其吞吐量以及響應性都十分不盡人意贡蓖,由于http的請求頭和響應頭的協(xié)議字段帶來的流量損耗,以及服務器被動等待客戶端建立的連接來推送消息帶來延時煌茬,都注定http輪詢的方式這種解決方案用在并發(fā)量吞吐量小斥铺,響應延時容忍度高這種場景。如果用作即時通訊這種專業(yè)化的軟件不那么適合宣旱。

1.1.2 Websocket

WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議仅父。WebSocket通信協(xié)議于2011年被IETF定為標準RFC 6455叛薯,并由RFC7936補充規(guī)范浑吟。WebSocket API也被W3C定為標準。
WebSocket使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單耗溜,允許服務端主動向客戶端推送數(shù)據(jù)组力。在WebSocket API中,瀏覽器和服務器只需要完成一次握手抖拴,兩者之間就直接可以創(chuàng)建持久性的連接燎字,并進行雙向數(shù)據(jù)傳輸。
WebSocket的定義包括:

WebSocket 是獨立的阿宅、創(chuàng)建在 TCP 上的協(xié)議候衍。
Websocket 通過HTTP/1.1 協(xié)議的101狀態(tài)碼進行握手。
為了創(chuàng)建Websocket連接洒放,需要通過瀏覽器發(fā)出請求蛉鹿,之后服務器進行回應,這個過程通常稱為“握手”(handshaking
WebSocket的出現(xiàn)正是為解決服務器向客戶端推送消息這個問題往湿,在WebSocket出現(xiàn)之前妖异,服務器向客戶端推送消息,只能依賴客戶端輪詢领追,這會導致巨大的資源浪費他膳。

1.1.3 XMPP

可擴展通訊和表示協(xié)議 (XMPP) 可用于服務類實時通訊、表示和需求響應服務中的XML數(shù)據(jù)元流式傳輸绒窑。XMPP以Jabber協(xié)議為基礎棕孙,而Jabber是即時通訊中常用的開放式協(xié)議。
XMPP的出現(xiàn)背景是為了解決ICQ, MSN等桌面聊天應用消息協(xié)議互不相通的局面出現(xiàn)的些膨。當"理想很好散罕,現(xiàn)時很骨感", XMPP在現(xiàn)代越來越不被當做作主流的聊天協(xié)議來使用,甚至一些大廠逐漸棄用了XMPP, 原因有以下幾點:

  1. 使用XML為載荷的XMPP消息體很大;
  2. XMPP的協(xié)議貪大求全傀蓉,太過復雜欧漱,使用者門檻很高;
  3. 雖說XMPP是一個開放的協(xié)議,但實際上遵守協(xié)議的應用很少葬燎,更多是在此基礎上的魔改;

因此XMPP的現(xiàn)狀是雖然有一些歷史的開源組件误甚,開源應用支持快速上手缚甩,但因技術(shù)陳舊,沒人維護等問題窑邦,導致二次開發(fā)擅威,后期維護等都十分困難。

1.1.4 MQTT

MQTT(Message Queuing Telemetry Transport冈钦,消息隊列遙測傳輸協(xié)議)郊丛,是一種基于發(fā)布/訂閱(Publish/Subscribe)模式的輕量級通訊協(xié)議,MQTT 最大的優(yōu)點在于可以以極少的代碼和有限的帶寬瞧筛,為遠程設備提供實時可靠的消息服務厉熟。做為一種低開銷、低帶寬占用的即時通訊協(xié)議较幌, MQTT 在物聯(lián)網(wǎng)揍瑟、小型設備、移動應用等方面有廣泛的應用乍炉。
MQTT 的協(xié)議比較簡單绢片,是低開銷、低帶寬的物聯(lián)網(wǎng)環(huán)境下發(fā)展起來岛琼。若要在Web的應用下使用底循,需要在Websocket之做一層協(xié)議封裝。

1.1.5 socket.io

socket.io 是一個在客戶端槐瑞,服務器之間進行即時通訊的使用庫熙涤,它提供一個低延時,雙向的随珠,基于事件的通訊模式.
socket.io 有如下的特點:

  1. 它是在Websocket之上構(gòu)建的協(xié)議灭袁,它可以充分利用Websocket 低延時,消耗小的優(yōu)勢;
  2. 若客戶端不支持Websocket協(xié)議窗看,它會回退成使用HTTP 進行l(wèi)ong-polling來實現(xiàn);
  3. 它支持廣播茸歧,分組,命名空間显沈,連接管理等豐富的功能软瞎。

與MQTT相比,MQTT與socket.io都是基于發(fā)布/訂閱(Publish/Subscribe)模式的拉讯,但與MQTT不同的是涤浇, socket.io 是基于Web應用發(fā)展起來的,它天然支持Web應用魔慷,它支持websocket 與 long-polling 等多種實現(xiàn)協(xié)議切換只锭,它在處理一些瀏覽器兼容性的問題上更有優(yōu)勢.
與Websocket相比,socket.io 提供了更豐富的功能院尔,它支持廣播蜻展,分組喉誊,命名空間,連接管理等豐富的功能纵顾,而且伍茄,它提供了從客戶端-服務端, 和服務器-客戶端的雙向確認機制,更有效的保證了即時聊天應用消息不遺漏施逾。

1.1.6 基于tcp/udp自定義協(xié)議

一些大的企業(yè)擁有自己的專業(yè)開發(fā)團隊敷矫,通常自己打造一套自己標準的通訊協(xié)議,一方面可以做到"閉源"汉额,阻止競爭者竊取數(shù)據(jù)曹仗;一方面可以根據(jù)自身的業(yè)務情況,不端深入做優(yōu)化闷愤。一般而言整葡,不是專業(yè)做即時通訊的中小企業(yè)都很少打造自己的通訊協(xié)議件余。

1.2 即時通訊協(xié)議選型

在設計"E聊SDK"的過程中讥脐,筆者注意考慮了以下幾點即時通訊的需求:

  1. 聊天方式支持單聊,群聊啼器,消息類型支持文本旬渠,表情 ,圖片端壳,文件等;
  2. 首要支持移動端(android, ios, h5), Web端告丢, 其次PC端等多個平臺;
  3. 開發(fā)難度小,調(diào)試方便损谦,要求API包文可視化;
  4. 適用于中小項目岖免,支持同時在線: 1000,000 發(fā)消息QPS:100,000

經(jīng)上述幾種即時通訊協(xié)議的仔細比較,考慮到項目需求照捡,最終筆者選擇了socket.io + http 的方案颅湘。socket.io 的用途是作為服務器向客戶端下發(fā)消息,而客戶端向服務器請求API的方式仍選擇傳統(tǒng)的HTTP 方式栗精,如[圖3]闯参,這樣的好處有以下幾點:

  1. http 的開發(fā)方式與調(diào)試工具已十分成熟,像Chrome 的F12調(diào)試窗, curl 工具, java后端的servlet debug等都十分好用悲立, 使用http 請求的方式方便開發(fā)人員開發(fā)鹿寨,調(diào)試,大大提交業(yè)務開發(fā)效率;
  2. 服務器使用socket.io 的通道向客戶端下發(fā)即時消息.當socket.io 連接起來后(底層使用websocket), 可以得益于websocket 全雙工薪夕,低延時的優(yōu)勢脚草。
  3. socket.io 的基于訂閱-發(fā)布模式,協(xié)議上自帶連接管理原献,自動重連等功能, 接入使用簡單馏慨,可以達到開箱即用涩蜘,降低研發(fā)人員使用門檻;
  4. socket.io 誕生于Web環(huán)境熏纯,支持websocket, xhr-polling 多種底層實現(xiàn)方式同诫,在傳統(tǒng)Web, 現(xiàn)代h5 已得到良好的驗證。移動互聯(lián)網(wǎng)發(fā)展至今樟澜,開發(fā)原生應用因開發(fā)成本误窖,推廣費用等因素不再是"剛需",對于原生應用的開發(fā)一般使用前端跨平臺的開發(fā)框架來實現(xiàn)秩贰,如ReactNative, uniapp 等霹俺,基于此類流行的跨平臺框架上,socket.io 也有對應的sdk毒费,真正達到"一招通吃"丙唧。

1.3 本章總結(jié)

本章主要介紹了市面上可供即時通訊選型的多種技術(shù)方案,包括http, Websocket, xmpp, mqtt, socket.io 以及自定義的TCP/UDP協(xié)議等觅玻。并在最后介紹了"E聊SDK"的通訊方案選型的考慮想际,以便打造一個現(xiàn)代化即時通訊應用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末溪厘,一起剝皮案震驚了整個濱河市胡本,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畸悬,老刑警劉巖侧甫,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹋宦,居然都是意外死亡披粟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門冷冗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來守屉,“玉大人,你說我怎么就攤上這事贾惦⌒匕穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵须板,是天一觀的道長碰镜。 經(jīng)常有香客問我,道長习瑰,這世上最難降的妖魔是什么绪颖? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上柠横,老公的妹妹穿的比我還像新娘窃款。我一直安慰自己,他們只是感情好牍氛,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布晨继。 她就那樣靜靜地躺著,像睡著了一般搬俊。 火紅的嫁衣襯著肌膚如雪紊扬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天唉擂,我揣著相機與錄音餐屎,去河邊找鬼。 笑死玩祟,一個胖子當著我的面吹牛腹缩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播空扎,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼藏鹊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勺卢?” 一聲冷哼從身側(cè)響起伙判,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤象对,失蹤者是張志新(化名)和其女友劉穎黑忱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勒魔,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡甫煞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冠绢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抚吠。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弟胀,靈堂內(nèi)的尸體忽然破棺而出楷力,到底是詐尸還是另有隱情,我是刑警寧澤孵户,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布萧朝,位于F島的核電站,受9級特大地震影響夏哭,放射性物質(zhì)發(fā)生泄漏检柬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一竖配、第九天 我趴在偏房一處隱蔽的房頂上張望何址。 院中可真熱鬧里逆,春花似錦、人聲如沸用爪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽偎血。三九已至班眯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烁巫,已是汗流浹背署隘。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亚隙,地道東北人磁餐。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像阿弃,于是被迫代替她去往敵國和親诊霹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容