轉載自我的博客,轉載請聲明,走啊走的記錄:WebSocket 原理html
之前的網站爲了實現推送功能,使用的方法都是輪詢。所謂的輪詢就是在特定的時間間隔(例如1秒),由瀏覽器向服務器發出一個 Http request
,而後服務器返回最新的數據給客戶端瀏覽器,從而給出一種服務端實時推送的假象。因爲Http Request
的Header
(請求頭)很長,而傳輸的數據可能很短就只佔一點點,每次請求消耗的帶寬大部分都消耗在 Header
上。從網上資料得知後來還有改進的輪詢方法叫作 Comet
,使用 Ajax
。但這種技術雖然可達到雙向通訊,但依然須要發出請求,並且在Comet中,廣泛採用了長連接,這也會大量消耗服務器帶寬和資源。git
因此HTML5定義了 WebSocket
協議,以及相關的編程API,能更好的實現雙向通訊且節省服務器資源和帶寬。github
注意:
WebSocket
實際上指的是一種協議,與咱們熟知的Http
協議是同等的一個網絡協議。用網絡模型結構來解釋的話,WebSocket
和Http
協議都屬於應用層協議
,二者都基於傳輸層協議TCP
。web
Html5是指的一系列新的API,或者說新規範,新技術。在這個新規範中定義了一個爲了實現雙向實時通訊的新協議 WebSocket
,而且提供了一套 JavaScript API 供開發者來調用實現通訊。服務器端的實現由諸如:Tomcat、Jetty等等。編程
簡單歸納來看: 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
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處.網絡
下面給出發出創建鏈接請求時的 request
和 response
。socket
注意:下面的請求報文與響應報文中的內容不是完整的報文,而是 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/