扒一扒WebSocket
在之前的nodejs项目中自己有尝试接入WebSocket,所以在面试官问到项目的时候也会提到WebSocket,但是之前自己也只是在实践阶段,并没有做深入了解。刚好实习的时候又接触到了熟悉的WebSocket,本着学习的目的,这次就深挖一下WebSocket。
什么是WebSocket?
WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。(维基百科)
WebSocket 本质上一种计算机网络应用层的协议,用来弥补 http 协议在持久通信能力上的不足。
WebSocket 协议在2008年诞生,2011年成为国际标准。现在最新版本浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
WebSocket 的其他特点包括:
-
(1)建立在 TCP 协议之上,服务器端的实现比较容易。 -
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 -
(3)数据格式比较轻量,性能开销小,通信高效。 -
(4)可以发送文本,也可以发送二进制数据。 -
(5)没有同源限制,客户端可以与任意服务器通信。 -
(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。 ws://example.com:80/xx
为什么要用WebSocket?
既然我们已经有了HTTP协议,那为什么要用到另一个呢?他能给我带来什么呢?
相较于WebSocket协议,HTTP协议有一个巨大的缺陷,那就是不具备服务器推送的能力。
简单来讲,就是我想了解到今天的实时数据,我就需要向客户端发送请求,获取查询结果。在HTTP上做不到服务端向客户端主动推送信息。
这种单向请求的特点注定了如果服务器有连续的状态变化,服务端要获取就非常的麻烦。反过来讲,客户端要有连续的状态告知服务端也是一样。所以就只能使用“轮询”或者“心跳”的形式来不停的连接,这样是非常浪费资源的。
在 WebSocket 协议出现以前,创建一个和服务端进双通道通信的 web 应用,需要依赖HTTP协议,进行不停的轮询,这会导致一些问题:
- 服务端被迫维持来自每个客户端的大量不同的连接
- 大量的轮询请求会造成高开销,比如会带上多余的header,造成了无用的数据传输。
http 协议本身是没有持久通信能力的,但是我们在实际的应用中,是很需要这种能力的,所以,为了解决这些问题,WebSocket 协议由此而生,于2011年被IETF定为标准RFC6455,并被RFC7936所补充规范。并且在 HTML5 标准中增加了有关 WebSocket 协议的相关 api ,所以只要实现了 HTML5 标准的客户端,就可以与支持 WebSocket 协议的服务器进行全双工的持久通信了。
WebSocket 与 HTTP ?
相同点:
他们都是基于TCP的,都是可靠的传输协议。都是应用层协议
不同点:
- 1、
WebSocket 是双向通信协议,模拟 Socket 协议,可以双向发送或接受信息,而 HTTP 是单向的; - 2、
WebSocket 是需要浏览器和服务器握手进行建立连接的,而 http 是浏览器发起向服务器的连接。 - 3、 虽然
HTTP/2 也具备服务器推送功能,但 HTTP/2 只能推送静态资源,无法推送指定的信息。
WebSocket的连接过程?
- 首先,客户端发起http请求,经过3次握手后,建立起TCP连接;
http 请求里存放 WebSocket 支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等; - 然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
- 最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。
WebSocket应用场景
- 即时聊天通信
- 多玩家游戏
- 在线协同编辑/编辑
- 实时数据流的拉取与推送
- 体育/游戏实况
- 实时地图位置
websocket 断线重连
心跳就是客户端定时的给服务端发送消息,证明客户端是在线的, 如果超过一定的时间没有发送则就是离线了。
可以使用断网检测库结合断线重连来实现WebSocket断线重新连接。
最后
WebSocket 是为了在 web 应用上进行双通道通信而产生的协议,相比于轮询HTTP请求的方式,WebSocket 有节省服务器资源,效率高等优点。
|