外观
Http 是如何升级为 WebSocket 的?
客户端发起升级请求
客户端在需要将 HTTP
连接升级为 WebSocket
连接时,会向服务器发送一个特殊的 HTTP
请求,这个请求需要包含一些特定的头部信息:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
Upgrade: websocket
:表明客户端希望将当前的HTTP
连接升级为WebSocket
连接。Connection: Upgrade
:指定连接需要进行升级。Sec - WebSocket - Key
:是一个经过Base64
编码的随机值,用于防止普通的HTTP
请求被错误地处理为WebSocket
连接,服务器会利用这个值来生成响应的Sec - WebSocket - Accept
头部。Sec - WebSocket - Version
:指定客户端支持的WebSocket
协议版本,目前常用的版本是13
。
服务器响应升级请求
服务器接收到客户端的升级请求后,会对请求头部进行检查。如果服务器支持 WebSocket
协议,并且同意升级连接,会返回一个特殊的 HTTP
响应,其中也包含特定的头部信息:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
HTTP/1.1 101 Switching Protocols
:这是一个状态码,表示服务器同意将连接从HTTP
升级到WebSocket
。Upgrade: websocket
和Connection: Upgrade
:确认服务器会进行连接升级。Sec - WebSocket - Accept
:服务器根据客户端发送的Sec - WebSocket - Key
生成的一个响应值,用于向客户端证明服务器理解WebSocket
协议。具体生成方式是将客户端的Sec - WebSocket - Key
与一个固定的GUID
(258EAFA5 - E914 - 47DA - 95CA - C5AB0DC85B11
)拼接,然后进行SHA - 1
哈希计算,最后将结果进行Base64
编码。
完成升级
当客户端接收到服务器的响应后,会验证 Sec - WebSocket - Accept
的值。如果验证通过,就意味着客户端和服务器之间的连接已经成功从 HTTP
升级为 WebSocket
连接。此后,双方可以基于 WebSocket
协议进行全双工通信,即双方可以同时独立地发送和接收数据,而不再遵循 HTTP
的请求 - 响应模式。