面试题答案
一键面试WebSocket在客户端和服务器端建立连接过程
- 客户端发起HTTP请求:
- 客户端向服务器发送一个带有特殊头信息的HTTP请求,以发起WebSocket连接。这个请求看起来像普通HTTP请求,但包含WebSocket特定的头信息。
- 关键请求头信息:
- Upgrade:值为
websocket
,表示客户端希望将协议从HTTP升级到WebSocket,例如Upgrade: websocket
。 - Connection:值为
Upgrade
,表明这是一个协议升级请求,例如Connection: Upgrade
。 - Sec - WebSocket - Key:是一个随机生成的Base64编码字符串,用于安全验证。例如
Sec - WebSocket - Key: dGhlIHNhbXBsZSBub25jZQ==
。这个密钥会被服务器用来验证请求的合法性。 - Sec - WebSocket - Version:指定客户端支持的WebSocket协议版本,目前常用版本为13,例如
Sec - WebSocket - Version: 13
。
- Upgrade:值为
- 服务器响应:
- 服务器收到请求后,如果支持WebSocket协议并且验证通过,会返回一个HTTP响应,表明协议升级成功。
- 关键响应头信息:
- Upgrade:同样为
websocket
,确认协议升级为WebSocket,例如Upgrade: websocket
。 - Connection:为
Upgrade
,确认这是协议升级响应,例如Connection: Upgrade
。 - Sec - WebSocket - Accept:服务器通过将客户端发送的
Sec - WebSocket - Key
与一个固定的GUID(258EAFA5 - E914 - 47DA - 95CA - C5AB0DC85B11
)拼接,然后进行SHA - 1哈希运算,再进行Base64编码得到该值。例如,如果客户端Sec - WebSocket - Key
为dGhlIHNhbXBsZSBub25jZQ==
,服务器计算后得到s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
,则响应头为Sec - WebSocket - Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
。此值用于证明服务器能够正确处理WebSocket连接。
- Upgrade:同样为
- 连接建立:
- 当客户端收到服务器带有上述正确响应头的HTTP响应后,WebSocket连接正式建立。之后客户端和服务器之间就可以通过这个WebSocket连接进行双向通信,不再使用HTTP协议的请求 - 响应模式,而是以帧(frame)的形式进行数据传输。