websocket 中的 Handshaking 是什么?
参考答案
在 WebSocket 协议中,Handshaking(握手) 是指客户端和服务器在建立 WebSocket 连接之前进行的一次 升级请求与确认过程。
它的作用是:
确认双方是否支持 WebSocket 协议;
将原本的 HTTP/1.1 长连接升级为 WebSocket 专用的全双工连接;
协商必要的协议参数(例如子协议
Sec-WebSocket-Protocol、扩展Sec-WebSocket-Extensions等)。
握手流程
客户端发起请求(HTTP Upgrade 请求) 客户端首先通过 HTTP 协议 发起请求,请求头中带有一些特殊字段,表明希望将 HTTP 连接升级为 WebSocket:
GET /chat HTTP/1.1 Host: example.com:80 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13Upgrade: websocket表示想升级协议Connection: Upgrade表示连接类型支持升级Sec-WebSocket-Key是客户端随机生成的一个 Base64 编码字符串,用于校验Sec-WebSocket-Version指定 WebSocket 版本(通常是 13)
服务器响应(HTTP 101 Switching Protocols) 如果服务器支持 WebSocket,它会返回 101 状态码,并在响应头中确认升级:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=101 Switching Protocols表示协议成功切换Sec-WebSocket-Accept是服务端根据客户端Sec-WebSocket-Key计算出的校验值,保证握手合法
连接建立成功 当握手完成后,HTTP 连接会升级为 WebSocket 通道,接下来就进入真正的 双向全双工通信 阶段,消息将以 WebSocket 帧的格式进行传输,而不是 HTTP。
