「WebSocket 是一項先進的技術,它能夠在用戶的瀏覽器和服務器之間打開交互式通訊會話。經過 WebSocket,您能夠向服務器發送消息並實時接收響應,而無需經過傳統的輪詢服務器的方式來獲取服務器上的響應。」html
這是一段 Mozilla 在開發人員文檔頁面上對於 WebSocket 的介紹。簡單的來講,WebSocket 可使瀏覽器在一段時間內保持與服務器的鏈接,它實現了瀏覽器與服務器全雙工(full-duplex)通訊,即容許服務器主動發送信息給客戶端。對於例如動態更新位置數據、拉取熱點新聞、在瀏覽器中構建高性能遊戲以及收集更多點擊流數據等等須要保持實時數據交換的場景,這個特性就特別地友好。瀏覽器
相信你們都有遇到過這樣的場景,服務器上有些資源常常會進行更新,客戶端須要儘可能及時的獲取到這些更新,在傳統的 HTTP 協議中,若是客戶端不發起一個 Request 請求,那麼服務器是沒有辦法向客戶端主動發起數據的。那麼咱們是如何解決客戶端和服務器之間的數據更新問題的呢?服務器
比較常見的作法就是 AJAX 輪詢 。客戶端設置一個定時器,在必定時間內客戶端會向服務器發起一個 AJAX 請求,詢問服務器是否有更新,若是有更新就及時返回數據。經過定時器,客戶端能夠反覆的去輪詢服務器上相關的資源有沒有更新,從而實現近乎「實時」的通信。網絡
AJAX 輪詢雖然縮短了客戶端和服務器之間數據同步的延遲時間,但同時也帶來了一些性能消耗的問題。例如,若是客戶端較多,那麼服務器同時接收輪詢請求就會增多,這就會對服務器形成巨大的壓力,輪詢所產生的流量,也會對網絡形成必定的消耗,另外服務器資源更新頻率較爲頻繁,但客戶端定時器時間間隔較大,或者服務器長時間沒有更新資源,這就會致使資源更新不及時、帶寬耗費等等問題。性能
但有了 WebSocket 以後就不一樣了,在 WebSocket API 中,瀏覽器和服務器只須要完成一次握手,二者之間就直接能夠建立持久性的鏈接,並進行雙向數據傳輸。這樣,即便沒有來自客戶端的明確請求,服務器也能夠向客戶端發送信息,實現反向的通信。這就是服務器與客戶端之間的「全雙工」通訊。優化
點擊此處能夠體驗一下 WebSocket 的魅力。spa
客戶端(或多個客戶端)先經過向服務器發送 HTTP 請求開始,請求中包括了 WebSocket 支持的版本號、協議的版本號、原始地址、主機地址等等一些字段給服務器端,向服務器代表客戶端正在嘗試創建 WebSocket 鏈接。htm
若是服務器檢查數據包數據和格式正確,客戶端和服務器端的協議版本號匹配,就接受本次握手鍊接,並給出相應的數據回覆,一樣回覆的數據包也是採用 HTTP 協議傳輸。等待客戶端確認後,就將初始 HTTP 鏈接升級爲 WebSocket 鏈接,而且爲每一個客戶端維護該鏈接,從而實現雙向通信。blog
比起傳統的輪詢方式,WebSocket 能夠更好的節省服務器資源和帶寬,而且可以進行更加實時地通信,優點以下:接口
WebSocket 有這麼多優點,那麼它適用於哪些場景呢?下面來簡單瞭解下:
目前又拍雲已經能夠支持 WebSocket 無縫接入,依託於又拍雲 CDN 1100+ 全球節點,10Tbps 帶寬儲備,國內主流運營商支持,經過 TCP 協議優化、鏈路優化、內容優化、智能調度等技術手段,大大提高加速性能。全自助化配置管理,配置策略全網 10 秒內生效;提供全方位的 API 接口,支持多樣化管理,只需簡單的配置,就能夠迅速接入,享受全站加速。