說說 WebSocket,3 分鐘讓你全面認識它

「WebSocket 是一項先進的技術,它能夠在用戶的瀏覽器和服務器之間打開交互式通訊會話。經過 WebSocket,您能夠向服務器發送消息並實時接收響應,而無需經過傳統的輪詢服務器的方式來獲取服務器上的響應。」html

這是一段 Mozilla 在開發人員文檔頁面上對於 WebSocket 的介紹。簡單的來講,WebSocket 可使瀏覽器在一段時間內保持與服務器的鏈接,它實現了瀏覽器與服務器全雙工(full-duplex)通訊,即容許服務器主動發送信息給客戶端。對於例如動態更新位置數據、拉取熱點新聞、在瀏覽器中構建高性能遊戲以及收集更多點擊流數據等等須要保持實時數據交換的場景,這個特性就特別地友好。瀏覽器

WebSocket 解決了什麼問題

相信你們都有遇到過這樣的場景,服務器上有些資源常常會進行更新,客戶端須要儘可能及時的獲取到這些更新,在傳統的 HTTP 協議中,若是客戶端不發起一個 Request 請求,那麼服務器是沒有辦法向客戶端主動發起數據的。那麼咱們是如何解決客戶端和服務器之間的數據更新問題的呢?服務器

比較常見的作法就是 AJAX 輪詢 。客戶端設置一個定時器,在必定時間內客戶端會向服務器發起一個 AJAX 請求,詢問服務器是否有更新,若是有更新就及時返回數據。經過定時器,客戶端能夠反覆的去輪詢服務器上相關的資源有沒有更新,從而實現近乎「實時」的通信。網絡

AJAX 輪詢雖然縮短了客戶端和服務器之間數據同步的延遲時間,但同時也帶來了一些性能消耗的問題。例如,若是客戶端較多,那麼服務器同時接收輪詢請求就會增多,這就會對服務器形成巨大的壓力,輪詢所產生的流量,也會對網絡形成必定的消耗,另外服務器資源更新頻率較爲頻繁,但客戶端定時器時間間隔較大,或者服務器長時間沒有更新資源,這就會致使資源更新不及時、帶寬耗費等等問題。性能

但有了 WebSocket 以後就不一樣了,在 WebSocket API 中,瀏覽器和服務器只須要完成一次握手,二者之間就直接能夠建立持久性的鏈接,並進行雙向數據傳輸。這樣,即便沒有來自客戶端的明確請求,服務器也能夠向客戶端發送信息,實現反向的通信。這就是服務器與客戶端之間的「全雙工」通訊。優化

點擊此處能夠體驗一下 WebSocket 的魅力。spa

WebSocket 工做原理

客戶端(或多個客戶端)先經過向服務器發送 HTTP 請求開始,請求中包括了 WebSocket 支持的版本號、協議的版本號、原始地址、主機地址等等一些字段給服務器端,向服務器代表客戶端正在嘗試創建 WebSocket 鏈接。htm

若是服務器檢查數據包數據和格式正確,客戶端和服務器端的協議版本號匹配,就接受本次握手鍊接,並給出相應的數據回覆,一樣回覆的數據包也是採用 HTTP 協議傳輸。等待客戶端確認後,就將初始 HTTP 鏈接升級爲 WebSocket 鏈接,而且爲每一個客戶端維護該鏈接,從而實現雙向通信。blog

WebSocket 的優點

比起傳統的輪詢方式,WebSocket 能夠更好的節省服務器資源和帶寬,而且可以進行更加實時地通信,優點以下:接口

  • 減少帶寬開銷。 服務器和客戶端在鏈接創建後,相比起 HTTP 請求,交換數據時用於協議控制的數據包頭部相對較小,通常只有 2 字節;
  • 加強實時性。 服務器能夠隨時主動給客戶端下發數據,相對於 HTTP 請求須要等待客戶端發起請求服務端才能響應,延遲明顯更少,和傳統的輪詢比較,WebSocket 也能夠在短期內更有效率地傳遞數據;
  • 維持鏈接狀態。 在一些須要身份認證的場景下, HTTP 請求可能須要在每一個請求都攜帶狀態信息(服務器不記錄每次的請求和響應信息),而 WebSocket 一次鏈接創建後就會保持住會話狀態,這就使其成爲一種有狀態的協議,後續通訊時就能夠省略部分狀態信息;
  • 更靈活的擴展支持。 根據 RFC6455 協議,開發者能夠對 WebSocket 自定義二進制幀,相對 HTTP,能夠更輕鬆地處理二進制內容,此外開發者也自行擴展協議、實現部分自定義的子協議。
  • 更好的壓縮效果。 WebSocket 在適當的擴展支持下,能夠沿用以前內容的上下文,在傳遞相似的數據時,能夠顯著地提升壓縮率。

WebSocket 有這麼多優點,那麼它適用於哪些場景呢?下面來簡單瞭解下:

  • 須要及時響應的場景。 當客戶端須要對服務端發生的改變作出快速響應(尤爲是客戶端沒法預測的響應)時,WebSocket 是很是適合的。例如開發一個客服系統,這每每要求實現多個用戶實時溝通。若是使用 WebSocket,則每一個對話均可以實時發送和接收消息。與 HTTP 相比,WebSocket 不須要考慮發送和接收的每一個消息的 HTTP 請求/響應致使的開銷,從而會有更高的執行效率。
  • 須要實時查詢的場景。 例如一名籃球迷想要查詢比賽結果,若是比賽是上週結束的,那麼比賽結果是固定的,HTTP 在這種狀況下就很是適合。可是,若是是當前正在進行的比賽,得分會不斷變化,而且更新頻繁,在這種狀況下,WebSocket 就是更好的選擇。
  • 小負載的高頻消息傳遞。 現在愈來愈多的開發人員正在經過移動設備的 GPS 功能來記錄 Web 應用程序的方位感知。若是咱們須要記錄一段時間內用戶的位置信息,高頻率發送更加細粒度的位置數據,從而起到實時分享功能(例如運動類 APP),WebSocket 所使用的 TCP 鏈接會讓數據交換飛起來。
  • 多人協同的場景。 例如近幾年發展迅速的在線教育,學生能夠足不出戶,便可與老師以及其餘同窗一塊兒進行實時溝通與交流,諸如佈置做業、師生互動、問題討論等等強實時交互類的場景均可交由 WebSocket 協議支撐完成,從而知足低延遲,高及時的場景要求。

目前又拍雲已經能夠支持 WebSocket 無縫接入,依託於又拍雲 CDN 1100+ 全球節點,10Tbps 帶寬儲備,國內主流運營商支持,經過 TCP 協議優化、鏈路優化、內容優化、智能調度等技術手段,大大提高加速性能。全自助化配置管理,配置策略全網 10 秒內生效;提供全方位的 API 接口,支持多樣化管理,只需簡單的配置,就能夠迅速接入,享受全站加速。

推薦閱讀

喜大普奔,又拍雲全新產品 WebSocket 上線啦
全球 43 億 IPv4 地址已耗盡!IPv6,刻不容緩

相關文章
相關標籤/搜索