WebSocket

# WebSocket

1.概述

1.1 WebSocket 是什麼?

WebSocket 是一種網絡通訊協議。RFC6455 定義了它的通訊標準。
WebSocket 是 HTML5 開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議。web

2.原理

HTTP

首先從HTTP提及,HTTP1.0是無鏈接的。每次都得從新發起TCP鏈接;
HTTP1.1實現了長鏈接;
這一功能實質是複用了TCP鏈接,HTTP協議中的connection:keep-alive 是指在一次TCP鏈接中完成多個HTTP請求,可是對每一個請求仍然要單獨發 header;ajax

AJAX

在此基礎之上出現了AJAX,就是客戶端週期性的請求服務器數據並在刷新頁面中的部分數據;
每一個request對應一個response,因爲HTTP/1.1的持久鏈接(創建一次TCP鏈接,發送多個請求)和管線化技術(異步發送請求),使得HTTP請求能夠在創建一次TCP鏈接以後發起多個異步請求。
AJAX有兩個不足或者說能夠優化的地方:瀏覽器

  1. 鏈接的開銷;每一次請求還是一次HTTP請求;
  2. 服務器不能主動推送,只能由客戶端polling;
comet

而比較新的技術向服務器輪詢獲取數據的實現是Comet,即服務端推送。簡單的說,服務端推送就是在客戶端發起HTTP請求以後,服務器能夠主動的向客戶端推送數據。實現Comet的方式有兩種:Ajax長輪詢和HTTP流。服務器

  • Ajax長輪詢(Ajax Long-polling)
    Ajax長輪詢自己不是一個真正的推送。長輪詢是短輪詢的一種變體。在客戶端向服務器發起HTTP請求以後,服務器並非每次都當即響應:當服務器獲得最新數據時,會向客戶端傳輸數據;當數據沒有更新時,服務器會保持這個鏈接,等待更新數據以後,才向客戶端傳輸數據。固然,若是服務端數據長時間沒有更新,一段時間後,請求就會超時。客戶端收到超時信息後,會從新發送一個HTTP請求給服務器。
    也就是說,只有在服務器獲取更新後的數據,纔會向客戶端傳輸數據。這種方式也存在弊端。雖然服務端能夠主動的向客戶端傳輸數據,可是依然須要反覆發出請求(HTTP請求數量比短輪詢少不少)。
    短輪詢和長輪詢的相同點在於客戶端都須要向服務器發起HTTP請求,不一樣點在於服務器如何響應:短輪詢是服務器當即響應,無論數據是否有效;長輪詢是等待數據更新後響應。websocket

  • HTTP流
    HTTP流不一樣於輪詢技術,HTTP流只創建一次TCP鏈接,在3次握手以後進行HTTP通訊,此時客戶端向服務器發起一個HTTP請求,而服務器保持鏈接打開,週期性的向客戶端傳輸數據。雙方在沒有明確提出斷開鏈接時,服務器就會持續向客戶端傳輸數據。也就是說,假如服務器數據沒有更新,服務器不會返回響應,而是保持鏈接;若是數據更新了,會當即將數據傳輸給客戶端。此時會發起下一個HTTP請求,過程周而復始。網絡

對(長、短)輪詢和HTTP流作一個小小的總結:架構

傳統輪詢技術(Ajax短輪詢)是客戶端向服務器發起HTTP請求,不管數據是否更新,服務器都會傳輸數據。一個request對應一個response。異步

服務器推送技術(Ajax長輪詢)是短輪詢的變種,是客戶端向服務器發起HTTP請求,只有等待數據更新後纔會傳輸數據,不然服務器保持鏈接狀態。接着發起下一次HTTP請求,一個request對應一個response。socket

服務器推送技術(HTTP流),在客戶端只發起一次HTTP請求,服務器保持鏈接狀態,在數據更新以後,服務器會傳輸數據,不然保持鏈接狀態。此時一個requset對應多個response。優化

不管是短輪詢、長輪詢,仍是HTTP流,相同點在於都須要客戶端先發起HTTP請求。

websocket

上面的HTTP1.1 和AJAX模式有一個共同的缺點,就是除了真正的數據部分外,服務器和客戶端還要大量交換HTTP header,信息交換效率很低。它們創建的「長鏈接」都是僞長鏈接,只不過好處是不須要對現有的HTTP server和瀏覽器架構作修改就能實現。

WebSocket 當作是 HTTP 協議爲了支持長鏈接所打的一個大補丁,它和 HTTP 有一些共性,是爲了解決 HTTP 自己沒法解決的某些問題而作出的一個改良設計。
在 WebSocket API 中,瀏覽器和服務器只須要作一個握手的動做,而後,瀏覽器和服務器之間就造成了一條快速通道。二者之間就直接能夠數據互相傳送。

WebSocket是一個獨立的基於TCP的協議,是與HTTP同一級的協議;
它與HTTP之間的惟一關係就是它的握手請求能夠做爲一個升級請求(Upgrade request)經由HTTP服務器解釋(HTTP/1.1 協議的101狀態碼)。
WebSocket是一個網絡通信協議, 只要理解它的數據幀格式和握手流程, 均可以完成基於websokect的即時通信。

2.1 其它概念

  • TCP的keep alive:檢查當前TCP鏈接是否活着;
  • HTTP的Keep-alive:要讓一個TCP鏈接活久點。

它們是不一樣層次的概念。

TCP keep alive的表現: 當一個鏈接「一段時間」沒有數據通信時,一方會發出一個心跳包(Keep Alive包),若是對方有回包則代表當前鏈接有效,繼續監控。 這個「一段時間」能夠設置。

相關文章
相關標籤/搜索