跳到主要内容

Websocket

2024年04月07日
柏拉文
越努力,越幸运

一、认识


Websocket是一个持久化的网络通信协议,可以在单个 TCP 连接上进行全双工通讯,没有了 RequestResponse 的概念,两者地位完全平等,连接一旦建立,客户端和服务端之间实时可以进行双向数据传输

二、状态


WebSocket 对象中的 readyState 属性有四种状态:

  • 0: 表示正在连接

  • 1: 表示连接成功,可以通信了

  • 2: 表示连接正在关闭

  • 3: 表示连接已经关闭,或者打开连接失败

三、断线重连


心跳就是客户端定时的给服务端发送消息,证明客户端是在线的, 如果超过一定的时间没有发送则就是离线了。

3.1 如何判断在线离线?

当客户端第一次发送请求至服务端时会携带唯一标识、以及时间戳,服务端到db或者缓存去查询改请求的唯一标识,如果不存在就存入db或者缓存中,第二次客户端定时再次发送请求依旧携带唯一标识、以及时间戳,服务端到db或者缓存去查询改请求的唯一标识,如果存在就把上次的时间戳拿取出来,使用当前时间戳减去上次的时间,得出的毫秒秒数判断是否大于指定的时间,若小于的话就是在线,否则就是离线;

四、WebSocket 与 HTTP 的联系

  • WebSocketHTTP都是一样基于 **TCP**的,都是可靠性传输协议。都是应用层协议。

  • HTTP是半双工通信,同一时刻数据是单向流动的,客户端向服务端请求数据->单向,服务端向客户端返回数据->单向。服务器不能主动的推送数据给客户端。虽然HTTP/2也具备服务器推送功能,但HTTP/2 只能推送静态资源,无法推送指定的信息。HTTP是非持久的协议,客户端想知道服务端的处理进度只能通过不停地使用 Ajax进行轮询或者采用 long poll 的方式来,但是前者对服务器压力大,后者则会因为一直等待Response造成阻塞。虽然http1.1默认开启了keep-alive长连接保持了这个TCP通道使得在一个HTTP连接中,可以发送多个Request,接收多个Response,但是一个request只能有一个response。而且这个response也是被动的,不能主动发起。

  • WebSocket是独立于HTTP的双工通信协议,让服务器端可以主动向客户端发送信息,使得浏览器具备了实时双向通信的能。WebSocket协议也需要通过已建立的TCP连接来传输数据。具体实现上是通过http协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。WebSocket 是一个持久化的协议。

参考资料

一文吃透 WebSocket 原理 刚面试完,趁热赶紧整理