RFC6455 https://datatracker.ietf.org/doc/html/rfc6455
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
字段含义
GET /chat HTTP/1.1
GET: HTTP 请求方法,用于获取资源。在 WebSocket 握手中,这个方法用于发起连接请求。
/chat: 请求的路径。
HTTP/1.1: 使用的 HTTP 版本,通常是 1.1。
Host: server.example.com
指定请求的目标服务器主机名和端口号。这个字段是 HTTP/1.1 的标准要求,表示目标服务器的域名。
Upgrade: websocket
表示客户端希望将当前的 HTTP 连接升级为 WebSocket 连接。
Connection: Upgrade
表示连接应该升级。这个字段配合 Upgrade 字段使用。
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
一个 16 字节的随机 Base64 编码的字符串,由客户端生成。用于安全验证,防止不正当的 WebSocket 连接。
Sec-WebSocket-Version: 13
指定 WebSocket 协议的版本。当前规范中,13 是唯一合法值(定义在 RFC 6455 中)。
Origin: http://example.com
指示 WebSocket 请求的来源。服务器可以使用这个字段来检查请求是否来自允许的来源,以防止跨站点 WebSocket 攻击(CSWSH)。这个字段在浏览器环境中是强制性的。
Sec-WebSocket-Protocol: chat, superchat
可选字段,表示客户端支持的子协议。子协议是在 WebSocket 连接上进行特定类型的通信协议,比如聊天、流媒体等。服务器会在响应中选择一个协议,或者忽略这个字段。
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
可选字段,用于指定 WebSocket 扩展。扩展功能可以优化或增强 WebSocket 的通信能力,例如压缩消息等。服务器可以在响应中确认支持的扩展。
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
服务器响应字段含义
HTTP/1.1 101 Switching Protocols
表示服务器接受了协议升级请求,并切换到 WebSocket 协议。
Upgrade: websocket
表示服务器同意升级到 WebSocket 协议。
Connection: Upgrade
表示连接已升级。
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
服务器基于客户端发送的 Sec-WebSocket-Key 计算出的 Base64 编码字符串,用于确认握手的有效性。
Sec-WebSocket-Protocol: chat
如果客户端请求了多个子协议,服务器会在此字段中返回所选的协议。
Sec-WebSocket-Extensions: permessage-deflate
返回服务器支持的扩展。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+