WebSocket 是 HTML5 一種新的協議。它實現了瀏覽器與服務器全雙工通訊,能更好的節省服務器資源和帶寬並達到實時通信,它創建在 TCP 之上,同 HTTP 同樣經過 TCP 來傳輸數據,可是它和 HTTP 最大不一樣是:web
Websocket是一種在單個TCP鏈接上進行全雙工通信的協議,在Websocket協議中,客戶端和服務端只須要作一個握手的動做,就能造成一條通道,二者之間能夠進行數據互相傳送。ajax
因此WebSocket協議分爲兩部分:瀏覽器
客戶端發送一個請求服務器
GET / HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: example.com Origin: null Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ== Sec-WebSocket-Version: 13
能夠看到,客戶端發起的 WebSocket 鏈接報文相似傳統 HTTP 報文,」Upgrade:websocket」參數值代表這是 WebSocket 類型請求,「Sec-WebSocket-Key」是 WebSocket 客戶端發送的一個 base64 編碼的密文,要求服務端必須返回一個對應加密的「Sec-WebSocket-Accept」應答,不然客戶端會拋出「Error during WebSocket handshake」錯誤,並關閉鏈接。websocket
服務端收到報文後返回的數據格式相似:socket
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s= Sec-WebSocket-Origin: null Sec-WebSocket-Location: ws://example.com/
收到這一段響應後,客戶端須要比對Sec-WebSocket-Accept值,這個值表示服務器贊成握手創建鏈接,是客戶端傳輸過來的Sec-WebSocket-Key跟「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」拼接後,用SHA-1加密,並進行BASE-64編碼得來的。ide
客戶端收到Sec-WebSocket-Accept後,將本地的Sec-WebSocket-Key進行一樣的編碼,而後比對。編碼
只須要通過一次HTTP請求,就能夠作到源源不斷的信息傳送了。(在程序設計中,這種設計叫作回調,即:你有信息了再來通知我,而不是我傻乎乎的每次跑來問你)
這樣的協議解決了上面同步有延遲,並且還很是消耗資源的這種狀況。加密