why websocket ?
- html5特点: 更加便于创建更加现代时尚、响应式的web应用程序
- html5 通信模式: websocket、服务端信息推送(SSE, server-send Event)、跨文档传信(cross-document messaging)
模式之间的较量
- 服务端信息推送(SSE, server-send Event): 只支持单向的通信,只支持服务端向客户端推信
- 跨文档传信(cross-document messaging): 可以跨源进行通信,但是它只专注于windows, tabs, and iFrames之间的通信,但是满足不了复杂的通信
- websocket: 满足复杂通信、支持双向通信
HTTP/1.0 和HTTP/1.1 效率底下的关键点
- HTTP 设计目的:用于文档的传输,满足不了我们现代桌面应用程序的复杂交互需求
- HTTP 协议数据传输需要更多的附带信息
HTTP 的特点
- 非双向通信:一次通信只支持一个方向的数据传输,客户端向服务端发送数据或者服务端向客户端发送数据,一个完整的通信需要两次HTTP通信才能完成
用户需要获得实时数据,必须不断的刷新页面或者使用轮询模拟推送技术例如Comet(延迟了服务端的响应)
- 轮询: 客户端定时定向的向服务端发送请求查询消息,不管有无消息服务端都会响应,当服务端没有消息时,会发送关闭响应,客户端即关闭连接。但是定时请求不能满足服务端消息的实时性
- 轮询非常适用于固定时间间隔的消息获取,但是得频繁的开启、关闭连接
- 长轮询: 客户端与服务端建立一个保持一段时间的连接;原理:hanging-GET, pending-POST,直到服务端有消息返回或者设定的时间到时
- 长轮询也没有在性能方面有显著的提升
- 流(streaming):父页面创建一个隐藏的 iframe ,当服务端有数据传输给iframe然后回调夫页面的函数达到实时刷新数据;但是会受代理和防火墙阻拦的限制。
WebSocket特点
优点
- 双向的通信
- 无跨域问题
- 实时数据传递
- 一次握手实现
- 节省带宽、CPU、降低延时,是性能的革新
缺点
- 无需太多的通信附带信息
- 无内置断开重连,需要自行设置
- 无内置心跳监测,需用户根据需求设置
基本特点
- 基础的网络协议,可以在其基础上创建其他标准协议
WebSocket 常见的库
- Socket.IO
- WebSocket Gateway