一、WebSocket Header概述
WebSocket是HTML5中一種新的協議,它實現了瀏覽器與伺服器的全雙工通信,使得客戶端和伺服器可以進行實時的數據傳輸。搭建WebSocket伺服器,需要先了解WebSocket連接建立的過程中的頭部信息。
二、WebSocket Header格式
在建立WebSocket連接時,瀏覽器和伺服器之間會進行協議升級,即使用HTTP協議發起一個握手請求來升級連接。發起握手請求時,瀏覽器會在請求頭中加上”Sec-WebSocket-Key”和”Sec-WebSocket-Version”這兩個欄位,伺服器需要根據這兩個欄位來判斷是否支持WebSocket協議,如支持則必須回應101狀態碼,並在響應頭中加入”Upgrade”和”Connection”這兩個欄位。
GET /[path] HTTP/1.1 Host: [host] Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: [key] Sec-WebSocket-Version: [version]
“Sec-WebSocket-Key”是一個隨機字元串,伺服器需要使用這個字元串來加密後再轉換成位元組數組,然後通過SHA-1計算出20個位元組的哈希值,最後將此哈希值的base64編碼作為響應頭中的”Sec-WebSocket-Accept”欄位。
三、WebSocket Header欄位解析
1. Upgrade
“Upgrade”是請求頭中的一個欄位,表示瀏覽器希望升級到哪種協議。在升級WebSocket時,其值為”websocket”。
2. Connection
“Connection”是請求頭中的一個欄位,表示瀏覽器希望建立的連接類型。在升級WebSocket時,其值為”Upgrade”。
3. Sec-WebSocket-Key
“Sec-WebSocket-Key”是瀏覽器生成的隨機字元串,用於計算響應值。伺服器需要將這個字元串與一個魔術字元串 “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” 拼接,然後計算 SHA1 哈希值。最後,伺服器以 Base64 編碼方式返回哈希值,並在響應頭中添加”Sec-WebSocket-Accept”欄位,告訴瀏覽器解碼響應頭並驗證key是否正確。
4. Sec-WebSocket-Version
“Sec-WebSocket-Version”是請求頭中的一個欄位,表示瀏覽器支持的WebSocket協議版本號。
5. Sec-WebSocket-Accept
“Sec-WebSocket-Accept”是響應頭中的一個欄位,表示伺服器計算出來的響應值,也就是經過base64編碼後的字元串。這個值需要被瀏覽器驗證,以確保握手請求是受信任的。
四、WebSocket Header參考代碼
1. Python實現WebSocket握手過程
def handshake(sock):
"""
handshake for WebSocket
"""
data = sock.recv(1024)
headers = {}
lines = data.decode('utf-8').splitlines()
for l in lines:
parts = l.split(": ", 1)
if len(parts) == 2:
headers[parts[0]] = parts[1]
headers['Sec-WebSocket-Accept'] = b64encode(
sha1((headers['Sec-WebSocket-Key'] + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").encode('utf-8')).digest())
response = \
b"HTTP/1.1 101 Web Socket Protocol Handshake\r\n" \
b"Upgrade: websocket\r\n" \
b"Connection: Upgrade\r\n" \
b"Sec-WebSocket-Accept: " + headers['Sec-WebSocket-Accept'] + b"\r\n\r\n"
sock.send(response)
2. JavaScript實現WebSocket握手過程
var socket = new WebSocket("ws://localhost:8080/");
socket.onopen = function() {
var key = generateWebSocketKey();
var headers = {
"Upgrade": "websocket",
"Connection": "Upgrade",
"Sec-WebSocket-Key": key,
"Sec-WebSocket-Version": "13"
};
socket.send(buildWebSocketHandshake(headers));
}
function generateWebSocketKey() {
var buffer = new Uint32Array(1);
var bytes = new Uint8Array(buffer.buffer);
window.crypto.getRandomValues(buffer);
var key = '';
for (var byte of bytes) {
key += String.fromCharCode(byte);
}
return btoa(key);
}
function buildWebSocketHandshake(headers) {
var lines = [];
for (var k in headers) {
lines.push(k + ": " + headers[k]);
}
var handshake = "GET / HTTP/1.1\r\n" +
lines.join("\r\n") + "\r\n\r\n";
return handshake;
}
五、總結
WebSocket的Header信息是WebSocket建立連接的重要組成部分,其握手過程確保通信雙方都能正常解析對方發來的信息。通過查看header信息,可以輕鬆了解WebSocket請求的詳細內容,對於開發和調試WebSocket應用程序非常有幫助。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/276150.html
微信掃一掃
支付寶掃一掃