本文从网络协议,技术背景,安全和生产应用的方向,详细介绍WebSocket在Node.js中的落地实践。
大纲预览本文介绍的内容包括以下方面:
网络协议进化Socket.IO?ws模块实现Express集成WebSocket实例消息广播安全与认证BFF应用网络协议进化HTTP协议是前端最熟悉的网络通信协议。我们通常的打开网页,请求接口,都属于HTTP请求。
HTTP请求的特点是:请求-响应。客户端发起请求,服务端收到请求后进行响应,一次请求就完成了。也就是说,HTTP请求必须由客户端发起,服务端才能被动响应。
除此之外,发起HTTP请求之前,还需要通过三次握手建立TCP连接。HTTP/1.0的特点是,每通信一次,都要经历“三步走”的过程——TCP连接-HTTP通信-断开TCP连接。
这样的每一次请求都是独立的,一次请求完成连接就会断开。
HTTP1.1对请求过程做了优化。TCP连接建立之后,我们可以进行多次HTTP通信,等到一个时间段无HTTP请求发起TCP才会断开连接,这就是HTTP/1.1带来的长连接技术。
但是即便如此,通信方式依然是客户端发起,服务端响应,这个根本逻辑不会变。
随着应用交互的复杂,我们发现,有一些场景是必须要实时获取服务端消息的。
比如即时聊天,比如消息推送,用户并不会主动发起请求,但是当服务器有了新消息,客户端需要立刻知道并且反馈给用户。
HTTP不支持服务端主动推送,但是这些场景又急需解决方案,于是早期出现了轮询(polling)。轮询是客户端定时向服务器发起请求,检测服务端是否有更新,如果有则返回新数据。
这种轮询方式虽然简单粗暴,但很显然有两个弊端:
请求消耗太大。客户端不断请求,浪费流量和服务器资源,给服务器造成压力。不能保证及时。客户端需要平衡及时性和性能,请求间隔必然不能太小,因此会有延迟。随着HTML5推出WebSocket,即时通讯场景终于迎来了根本解决方案。WebSocket是全双工通信协议,当客户端与服务端建立连接之后,双方可以互相发送数据,这样的话就不需要客户端通过轮询这种低效的方式获取数据,服务端有新消息直接推送给客户端即可。
传统HTTP连接方式如下:
##普通连接