“WebSocket 是一項先進的技術,它可以在用戶的瀏覽器和服務器之間打開交互式通信會話。通過 WebSocket,您可以向服務器發送消息並實時接收響應,而無需通過傳統的輪詢服務器的方式來獲取服務器上的響應。”
這是一段 Mozilla 在開發人員文檔頁面上對於 WebSocket 的介紹。簡單的來說,WebSocket 可以使瀏覽器在一段時間內保持與服務器的連接,它實現了瀏覽器與服務器全雙工(full-duplex)通信,即允許服務器主動發送信息給客戶端。對於例如動態更新位置數據、拉取熱點新聞、在瀏覽器中構建高性能游戲以及收集更多點擊流數據等等需要保持實時數據交換的場景,這個特性就特別地友好。
WebSocket 解決了什么問題
相信大家都有遇到過這樣的場景,服務器上有些資源經常會進行更新,客戶端需要盡量及時的獲取到這些更新,在傳統的 HTTP 協議中,如果客戶端不發起一個 Request 請求,那么服務器是沒有辦法向客戶端主動發起數據的。那么我們是如何解決客戶端和服務器之間的數據更新問題的呢?
比較常見的做法就是 AJAX 輪詢 。客戶端設置一個定時器,在一定時間內客戶端會向服務器發起一個 AJAX 請求,詢問服務器是否有更新,如果有更新就及時返回數據。通過定時器,客戶端可以反復的去輪詢服務器上相關的資源有沒有更新,從而實現近乎“實時”的通訊。
AJAX 輪詢雖然縮短了客戶端和服務器之間數據同步的延遲時間,但同時也帶來了一些性能消耗的問題。例如,如果客戶端較多,那么服務器同時接收輪詢請求就會增多,這就會對服務器造成巨大的壓力,輪詢所產生的流量,也會對網絡造成一定的消耗,另外服務器資源更新頻率較為頻繁,但客戶端定時器時間間隔較大,或者服務器長時間沒有更新資源,這就會導致資源更新不及時、帶寬耗費等等問題。
但有了 WebSocket 之后就不同了,在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。這樣,即使沒有來自客戶端的明確請求,服務器也可以向客戶端發送信息,實現反向的通訊。這就是服務器與客戶端之間的“全雙工”通信。

點擊此處可以體驗一下 WebSocket 的魅力。
WebSocket 工作原理
客戶端(或多個客戶端)先通過向服務器發送 HTTP 請求開始,請求中包括了 WebSocket 支持的版本號、協議的版本號、原始地址、主機地址等等一些字段給服務器端,向服務器表明客戶端正在嘗試建立 WebSocket 連接。
如果服務器檢查數據包數據和格式正確,客戶端和服務器端的協議版本號匹配,就接受本次握手連接,並給出相應的數據回復,同樣回復的數據包也是采用 HTTP 協議傳輸。等待客戶端確認后,就將初始 HTTP 連接升級為 WebSocket 連接,並且為每個客戶端維護該連接,從而實現雙向通訊。

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 接口,支持多樣化管理,只需簡單的配置,就可以迅速接入,享受全站加速。
