WebSocket Header解析

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 19:38
下一篇 2024-12-17 19:38

相關推薦

  • 為什麼要加請求頭(HTTP Header)?

    在進行網頁抓取(Web Scraping)時,請求頭(HTTP Header)扮演著非常重要的角色。請求頭中包含了用戶代理(User Agent)、cookie、referer等信…

    編程 2025-04-27
  • Boost Websocket Send用法介紹

    本文將詳細闡述Boost Websocket Send的相關內容,包括Boost Websocket Send的概念、使用方法、功能特點等,以便讀者深入了解和使用。 一、概述 Bo…

    編程 2025-04-27
  • Unity WebSocket詳解

    一、WebSocket簡介 WebSocket是一種在單個TCP連接上進行全雙工通信的網路協議。WebSocket使用標準的HTTP埠(80)或安全埠(443),與HTTP協議…

    編程 2025-04-25
  • RestTemplate設置Header說明

    一、RestTemplate設置編碼 在實際開發中,尤其是在處理中文數據時,我們需要在設置Header的同時設置編碼格式,以保證請求和響應的數據能夠正確傳輸和解析。可以使用Rest…

    編程 2025-04-25
  • WebSocket重連全方位解析

    一、WebSocket重連機制 WebSocket是一種比較常用的實時通信協議,但在實際開發中,經常會出現WebSocket連接斷開的情況,這時就需要使用WebSocket重連機制…

    編程 2025-04-12
  • WebSocket心跳機制詳解

    一、什麼是WebSocket心跳 WebSocket是一種支持雙向通信的網路協議。在WebSocket連接建立後,伺服器和客戶端之間可以進行實時的數據交互。而WebSocket心跳…

    編程 2025-04-12
  • Python Header詳解

    一、Python Header是什麼 Python Header指的是Python標準庫的頭文件,是用於擴展Python解釋器的C/C++代碼中的一個重要組成部分。也可以簡單地理解…

    編程 2025-04-02
  • Websocket在線測試工具詳細闡述

    一、概述 Websocket在線測試工具是一款可以幫助開發人員和測試人員進行websocket協議相關測試的工具。它可以對websocket連接進行測試,包括連接建立、消息發送、消…

    編程 2025-02-25
  • WebSocket-Sharp詳解

    一、簡介 WebSocket-Sharp是一個使用C#編寫的WebSocket協議庫,可以在.NET平台上實現WebSocket伺服器和客戶端的開發。這個庫是使用.Net的Http…

    編程 2025-02-24
  • 詳解RestTemplate的Get請求Header設置

    一、什麼是RestTemplate? RestTemplate是Spring框架提供的一種用於訪問REST服務的客戶端。它提供了多種便捷的方法來訪問REST服務,處理響應結果並處理…

    編程 2025-02-15

發表回復

登錄後才能評論