什么是websocket
WebSocket是web瀏覽器和服務器之間的一種全雙工通信協議,其中WebSocket協議由IETF定位標準,WebSocket API由W3C定位標準,一旦Web客戶端與服務器建立起連接,之后的全部資料通信都通過這個連接進行,通信程序中,支持發送JSON、XML、HTML或圖片等任意格式的資料,
WS(WebSocket)與HTTP協議相比
相同點主要有:
- 都是基于TCP的應用層協議;
- 都使用Request/Response模型進行連接的建立;
- 在連接的建立程序中對錯誤的處理方式相關,在這階段WS可能回傳和HTTP相同的回傳碼
- 都可以在網路中傳輸資料
不同之處在于:
- 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連接關閉狀態碼表
| 狀態碼 | 名稱 | 描述 |
|---|---|---|
| 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),例如,電話,
-
半雙工(Half Duplex):指一個時間段內只有一個動作發生,例如:對講機,
-
單工:就是只允許甲方向乙方傳送資訊,而乙方不能向甲方傳送,
附錄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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/41108.html
標籤:其他
上一篇:教你用軟體怎么做拼多多優惠券網站和微信公眾號查內部優惠券
下一篇:計算機網路-經典計算例題
