WebSocket
1.概述
HTTP協議的弊端:僅支持客戶端發起請求,服務器回覆響應, 不支持服務器主動向客戶端發送消息。
如果客戶端想要獲取服務器發送的消息,需要通過頻繁的JavaScript和AJAX請求實現輪詢,效率較低
HTTP1.1之前一個request一個response後, HTTP連接就結束了,HTTP1.1後使用長連接, 一次HTTP連接可以發送和接收多個request和response, 但二者數量始終相等, 以上兩種輪詢方式都比較浪費資源。
WebSocket是HTML5新增的協議, 它允許客戶端和服務器直接進行全雙工通信, 任何一方都可以通過連接將數據推送到另一端
WebSocket 特點
- 全雙工通信
- 握手階段採用HTTP協議, 默認端口也是80(ws)和443(wss), 因此與HTTP協議有良好的兼容性
- 數據格式較輕量, 性能開銷小, 通信高效
2.WebSocket握手
WebSocket利用HTTP協議來建立連接
請求報文
GET ws://www.zhangshuo.fun/chat/2 HTTP/1.1 請求行
Host: www.zhangshuo.fun
Connection: Upgrade
Upgrade: websocket
Origin: http://localhost:8080
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: Zjy6wfxsecUZfUE9fx9yBQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Connection: Upgrade 表示要升級協議
Upgrade: websocket 表示協議要升級爲websocket
Sec-WebSocket-Version: 13 表示協議版本
Sec-WebSocket-Key 隨機生成, 用於標識這個鏈接
響應報文
HTTP/1.1 101
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: 2BObMdUfPogZU5MGvSfQQm1dmGk=
Sec-WebSocket-Extensions: permessage-deflate;client_max_window_bits=15
響應碼101表示HTTP協議即將被更改爲WebSocket協議
到此一個WebSocket連接就建立成功
TCP協議本身就是全雙工通信, 但建立在TCP之上的HTTP協議的請求-響應機制限制了全雙工通信, 因此WebSocket連接建立後, 就不再使用HTTP協議的機制了, 而是直接發送數據通信.
3.Fin分片
WebSocket的每條消息有可能被切分爲多個數據幀, WebSocket 根據FIN判斷當前數據幀是否爲最後一個, Fin = 1 表示已經收到完整消息, Fin = 0 表示接收方還需要繼續監聽接收其餘的數據.
opcode在數據交換的場景下,表示的是數據的類型。0x01表示文本,0x02表示二進制。而0x00比較特殊,表示延續幀, 即消息還未接收完