WebSocket连接的建立通过HTTP升级请求完成,整个过程如下:
客户端发起握手
客户端发送一个HTTP GET请求,包含以下关键头部:
httpGET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 Origin: http://example.com
关键头部说明:
Upgrade: websocket- 请求升级到WebSocket协议Connection: Upgrade- 表示这是一个升级请求Sec-WebSocket-Key- 客户端生成的随机字符串,用于安全验证Sec-WebSocket-Version- WebSocket协议版本,目前为13Origin- 请求来源,用于安全验证
服务器响应握手
服务器验证请求后,返回101状态码:
httpHTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Accept计算过程:
- 将客户端的
Sec-WebSocket-Key与固定字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接 - 对拼接后的字符串进行SHA-1哈希
- 将哈希结果进行Base64编码
- 得到的值作为
Sec-WebSocket-Accept返回
连接建立
握手成功后,TCP连接升级为WebSocket连接,双方可以开始双向通信。
安全考虑
- Origin验证:服务器应验证Origin头部,防止CSRF攻击
- Key验证:通过Sec-WebSocket-Key确保请求来自真正的WebSocket客户端
- WSS协议:使用
wss://(WebSocket Secure)加密通信