WebSocket

WebSocket

背景

http 协议是无状态的,只能由客户端主动发起,服务端再被动响应,服务端无法向客户端主动推送内容,并且一旦服务器响应结束,所以无法进行实时通信。WebSocket 协议正是为解决客户端与服务端实时通信而产生的技术,现在已经被主流浏览器支持。

http 协议中虽然可以通过 keep-alive 机制使服务器在响应结束后链接会保持一段时间,但最终还是会断开,keep-alive 机制主要是用于避免在同一台服务器请求多个资源时频繁创建链接,它本质上是支持链接复用的技术,而并非用于实时通信

什么是 WebSocket?

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,允许服务端主动向客户端推送数据;在 WebSocket 中,客户端和服务器只需要完成一次 HTTP 握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

WebSocket 出现之前,客户端与服务器通常采用 HTTP 轮询或 Comet 等方式保持长连接

WebSocket 握手流程

WebSocket 复用了 HTTP 的握手通道:客户端通过 HTTP 请求与 WebSocket 服务端协商升级协议,协议升级完成后,后续的数据交换则遵照 WebSocket 协议。WebSocket 握手流程如下:

  1. 浏览器、服务器通过 TCP 三次握手,建立 TCP 连接
  2. 客户端:申请协议升级

客户端发起协议升级请求,采用的是标准的 HTTP 报文格式,且只支持 GET 方法

GET ws://localhost:8888/ HTTP/1.1
Host: localhost:8888
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Upgrade: websocket
Origin: http: // localhost:8080
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Sec-WebSocket-Key: QPDJV2rsT8OhiiMvpB+3QQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
  1. 服务端:响应协议升级
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: R1gaI7r75Salqt4dEyJ2MDWiA2c=

Sec-WebSocket-Accept 根据客户端请求首部的 Sec-WebSocket-Key 计算出来,有个计算公式

WebSocket 优点?

WebSocket 和 Socket 关系