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/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

发表回复

登录后才能评论