所有WIKI > W字母 > 什么是WebSocket?

什么是WebSocket?

WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层。WebSocket 协议在2008年诞生,2011 年由 IETF 标准化为 RFC 6455,后由 RFC 7936 补充规范。它实现了浏览器与服务器全双工通信,只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输,当前所有浏览器都已经支持WebSocket协议。

这种双向行为可实现更丰富的客户端/服务交互,通常用于聊天应用程序、协作平台、多人游戏和金融交易平台等实时应用程序。

为什么需要 WebSocket?

在 WebSocket 出现之前,如果我们想实现实时通信,比较常采用的方式是 Ajax 轮询,即在特定时间间隔(比如每秒)由浏览器发出请求,服务器返回最新的数据。这样子的轮询方式有什么缺陷呢?

  • HTTP 请求一般包含的头部信息比较多,其中有效的数据可能只占很小的一部分,导致带宽浪费;
  • 服务器被动接收浏览器的请求然后响应,数据没有更新时仍然要接收并处理请求,导致服务器 CPU 占用

WebSocket 的出现可以对应解决上述问题:

  • WebSocket 的头部信息少,通常只有 2Bytes 左右,能节省带宽;
  • WebSocket 支持服务端主动推送消息,更好地支持实时通信;

WebSocket原理

在 WebSocket 开始通信之前,通信双方需要先进行握手,WebSocket 复用了HTTP(运行在 80 端口 或 443 端口)的握手通道,即客户端通过 HTTP 请求与 WebSocket 服务端协商升级协议(复用 HTTP 的 Upgrade 机制)。协议升级完成后,后续的数据交换则遵照 WebSocket 的协议。

WebSocket 的特点

  • 建立在 TCP 协议之上;
  • 与 HTTP 协议有着良好的兼容性:默认端口也是 80(ws) 和 443(wss,运行在 TLS 之上),并且握手阶段采用 HTTP 协议;
  • 较少的控制开销:连接创建后,ws 客户端、服务端进行数据交换时,协议控制的数据包头部较小,而 HTTP 协议每次通信都需要携带完整的头部;
  • 可以发送文本,也可以发送二进制数据;
  • 没有同源限制,客户端可以与任意服务器通信;
  • 协议标识符是 ws(如果加密,则为 wss),服务器网址就是 URL;
  • 支持扩展:ws 协议定义了扩展,用户可以扩展协议,或者实现自定义的子协议(比如支持自定义压缩算法等);

其它构建事件驱动 API的技术

1、Webhooks:是一个由事件消费者管理的可公开访问的 HTTP POST 接口,事件生产者(比如 API 服务器)可以在事件发生时向 Webhook 发送事件通知。

2、AsyncAPI:AsyncAPI是一个规范,该规范是一个机器可读的文档,用于记录和描述事件驱动 API。

3、Server-Sent Events(SSE):是一种与 WebSockets 非常相似的通信协议,但隐含条件是只支持单向数据。SSE 允许基于浏览器的消费者接收从 API 服务器发送的事件通知流。

参考资料

RFC6455:websocket规范
规范:数据帧掩码细节
规范:数据帧格式
server-example
编写websocket服务器
What is Sec-WebSocket-Key for?
Why are WebSockets masked?
How does websocket frame masking protect against cache poisoning?
WebSockets vs Socket.io (中文版)
WebSockets vs HTTP

一篇吃透WebSocket:概念、原理、易错常识、动手实践
WebSocket|概念、原理、用法及实践
关于短轮询、长轮询技术,可以详细读这两篇:
新手入门贴:Web端即时通讯技术原理详解
Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE,该文章还包括详细的Comet技术WebSocket技术、IM应用等资料清单