WebSocket 协议简介
為什么需要WebSocket 協議?
眾所周知,HTTP 協議是一個遵循請求-響應模式的協議。這種模式有兩個特點:1. 由客戶端先發起請求,然后等待服務器的響應。2. 服務器不能在沒有接收到客戶端請求時,就發送數據。也就是說,客戶端和服務器之間的通信是單向的。
在某些應用中,通常有服務器向客戶端推送數據的需求,也就是需要客戶端和服務器之間能夠雙向通信。而使用現有的HTTP協議不能很好地實現這個需求,于是 HTTP 協議的升級版——WebSocket 協議被發明出來。
協議概述
WebSocket 協議包括兩部分:握手和數據傳輸。握手時會使用 HTTP 協議,所以說它是 HTTP 協議的升級版。
握手
客戶端發起握手時,會發送如下格式的 HTTP GET 請求:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Host 頭部就不用說了。
Upgrade 和 Connection 頭部表明要求服務器升級到 WebSocket 協議。
Sec-WebSocket-Key 頭部是一串 Base64 編碼的隨機字符串,用于握手驗證。
Sec-WebSocket-Version 頭部指明協議版本。
Origin 和 Sec-WebSocket-Protocol 頭部是可選的,后者表示客戶端支持的子協議。通常這兩個頭部都可以忽略。
服務器在收到握手請求時,回復如下的 HTTP 101 響應完成握手(協議升級):
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Upgrade 和 Connection 頭部表明服務器已經升級到 WebSocket 協議。
Sec-WebSocket-Accept 頭部是為了給客戶端做驗證,它是的值是根據客戶端 Sec-WebSocket-Key 頭部的值使用某種算法計算出來的。
數據傳輸
握手成功后的數據傳輸過程就與 HTTP 協議沒有任何關系了。傳輸過程中,任意一方都可以自由地發送數據。協議中的數據傳輸單元稱作消息,一個消息包含一個或多個數據幀,每個數據幀都是消息的一個分片。WebSocket 數據幀的格式如下:
FIN,標志位。值為1時表示是一個消息的最后一個分片。
Opcode,4位。表示數據幀的類型,有如下值:
0x0。是一個連續的幀,即它的類型與上一個幀的類型相同。
0x1。是一個文本幀。
0x2。是一個二進制幀。
0x8。是一個關閉幀。
0x9。是一個 ping 幀。
0xa。是一個 pong 幀。
關閉幀、ping 幀和pong 幀都是控制幀,ping 幀和pong 幀可用來做心跳。
Mask,標志位。值為1時表示數據已經做了掩碼操作。
Payload length,數據長度。它的值為0-125時,就表示數據長度。它的值為126時,接下來的16位(Extended payload length 字段)表示數據長度。它的值為127時,表示接下來的64位(16位的 Extended payload length 字段和48位的 Extended payload length continued 字段)表示數據長度。
Masking-key,Mask標志為1時,表示一個32位的數據掩碼。Mask標志為0時,該字段不存在。
Payload Data,數據。
結束傳輸
當雙方不需要再傳輸數據時,一端發送關閉幀(不能分片發送),另一端也回復關閉幀。關閉幀可攜帶數據,攜帶的數據前兩個字節表示關閉狀態碼。連接正常關閉的狀態碼是1000。
通常關閉幀先由客戶端發起,服務器在回復關閉幀后就立即關閉 TCP 連接。如果關閉幀先由服務器發起,那么客戶端在回復關閉幀后要等待服務器先關閉 TCP 連接。
總結
以上是生活随笔為你收集整理的WebSocket 协议简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为何5G好像没比4G快?中国工程院院士答
- 下一篇: 英语语法入门十八(形容词的比较级和最高级