WebSocket 原理

WebSocket 原理

轉載自我的博客,轉載請聲明走啊走的記錄:WebSocket 原理html

背景

之前的網站爲了實現推送功能,使用的方法都是輪詢。所謂的輪詢就是在特定的時間間隔(例如1秒),由瀏覽器向服務器發出一個 Http request,而後服務器返回最新的數據給客戶端瀏覽器,從而給出一種服務端實時推送的假象。因爲Http RequestHeader(請求頭)很長,而傳輸的數據可能很短就只佔一點點,每次請求消耗的帶寬大部分都消耗在 Header上。從網上資料得知後來還有改進的輪詢方法叫作 Comet,使用 Ajax。但這種技術雖然可達到雙向通訊,但依然須要發出請求,並且在Comet中,廣泛採用了長連接,這也會大量消耗服務器帶寬和資源。git

因此HTML5定義了 WebSocket 協議,以及相關的編程API,能更好的實現雙向通訊且節省服務器資源和帶寬。github

注意WebSocket 實際上指的是一種協議,與咱們熟知的 Http 協議是同等的一個網絡協議。用網絡模型結構來解釋的話, WebSocketHttp 協議都屬於 應用層協議,二者都基於傳輸層協議 TCPweb

WebSocket 協議

與HTML5的聯繫

Html5是指的一系列新的API,或者說新規範,新技術。在這個新規範中定義了一個爲了實現雙向實時通訊的新協議 WebSocket,而且提供了一套 JavaScript API 供開發者來調用實現通訊。服務器端的實現由諸如:Tomcat、Jetty等等。編程

與Http協議的聯繫

簡單歸納來看: WebSocket 不是 Http 協議, Http 協議只是被 WebSocket 使用來創建 WebSocket 鏈接,鏈接創建了之後客戶端與服務器的雙向通訊就與 Http 無關了。瀏覽器

WebSocket 協議和 HTTP 協議是兩種不一樣的東西,它們的聯繫以下:服務器

客戶端開始創建 WebSocket 鏈接時要發送一個 header 標記了 Upgrade 的 HTTP 請求,表示請求協議升級。因此服務器端作出響應的簡便方法是,直接在現有的 HTTP 服務器軟件和現有的端口上實現 WebSocket 協議,重用現有代碼(好比解析和認證這個 HTTP 請求。若是在 TCP 協議上實現,這兩個功能就要從新實現),而後再回一個狀態碼爲 101 的 HTTP 響應完成握手,再日後發送數據時就沒 HTTP 的事了。websocket

做者:長天之雲
連接:https://www.zhihu.com/question/20215561/answer/14365823
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處.網絡

例子

下面給出發出創建鏈接請求時的 requestresponsesocket

注意:下面的請求報文與響應報文中的內容不是完整的報文,而是 WebSocket 基於 Http 請求(響應)報文添加的內容。

瀏覽器請求

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: null
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

服務器迴應

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Origin: null
Sec-WebSocket-Location: ws://example.com/
相關文章
相關標籤/搜索