WebSocket 协议是基于 TCP 协议上的独立的通信协议,在建立 WebSocket 通信连接前,需 要使用 HTTP 协议进行握手,从 HTTP 连接升级为 WebSocket 连接。浏览器和服务器只需 要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket 定义了两种 URI 格式, ws://wss:// ,类似于 HTTP 和 HTTPS, ws:// 使 用明文传输,默认端口为 80, wss:// 使用 加密传输,默认端口为 443。

握手阶段涉及的 HTTP 头:

Header必须解释
Host服务端主机名
Upgrade固定值,“websocket”
Connection固定值,“Upgrade”
Sec-WebSocket-Key客户端临时生成的 16 字节随机值, base64 编码
Sec-WebSocket-VersionWebSocket 协议版本
Origin可选, 发起连接请求的源
Sec-WebSocket-Accept是(服务端)服务端识别连接生成的随机值
Sec-WebSocket-Protocol可选,客户端支持的协议
Sec-WebSocket-Extensions可选, 扩展字段

优点:

  • 较少的控制开销:数据包头部协议较小,不同于 http 每次请求需要携带完整的头部
  • 更强的实时性:相对于 http 请求需要等待客户端发起请求服务端才能响应,延迟明显更少
  • 保持创连接状态:创建通信后,可省略状态信息,不同于 http 每次请求需要携带身份验证
  • 更好的二进制支持:定义了二进制帧,更好处理二进制内容
  • 支持扩展:用户可以扩展 websocket 协议、实现部分自定义的子协议
  • 更好的压缩效果:websocket 在适当的扩展支持下,可以沿用之前内容的上下文,在传递 类似的数据时,可以显著地提高压缩率