什么是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应用等资料清单