WebSocket 协议与 HTTP 协议、定时轮询技术、长轮询技术

目录

    • 1 为什么需要 WebSocket?
    • 2 WebSocket
      • 2.1 采用 TCP 全双工
      • 2.2 建立 WebSocket 连接
      • 2.3 WebSocket 帧
    • 3 WebSocket 解决的问题
      • 3.1 HTTP 存在的问题
      • 3.2 Ajax 轮询存在的问题
      • 3.3 长轮询存在的问题
      • 3.4 WebSocket 的改进


参考资料:

  • 为什么有 http 还要有 websocket - BiliBili
  • WebSocket - CSDN


1 为什么需要 WebSocket?

在使用 HTTP 协议时,用户点击网页上的按钮,客户端发送一次请求,服务器返回一次响应,如下图所示。不难发现,服务器从来都不会主动向客户端发送一次请求。

在这里插入图片描述

因此在 HTTP 协议中,客户端是主动方,服务器是被动方。

考虑网页游戏的场景,通常情况下玩家不需要点击鼠标,怪物就能够源源不断地刷新出来。也就是说,在用户不做任何操作的情况下,客户端能够收到消息并发生变更。那么这种看起来像是服务器主动发送消息给客户端的场景是如何实现的呢?

在这里插入图片描述

何谓 “看起来像是”?答:在定时轮询和长轮询中,仍然是客户端主动发送请求,只是用户感知不到,误以为是服务器在主动发送数据。

最常见的做法是「HTTP 定时轮询」,客户端定时自动发送 HTTP 请求到服务器,服务器收到请求后对客户端进行响应,如下图所示。这是一种「伪服务器推」的形式,它其实并不是服务器主动发送消息到客户端,而是客户端不断请求服务器,只是用户无感知而已。

在这里插入图片描述

使用该方式的场景很多,最常见的就是扫码登录。比如微信的登录平台,前端网页不知道用户是否完成扫码,于是不断向后端服务器询问,如下图所示。一般请求间隔是在 1 到 2 秒之间,保证用户在扫码后的 1 到 2 秒中能够得到反馈。

在这里插入图片描述

以上便是「HTTP 定时轮询」,它的缺点在于:

  • 每次请求消耗带宽,增加了下游服务器的负担;
  • 最快情况下,用户也需要等待 1 到 2 秒才能触发下一次 HTTP 请求,完成页面的跳转。

说明:由于服务器是被动方,即使它知道用户扫码成功了也没办法主动告诉客户端,需要等待客户端的下一次请求,因此用户需要等待 1 到 2 秒才能完成页面的跳转。

更好的方案是「HTTP 长轮询」,如下图 (b) 所示。HTTP 请求发送后一般会留一定的时间给服务器做响应,比如 3 秒,规定时间内没有返回就是超时。如果增大超时的时间,比如 30 秒,在这 30 秒内,只要服务器收到了用户的扫码请求,就可以立马返回给客户端。如果超时,那么客户端就立马发起下一次请求。

在这里插入图片描述

说明:HTTP 协议的通信模式是一个请求搭配一个响应,即一问一答的模式。在定时轮询中,即使服务器知道了答案,但只要客户端没问,它就不能答。而在长轮询中,客户端提问后服务器并不急着回答,以避免浪费本次提问,从而保证了一旦服务器知道了答案就能立即进行回答。

这样就减少了 HTTP 请求的个数,并且响应也是及时的。采用该方案的有百度网盘,如下图所示:

在这里插入图片描述



2 WebSocket

上述两种解决方案,本质上还是客户端主动取数据,适用于扫码登录这种简单的应用场景。而网页游戏中有大量的数据需要由服务器主动推送到客户端,这就需要使用 WebSocket 技术了。



2.1 采用 TCP 全双工

维基百科

  • 半双工:半双工的系统允许二台设备之间的双向资料传输,但不能同时进行。因此同一时间只允许一设备发送资料,若另一设备要发送资料,需等原来发送资料的设备发送完成后再处理。
  • 全双工:全双工的系统允许二台设备间同时进行双向资料传输。

TCP 协议支持全双工

虽然目前使用最广泛的 HTTP1.1 基于 TCP 协议,但是它规定同一时间内客户端和服务器只能有一方主动发送数据。

这是因为 HTTP 在设计之初,考虑的是在网页中浏览文本的场景,能做到客户端发起请求、服务器进行响应即可。它并未考虑网页游戏这种,客户端和服务器之间需要相互主动发送大量数据的场景。为了更好地支持这样的场景,我们需要一个基于 TCP 的新协议 —— WebSocket 协议。

注意:Socket 和 WebSocket 的区别就像是雷锋和雷峰塔的区别。



2.2 建立 WebSocket 连接

在浏览网页时,我们一会儿使用 HTTP 协议看图文,一会儿使用 WebSocket 协议打游戏,一会儿刷视频。为了兼容这些应用场景,要求客户端和服务器在 TCP 三次握手建立起连接后,都统一使用 HTTP 请求先进行一次通信。如下图所示:

在这里插入图片描述

如果该请求是普通的 HTTP 请求,那么双方继续使用 HTTP 协议进行交互。如果该请求是建立 WebSocket 的请求,那么请求里会带上一些特殊的头部信息:

Connection: Upgrade  # 客户端想升级协议
Upgrade: WebSocket  # 客户端想升级成WebSocket协议
Sec-WebSocket-Key: T2a6wZlAwhgQNqruZ2YUyg  # 用于验证的BASE64码

服务器使用公开算法将客户端的 BASE64 码变成一段字符串,放在 HTTP 响应里:

HTTP/1.1 101 Switching Protocols  # 101协议切换状态码
Sec-WebSocket-Accept: iBJKv/ALlW2DobfoA4dmr3JHBCY=  # 字符串
Upgrade: WebSocket
Connection: Upgrade

客户端也使用相同的公开算法将 BASE64 码变成一段字符串,如果和服务器传回来的字符串一致,那么验证通过。

WebSocket 协议(ws 协议)和 HTTP 协议都是基于 TCP 协议。在完成 TCP 三次握手之后,可以利用 HTTP 请求将 HTTP 协议升级为 ws 协议,后续双方使用 ws 协议的数据格式进行通信。如下图所示:

在这里插入图片描述



2.3 WebSocket 帧

在这里插入图片描述
在 ws 协议中,数据包被称为帧:

  • opcode 用于指明帧的数据类型,=1 是指 text 类型,=2 是指二进制类型
  • payload 用于指明所传输的数据的长度,单位是字节


3 WebSocket 解决的问题

这一小节相当于是总结了前文各种解决方案的优缺点。



3.1 HTTP 存在的问题

  • HTTP 协议是一种无状态协议,其特性决定了在每次会话结束后,服务器端无法识别下一次发起请求的客户端身份。因此,为了确保通信的准确性,每次通信都必须重新确认对方身份,对实时通讯造成了障碍。
  • HTTP 协议的通信遵循一次请求对应一次响应的模式。每次请求和响应都携带了大量的头部信息,这对于实时通讯而言,解析这些头部信息无疑增加了处理时间,从而降低了通信效率。
  • HTTP 协议的通信机制是客户端主动发起请求,服务器被动响应。这种模式限制了服务器端的主动性,即服务器无法在没有客户端请求的情况下主动发送信息,从而无法实现实时通讯中的主动推送功能。


3.2 Ajax 轮询存在的问题

Ajax 轮询技术是指,客户端定期发起请求,以查询是否有新消息。若有新消息,则立即返回;若无,则等待预设的时间间隔后再次发起查询。该技术弥补了 HTTP 协议在实时更新方面的不足。

以一个具体场景为例:张三正在等待快递,由于他迫不及待,因此每隔 10 分钟就打电话给快递站询问快递是否到达。快递站无法主动通知张三,只有等到张三的电话才能告知他快递已到。

在这里插入图片描述

从上述例子中,我们可以看出两个问题:

  • 假设张三的通话间隔为 10 分钟,在他收到快递前最后一次通话被告知尚未到达后,如果快递随即入库,那么张三在下一次通话时才能得知快递已到。这种通讯方式并不能算作实时通讯,因为可能存在 10 分钟的时间差。
  • 假设张三所在的小区每天都有大量的快递需要接收,且每个人都采取主动致电的方式,那么快递站的电话占线也成为问题。

综上所述,Ajax 轮询技术存在的问题主要包括:

  • 推送延迟:即使数据变更,服务器也只能在客户端发来请求时返回响应。
  • 服务器压力:频繁的轮询会对服务器造成较大压力。
  • 难以平衡推送延迟与服务器压力:减小轮询间隔虽能降低延迟,但会增加压力;增大轮询间隔虽能减轻压力,但会提高延迟。


3.3 长轮询存在的问题

针对上述 HTTP 协议在实时通讯方面的局限性,出现了一种解决方案 —— 长轮询技术。

长轮询技术是在 HTTP 协议的基础上,由客户端发起的一种特殊请求。在该机制中,如果服务器的数据没有发生变化,服务器将暂时挂起客户端的请求,直至数据更新或达到设定的超时时间才返回响应。如果超时,那么客户端会在收到响应后立即发起下一次长轮询请求。该技术克服了 HTTP 协议无法实现实时更新的缺陷,即一旦数据更新,服务器便迅速处理请求并返回响应。

在长轮询机制中,张三主动致电快递站并保持通话直至快递到达。如下图所示:

在这里插入图片描述

总体而言,长轮询技术存在以下优点:

  • 没有推送延迟:服务器数据变更后,长轮询结束,能够迅速向客户端返回响应。
  • 服务器压力小:长轮询的间隔通常较长,如 30 秒或 60 秒,且服务器在挂起连接期间并不会消耗过多的资源。

个人理解:虽然长轮询克服了定时轮询的诸多缺点,但是长轮询本质上还是需要客户端主动去发起请求,即需要张三亲自打电话去询问快递站,快递站是不会主动通知张三去取快递的。而 WebSocket 允许快递站通知张三,以帮助张三及时取到快递,因此它的实时性更好。



3.4 WebSocket 的改进

一旦 WebSocket 连接得以建立,后续的数据传输均采用帧序列的形式。在客户端主动断开 WebSocket 连接或服务器终止连接之前,双方无需重新发起连接请求。在处理大量并发连接及客户端与服务器之间交互频繁的场景下,此举显著降低了网络带宽资源的消耗,并展现出卓越的性能优势。客户端与服务器之间的消息发送与接收均在同一持久连接上进行,实现了真正的 “长连接”,其实时性优势尤为突出。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/388400.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【调试笔记-20240731-Linux-Wordpress 添加 wp-weixin 插件支持微信用户扫码注册登录】

调试笔记-系列文章目录 调试笔记-20240731-Linux-Wordpress 添加 wp-weixin 插件支持微信用户扫码注册登录 文章目录 调试笔记-系列文章目录调试笔记-20240731-Linux-Wordpress 添加 wp-weixin 插件支持微信用户扫码注册登录 前言一、调试环境操作系统:Windows 10 …

有趣的PHP小游戏——猜数字

猜数字 这个游戏会随机生成一个1到100之间的数字,然后你需要猜测这个数字是什么。每次你输入一个数字后,程序会告诉你这个数字是“高了”还是“低了”,直到你猜对为止! 使用指南: 代码如下,保存到一个p…

排序算法:快速排序,golang实现

目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…

DC-7靶机通关

今天咱们来学习第七个靶机!!! 1实验环境 攻击机:kali2023.2 靶机:DC-7 2.1主机发现 2.2端口扫描 依旧是开了两个端口,一个 22 一个 80 !!! 3.1查看对方网页 在这里我…

2024年必备技能:小红书笔记评论自动采集,零基础也能学会的方法

摘要: 面对信息爆炸的2024年,小红书作为热门社交平台,其笔记评论成为市场洞察的金矿。本文将手把手教你,即便编程零基础,也能轻松学会利用Python自动化采集小红书笔记评论,解锁营销新策略,提升…

redis的集群(高可用)

redis集群的三种模式: 主从复制 奇数 三台 一主两从 哨兵模式 3 一主两从 cluster集群 六台 主从复制:和mysql的主从复制类似,主可以写,写入主的数据通过RDB方式把数据同步到从服务器,从不能更新到主,也…

【卫星载荷之QF项目-001】Vivado 2018.3安装

1.简介 Vivado 是 FPGA 厂商赛灵思公司(Xilinx)于 2012 年起发布的集成设计环境。Vivado2018.3 是 2018 年 Xilinx 推出的 Vivado 最后一个版本,相对稳定。 2.软件下载 网上自己去官网即可获取安装资源包。 3.软件安装 解压缩安装包&…

通配符/泛域名https证书申请流程

通配符证书也叫泛域名证书,是一种SSL/TLS证书,用于同时保护一个域名及其所有二级子域名的安全,如果企业拥有众多子域名,那么通配符证书是一个非常合适的选择。市面上通配符证书很多,但是收费不一,从哪里申请…

开放式耳机有哪些比较推荐的?开放式耳机五款精品推荐

看到这篇文章的小伙伴,没错,这篇文章就是为了告诉你如何去挑选一款适合自己的开放式耳机,作为一个开放式耳机的测评师,这几年开放式耳机的产品是越来越多,我们的选择也是越来越多元,所以在我们面对这么多选…

Java 应用性能优化

一、性能调优涉及哪些方面 Java 编程性能调优。包括数据类型,集合容器,网络通信。 多线程性能调优。包括线程安全,同步锁的问题,多线程的性能问题。 JVM 性能监控及调优。包括Java对象的创建和回收,内存分配。 设计…

CRC的手算过程——MODBUS

软件计算结果: 原理参考下面的文章: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html https://blog.csdn.net/weixin_44256803/article/details/105805628 https://blog.csdn.net/d_leo/article/details/73572373 手算过程如下&#x…

LeetCode面试150——122买卖股票的最佳时机II

题目难度:中等 默认优化目标:最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及题目解析 3.1 动态规划 3.2 贪心算法 参考文献 1 题目描述 给你一个整数数组 prices ,其中 prices[i] 表示某支…

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时,需要综合考虑多个方面,包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案: 一、前期准备 确定安装位置: 根据使用需求和环境条件,选择一个…

装修新选择:探索浦东地区口碑排名前五的大平层装修公司!

在繁华的浦东中寻找一个安静的港湾,大平层无疑是许多成功人士的首选。宽敞的空间、自由的布局设计,以及优雅的生活氛围,都是大平层备受青睐的理由。以下为您探索的浦东地区口碑排名前五的大平层装修公司: 1.即住空间装饰 即住空…

MoE:混合专家模型介绍(一)

MoE:混合专家模型介绍(一) 本文是对混合专家模型 (MoE) 详解重点摘要与归纳,有兴趣的小伙伴可以点击链接阅读原文。 混合专家模型 (MoEs)特点 与稠密模型相比,预训练速度更快与具有相同参数数量的模型相比&#xff…

与OpenAI合作:期待已久的苹果AI战略

探讨 Apple 和 OpenAI 合作的AI战略 ©作者|CodeDan 来源|神州问学 一.引言 在当今科技发展日新月异的背景下,大型科技公司的合作与联盟日益成为关注焦点。在最近的2024苹果全球开发者大会上,苹果展示了最新苹果系统上搭载的大模型应用…

Godot入门 05收集物品

创建新场景,添加Area2D节点,AnimatedSprite2D节点 ,CollisionShape2D节点 添加硬币 按F键居中,放大视图。设置动画速度设为10FPS,加载后自动播放,动画循环 碰撞形状设为圆形,修改Area2D节点为Co…

Vue3父子组件传属性和方法调用Demo

Vue3父子组件传属性和方法调用Demo 说明目录父组件给子组件传值和方法父组件给子组件传值-使用defineProps接受父组件属性值父组件给子组件传值-使用defineModel接受父组件v-model值当子组件只需要接收父组件一个v-model值时,写法1如下:子组件接收单个v-model写法2如下:当子组件…

海尔智家三翼鸟:从家电到场景,能否跨越智能化陷阱?

在智能家居浪潮的席卷之下,三翼鸟作为海尔智家旗下的场景品牌,曾一度被视为传统家电厂商转型升级的典范。然而,在光鲜亮丽的宣传背后,三翼鸟正逐步暴露出难以忽视的困境与挑战,其智能化之路似乎并不如预期般顺畅。 从用…

微软:云服务大规模宕机因DDoS“防卫过当”

杀毒软件导致全球蓝屏,DDoS防护导致云服务宕机,微软这家全球最大的网络安全公司,正在不断刷新人们对“安全威胁”的认知。 微软本周三晚间宣布,本周二全球范围内多个Microsoft 365和Azure云服务大规模长时间宕机事件的原因&#…