《websocket协议详解》教程分三篇:
文章上方有详细的规范、源码链接,你有任何问题可以联系我:邮箱:952125505@qq.com ,QQ交流群:715895604
概念
WebSocket协议是一个安全通信模型,用来实现客户端与服务器之间的全双工通讯。它基于TCP传输协议,并复用HTTP的握手通道。如果你是小白,就理解为:一种让浏览器和服务器拥有实时交换数据的技术。或者你就记住它:
- 安全:可以在web浏览器中使用
- 实时:全双工通讯
- 简单:一次握手,持久连接
背景
在websocket之前,常见的实时通讯方案:
第一种是传统轮询模式,如下图
第二种是长轮询模式,如下图
第三种是SSE模式,它能很好实现实时传输数据的目的。但SSE只支持服务器到客户端单向的事件推送,而且所有目前版本的IE都不支持SSE。
鉴于以上方案,都不是应用于web浏览器应用的真正的全双工协议,websocket便应运而生。websocket设计目的就是用来替代http实现全双工通讯的。我们知道,http是单向请求,只能是客户端发起,服务端处理并响应。而websocket建立连接后,客户端和服务端是完全平等关系,客户端可以向服务端发送和请求数据,服务端也可以向客户端发送和请求数据。http好比对讲机,只能单向通话。websocket好比手机,可以实时双向通话。
全双工通讯是websocket与http最大的不同,同时他们之间还有许多相同之处,都是基于tcp传输协议,握手都采用http协议,默认端口都是80和443,都只能由客户端发起连接
优点
(以下引用百度百科关于websocket优点介绍:)
较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。
应用
- 数据传输实时性要求较高的场合,如聊天、直播等。
- 推送类应用的场合,如网站消息通知,邮件提醒等。
- 实时监控、统计场合,如统计用户行为。
websocket的全双工特性,与http良好的承启关系,注定它将在未来web应用中大展拳脚,更多应用等你发现。