Skip to content

13.说说对 WebSocket 的理解?应⽤场景?

1.HTTP

HTTP(超文本传输协议,Hypertext Transfer Protocol) 协议是用于在客户端和服务器之间传输文本、应用数据、图像、视频等资源的协议。

特点:

  • 无状态协议:每次请求服务端不会保留之前的任何信息。也就是每个请求都是独立的。
  • 请求响应模式:基于客户端-服务器模型的,客户端发送请求,服务器返回响应。
  • HTTP 请求在浏览器中受到同源策略的限制(目的是为了提高用户的安全性)

HTTP 是半双工协议,在同一时刻数据只能单向流动,客户端向服务器发送请求(单向的),然后服务器响应请求(单向的) 。服务器不能主动推送数据给浏览器。

请求-响应模式对于大多数应用场景来说非常适用,获取资源、下载文件。但是,对于实时性要求高、双向通信的应用,HTTP 就不太适合。

2.WebSocket

WebSocket 协议专门用于实现双向通信。WebSocket 建立连接后,客户端和服务器之间可以实时地交换数据(全双工协议),而无需每次都重新建立连接。经常用于在线聊天、实时游戏、实时数据的监控等。

HTTP 适合资源传输,WebSocket 适合实时双向通信。

3.双向通信

Comet 是一种用于 web 的推送技术,实现服务器向客户端实时推送数据的能力,从而实现实时性要求较高的应用场景。

1).轮询(Short Polling)

客户端会定期向服务器发送请求,每隔一段时间就询问一次。

导致的问题

  • 竞速问题:如果多个轮询同时返回数据并尝试更新客户端;会导致不可预测的结果或错误的发生。
  • 频繁的网络请求:客户端或浏览器发起了大量的网络请求,向服务器请求数据或资源。可能会导致网络带宽的消耗、服务器负载的增加,以及客户端性能的下降。
  • 每次发送请求都会有 HTTP 的 Header(内容类型、鉴权凭据),额外的开销可能会对网络流量和性能产生影响。
  • 实时性问题:户端必须等待下一次轮询才能获取数据更新。

优点:简单,实现容易;适合实时性要求不高,低并发,轻量级应用;

2).长轮询(Long Polling)

长轮询的目的是为了解决频繁发起请求来获取更新数据所带来的性能和效率问题。客户端发送 HTTP 给服务器之后,服务端看有没有新消息,如果没有新消息,就一直等待,直到有新的数据可推送给客户端为止,然后立即响应客户端请求,客户端在接收到响应后立即再次发起请求,以保持连接。

导致的问题

  • 频繁的网络请求:在实时性较高的情况下可能会导致较多的请求。
  • 连接堆积问题:客户端需要实时同步多个不同类型的数据时,每个数据类型都需要一个独立的连接,如果数据更新不频繁,每个连接可能会长时间保持打开,占用服务器资源。

特点:实时性高;(客户端数量多,连接保持的时间较长、数据更新频率高。需要具备较高的并发能力)

3).iframe 流

通过在 HTML 页面里嵌入一个隐藏的 iframe,然后将这个 iframe 的 src 属性设为对一个长连接的请求,服务器端就能源源不断地往客户推送数据

特点:不需要频繁打开和关闭连接,但是需要创建 iframe 来进行通信,可能会存在跨域等问题。

4).Server-Sent Events(SSE)

HTML5 规范中提供了服务端事件(Server-Sent Events,SSE)标准,它通过浏览器内置的 EventSource 接口,实现了服务器向客户端"单向"推送实时数据的功能。

特点:EventSource 接口使用简单,无需频繁地建立和关闭连接,只能传递文本消息,适合传输较小的数据;而且不适用于双向传输。像实时通知可以采用EventSource来实现。

5).Websocket

WebSocket 用于在客户端和服务器之间进行双向通信。与传统的 HTTP 请求-响应模型不同,WebSocket 允许建立一个持久连接,使双方可以实时地交换数据。

优势:双向通信、持久连接、减少不必要的网络流量、支持多种数据格式、支持跨域通信。

WebSocket 复用了 HTTP 的握手通道。客户端通过 HTTP 请求与 WebSocket 服务端协商升级协议。协议升级完成后,后续的数据交换则遵照 WebSocket 的协议。

Released under the MIT License.