WebSocket 是一种基于 HTTP 协议实现的全双工通信协议,它可以实现客户端和服务端之间的双向通信,支持在一个持久连接上进行数据传输。

在传统的 HTTP 协议中,客户端和服务端之间的通信是基于请求和响应模式的,也就是说,当客户端需要向服务端发送数据时,必须要发送一个请求,当服务端接收到请求后才能响应客户端。这种模式存在一个缺陷,就是无法实现实时双向通信,比如实时聊天、实时数据传输等。
WebSocket 协议通过在客户端和服务端之间建立一个持久连接,可以实现客户端和服务端之间的双向通信。在连接建立后,客户端和服务端可以随时向对方发送消息,而不必等待对方的请求。同时,WebSocket 协议的通信数据是经过封装的二进制数据,因此可以大大减少数据传输的大小,提高数据传输的效率。

WebSocket 协议能够实现持久化连接的原理是通过使用了一个 Upgrade 头部,在客户端发送一个 HTTP 请求时,请求头部包含了 Upgrade 头部,告诉服务端要升级协议。如果服务端支持 WebSocket 协议,就会通过 Upgrade 头部将 HTTP 协议升级为 WebSocket 协议。这样,客户端和服务端就可以通过建立一个持久连接来实现实时双向通信了。

- 客户端向服务端发送WebSocket握手请求
客户端发送HTTP协议的请求头,包含以下信息:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Version: 13
其中,Upgrade和Connection字段表示要升级协议为WebSocket,Sec-WebSocket-Key字段是客户端生成的随机字符串,用于服务端校验请求是否合法。客户端还可以通过Sec-WebSocket-Protocol字段指定使用的子协议,Sec-WebSocket-Version字段表示WebSocket的版本号。
- 服务端向客户端返回WebSocket握手响应
服务端收到请求后,校验请求是否合法,如果合法则返回以下响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
其中,Sec-WebSocket-Accept字段是服务端根据客户端请求中的Sec-WebSocket-Key计算出的随机字符串,用于告知客户端请求合法。
- WebSocket连接建立成功,开始交互消息
WebSocket连接建立成功后,客户端和服务端可以互相发送消息。客户端和服务端发送的消息都是二进制数据帧,可以是文本帧或二进制帧。客户端和服务端发送数据的流程大致如下:
客户端发送数据:
|FIN|RSV1|RSV2|RSV3|Opcode=0x01|Payload length (7 bits)|Payload data|
其中,FIN表示数据帧是否结束,Opcode表示数据帧类型,Payload length表示数据长度,Payload data表示数据内容。
服务端接收到数据后,可以回复一个响应数据:
|FIN|RSV1|RSV2|RSV3|Opcode=0x01|Payload length (7 bits)|Payload data|
此时,客户端收到响应数据后就可以进行相应的处理。
