WebSocket的初步认识
WebSocket協議
WebSocket 協議在2008年誕生,2011年成為國際標準。所有瀏覽器都已經支持了。
它的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬于服務器推送技術的一種。
可以對照著這個報文來看
請求頭中的重要字段
- Connection和Upgrade:表示客戶端發起的是WebSocket請求
- Sec-WebSocket-Version:客戶端所使用的的WebSocket協議版本號,服務端會確認是否支持該版本號
- Sec-WebSocket-Key:一個Base64編碼值,由瀏覽器隨機生成,用于升級request
- Sec-WebSocket-Extensions客戶端想表達的協議級的擴展
響應頭中的重要字段
- Status Code 101 Switching Protocols:切換協議,WebSocket協議通過HTTP協議來建立運輸層的TCP連接
- Connection和Upgrade:表示服務端返回的是WebSocket響應
- Sec-WebSocket-Accept:表示服務器接受了客戶端的請求,由Sec-WebSocket-Key計算得來
驗證Sec-WebSocket-Key和Sec-WebSocket-Accept的關系
MDN:Protocol upgrade mechanism這篇文檔中提到
If a Sec-WebSocket-Key header was provided, the value of this header is computed by taking the value of the key, concatenating the string “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” to it, taking the SHA-1 hash of that concatenated string, resulting in a 20-byte value. That value is then base64 encoded to obtain the value of this property.
那我們進入到python環境中驗證一下
cws@mypc:~$ python3 Python 3.6.9 (default, Nov 7 2019, 10:44:02) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> text = "RG7L4nO1IRMXGWBqTsY/lw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" >>> import hashlib >>> import base64 >>> h = hashlib.sha1(text.encode()) >>> h.digest() b'\xd8\n\x0b*&\xe1\xf9\xff\xae0\x10\\n$\xbc#j+\xf0l' >>> base64.b64encode(h.digest()) b'2AoLKibh+f+uMBBcbiS8I2or8Gw=' >>>可以看到,請求頭中Sec-WebSocket-Key拼接上字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"的經過運算后得到的'2AoLKibh+f+uMBBcbiS8I2or8Gw='正好就是響應頭中的Sec-WebSocket-Accept
WebSocket協議的優缺點及應用場景
優點
- 支持雙向通信,實時性更強
- 數據格式比較輕量,性能開銷小,通信高效。
- 支持擴展。用戶可以擴展協議或者實現自定義的子協議(比如支持自定義壓縮算法等)
缺點
- 少部分瀏覽器不支持,瀏覽器支持的程度與方式有區別
- 長連接對后端處理業務的代碼穩定性要求更高,后端推送功能相對復雜
- 成熟的HTTP生態下有大量的組件可以復用,WebSocket較少
應用場景
- 即時聊天通信,網站消息通知
- 在線協同編輯,如騰訊文檔
- 多玩家在線游戲、視頻彈幕、股票基金實時報價
總結
以上是生活随笔為你收集整理的WebSocket的初步认识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django的主要开发流程(以扩充用户模
- 下一篇: Cloud Programming Si