WebSocket 的 Handshaking 握手过程

WebSocket 建立连接时的握手机制和流程

问题

WebSocket 中的 Handshaking 是什么?

解答

Handshaking(握手)是 WebSocket 建立连接的第一步,通过 HTTP 协议完成协议升级,确认双方支持 WebSocket 并建立连接。

握手流程

1. 客户端发起升级请求

客户端发送 HTTP GET 请求,包含特殊的头部字段:

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

2. 服务器响应升级

服务器验证请求后,返回 101 状态码和响应头:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

3. 密钥验证机制

服务器将客户端的 Sec-WebSocket-Key 与固定的魔术字符串 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接,经过 SHA-1 加密后转为 Base64 编码,生成 Sec-WebSocket-Accept

const crypto = require('crypto');

function generateAcceptKey(clientKey) {
  const magicString = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
  const hash = crypto.createHash('sha1')
    .update(clientKey + magicString)
    .digest('base64');
  return hash;
}

4. 连接建立

客户端验证 Sec-WebSocket-Accept 正确后,握手完成,WebSocket 连接建立,双方可以进行双向通信。

关键点

  • 握手基于 HTTP 协议,通过 UpgradeConnection 头部完成协议升级
  • Sec-WebSocket-Key 由客户端生成,Sec-WebSocket-Accept 由服务器根据固定算法计算返回
  • 服务器返回 101 状态码表示协议切换成功
  • 握手成功后,连接从 HTTP 升级为 WebSocket,支持全双工通信
  • 密钥验证机制防止非 WebSocket 客户端误连接