websocket 初步認識

什麼是websocket

WebSocket是web瀏覽器和服務器之間的一種全雙工通訊協議,其中WebSocket協議由IETF定位標準,WebSocket API由W3C定位標準。一旦Web客戶端與服務器創建起鏈接,以後的所有數據通訊都經過這個鏈接進行。通訊過程當中,支持發送JSON、XML、HTML或圖片等任意格式的數據。html

WS(WebSocket)與HTTP協議相比

相同點主要有:python

  • 都是基於TCP的應用層協議;
  • 都使用Request/Response模型進行鏈接的創建;
  • 在鏈接的創建過程當中對錯誤的處理方式相關,在這階段WS可能返回和HTTP相同的返回碼
  • 均可以在網絡中傳輸數據

不一樣之處在於:web

  • WS使用HTTP來創建鏈接,可是定義了一系列新的header域,這些域在HTTP中並不會使用;
  • WS的鏈接不能經過中間人來轉發,它必須是一個直接鏈接——那網關如何轉發?分別創建 client-網關、網關-upstream的鏈接?
  • WS鏈接創建以後,通訊雙方均可以在任什麼時候刻向另外一方發送數據;
  • WS鏈接創建以後,數據的傳輸使用幀來傳遞,再也不須要Request消息
  • WS的數據幀有序

主要特色

  • 推送功能:服務器能夠直接向客戶端推送消息。
  • 減小通訊量:只要第一次創建鏈接,就能夠一直進行通訊,不像HTTP協議,須要頻繁的創建請求,一問一答的模式。此外,WebSocket的頭部數據也比較少。

握手協議

websocket是基於TCP的一個應用協議,與HTTP協議的關聯之處在於websocket的握手數據被HTTP服務器看成HTTP包來處理,主要經過update request HTTP包創建起鏈接,以後的通訊所有使用websocket本身的協議。瀏覽器

請求:TCP鏈接創建後,客戶端發送websocket的握手請求,請求報文頭部以下:安全

GET /chat HTTP/1.1
Host: server.example.com
**Upgrade: websocket**
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: https://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
  • 第一行爲請求的方法,類型必須爲GET,協議版本號必須大於1.1
  • Upgrade字段必須包含,值爲websocket
  • Connection字段必須包含,值爲Upgrade
  • Sec-WebSocket-Key字段必須包含,記錄着握手過程當中必不可少的鍵值。
  • Sec-WebSocket-Protocol字段必須包含,記錄者使用的自協議
  • Origin:做安全使用,防止跨站攻擊,瀏覽器通常會使用這個來標誌原始域。

響應:服務器接收到請求後,返回狀態碼101 Switching Protocols的響應。服務器

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
  • Sec-WebSocket-Accept字段是由握手請求中的Sec-WebSocket-Key字段生成的。

握手成功後,通訊再也不使用HTTP協議,而採用WebSocket獨立的數據幀。websocket

websocket鏈接關閉狀態碼錶

狀態碼 名稱 描述
0-999 保留段,未使用
1000 CLOSE_NORMAL 正常關閉
1001 CLOSE_GOING_AWAY 終端離開,可能由於服務端錯誤,也可能由於瀏覽器正從打卡鏈接的頁面跳轉離開
1002 CLOSE_PROTOCOL_ERROR 因爲協議錯誤而斷開鏈接
1003 CLOSE_SUPPORTED 因爲收到不容許的數據而斷開鏈接(例如:僅接收文本數據的終端接收了二進制數據)
1004 保留
1005 CLOSE_NO_STATUS 保留. 表示沒有收到預期的狀態碼.
1006 CLOSE_ABNORMAL 保留. 用於指望收到狀態碼時鏈接非正常關閉 (也就是說, 沒有發送關閉幀).
1007 Unsupported Data 因爲收到了格式不符的數據而斷開鏈接
1008 Policy Violation 因爲收到不符合約定的數據而斷開鏈接
1009 CLOSE_TOO_LARGE 因爲收到過大的數據幀而斷開鏈接
1010 Missing Extension 客戶端指望服務器商定一個或者多個拓展,但服務器沒有處理,所以客戶端斷開鏈接
1011 Internal Error 客戶端因爲遇到沒有預料的狀況阻止其完成請求, 所以服務端斷開鏈接.
1012 Service Restart 服務因爲重啓斷開鏈接
1013 Try Again Later 服務器因爲臨時緣由斷開鏈接
1015 TLS Handshake 保留. 表示鏈接因爲沒法完成 TLS 握手而關閉 (例如沒法驗證服務器證書).

詳見:https://wdd.js.org/websocket-close-reasons.html網絡

附錄

附錄1: 全雙工VS單工

  • 全雙工(Full Duplex):是通訊傳輸的一個術語。通訊容許數據在兩個方向上同時傳輸,它在能力上至關於兩個單工通訊方式的結合。全雙工指能夠同時(瞬時)進行信號的雙向傳輸(A-》B且B-》A)。例如,電話。socket

  • 半雙工(Half Duplex):指一個時間段內只有一個動做發生。例如:對講機。code

  • 單工:就是隻容許甲方向乙方傳送信息,而乙方不能向甲方傳送。

附錄2: Python Websockets Module has no attribute

報錯:

AttributeError: module 'websocket' has no attribute 'WebSocket'
ws = websocket.WebSocket()

緣由:安裝錯module,應該安裝 websocket_client,而不是websocket

參考:https://stackoverflow.com/questions/40212252/python-websockets-module-has-no-attribute

相關文章
相關標籤/搜索