WebSocket协议及优点(总结)

2023-10-27

参考文章:https://www.zhihu.com/question/20215561
参考书籍:《图解HTTP》

这篇文章通过http的瓶颈,引出ajax轮询以及长轮询,最后说明为什么使用websocket以及他的原理

当我们使用http协议探知服务器上是否有内容更新,就必须频繁的从客户端到服务器端进行确认。而http一下的这些标准会成为一个瓶颈:

  • 一条连接上只可以发送一个请求
  • 请求只能从客户端开始。客户端不可以接收除了响应以外的指令。
  • 请求 / 响应首部未经过压缩就直接进行传输。首部的信息越多,那么延迟就越大。
  • 发送冗长的首部。每次互相发送相同的首部造成的浪费越多
  • 可以任意选择数据压缩格式。非强制压缩发送

ajax轮询

ajax(异步的javascript与xml技术)是一种有效利用javascript和dom的操作,以达到局部web页面的提花和加载的异步通信手段。和以前的同步通信相比,他只更新一部分页面,相应中传输饿数据量会因此的减少。

ajax轮询的原理是,让浏览器每隔一段时间就发送一次请求,询问服务器是否有新消息。
而利用ajax实时的从服务器获取内容,有可能导致大量的请求产生。
在这里插入图片描述

长轮询

原理和ajax轮询差不多,都是采用轮询的方式,不过采用的是阻塞模型。也就是说,当客户端发起连接后,如果服务器端内容没有更新,将响应至于挂起状态,一直不回复response给客户端,知道有内容更新,再返回响应。
在这里插入图片描述
虽然可以做到实时更新,但是为了保留响应,一次连接饿持续时间也变长了。期间,为了维持连接会消费更多的资源。

从上面两种方式中,其实可以看出是再不断的建立http连接,然后等待服务器处理,可以体现出了http的特点:被动性,即:请求只能由客户端发起。服务器端不能主动联系客户端。
不管怎么样,上面这两种都是非常消耗资源的。
ajax轮询 需要服务器有很快的处理速度和资源。(速度)
长轮询 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)

除了以上这些,HTTP还是一个无状态协议。
通俗的说就是,服务器因为每天要接待太多浏览器了,是个健忘鬼,你一断连接,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。

WebSocket

WebSocket其实是HTTP协议上的一种补充,他们有交集但并不是全部。
在这里插入图片描述
一旦web服务器和客户端建立起websocket协议的通信连接,之后所有的通信都依靠这个专用连接进行。只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。
在这里插入图片描述

websocket是基于HTTP协议的,或者说借用了http的协议来完成一部分握手。为了实现websocket通信,在http建立连接后,还需要进行一次“握手”的步骤。

握手 · 请求
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

为了实现websocket通信,需要用到http的Upgrade首部字段,告知服务器通信协议已发生改变:我要发起的是websocket协议。以达到握手的目的。
Sec-WebSocket-Key字段记录着握手必不可少的键值,用于验证服务器是否支持websocket通信。
Sec-WebSocket-Protocol字段记录的是所需要使用的协议。

握手 · 响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

对于客户端的请求,服务器返回状态码 101 Switching Protocols的响应。
返回Upgrate告诉客户端即将升级的协议是Websocket协议。
Sec-WebSocket-Accept字段值是由握手请求中的Sec-WebSocket-Key字段值加密过后生成的。
Sec-WebSocket-Protocol 则是表明最总使用的协议。

到这里,http已经完成所有他的工作了,接下来通信时不再使用HTTP的数据帧,而是使用websocket独立的数据帧。
在这里插入图片描述

因此,websocket协议具有以下的特点:

  • 推送功能
    支持服务器端向客户端推送功能。服务器可以直接发送数据而不用等待客户端的请求。
  • 减少通信量
    只要建立起websocket连接,就一直保持连接,在此期间可以源源不断的传送消息,直到关闭请求。也就避免了HTTP的非状态性。
    和http相比,不但每次连接时的总开销减少了,而且websocket的首部信息量也小 ,通信量也减少了。
  • 减少资源消耗
    那么为什么他会解决服务器上消耗资源的问题呢?
    其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。
    简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。这样就可以解决客服处理速度过慢的问题了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebSocket协议及优点(总结) 的相关文章

随机推荐

  • 面试-Java【之】HashMap原理,源码逐行分析,理论总结(变量、常量、数据结构、Node、TreeNode、初始化、添加、查询、更新、删除)

    面试 Java 之 HashMap原理 源码逐行分析 理论总结 变量 常量 数据结构 Node TreeNode 初始化 添加 查询 更新 删除 1 源码分析 1 HashMap属性与变量 扩容因子 扩容阈值 结构转换阈值 2 Node 链
  • MySql 排序规则

    1 MySQL的排序规则是干什么的 我们在使用 Navicat for MySQL 或 MySQL Workbench 创建数据库的时候 除了数据库名称和字符集外 我们还可以设置 Collation 排序规则 当然我们也可以使用默认的排序规
  • ajax的cdn,GitHub - deajax/FontFace-CDN: 字体使用CDN

    FontFace 字体使用CDN 字体为网络搜集 如侵犯版权请联系我删除 使用方法 使用 font face 来引入字体链接 font face font family Flama font weight normal font style
  • 【CSDN软件工程师能力认证学习精选】 JavaEE 13个核心规范

    1 标准的价值分析 生产只是一个劳动密集型的产业 是体力劳动 而体力劳动在这个时代是拼不上脑力劳动 拼不上智慧的 这就像所有的生命诞生之初 都是白纸一张 而一个婴儿成长到成年过程 却是不同的 而这些不同恰恰成为了我们和其他人不同的地方 就像
  • Verilog HDL——状态机

    示例 自动售货机 设定 投币口只能投一枚五角或一枚一元硬币 投入一元五角后售货机自动给出一瓶饮料 投入两元则找零五角并给出饮料 投币只能一枚一枚投 状态确定 idel 不投币 half 投币五角 one 投币一元 输入 输出 一枚一元 一枚
  • Mysql日志

    1 错误日志 Log Error 记录Mysql服务器进程在启动 关闭或者运行过程中遇到的错误消息 是工作中排查错误的重要工具 查询方式 show variables like log error G 1 row Variable name
  • jq封装接口ajax,jquery ajax方法封装及api文件设计的代码示例

    本篇文章给大家带来的内容是关于jquery ajax方法封装及api文件设计的代码示例 有一定的参考价值 有需要的朋友可以参考一下 希望对你有所帮助 封装 jquery ajax 文件 封装 jquery ajax 例如 ajaxReque
  • linux下的安装mysql与遇到一些常见问题的解决方法

    本地的安装环境 centos6 9 1 下载 mysql官网地址 http dev mysql com downloads mysql 5 6 html downloads 我是用的版本 5 6 33 通用版 linux下64位 也可以直接
  • blob类型字段

    1 在mysql中 bolb是一个二进制大型对象 是一个储存大量数据的容器 例如图片 音频 2 插入blob类型数据比如使用preparedStatement 而不能使用Statment 因为blob类型数据不能使用字符串拼接 有关prep
  • 面试题(5)

    1 介绍STL STL 标准模板库 由容器算法迭代器组成 vector实质上就是一个动态数组 会根据数据的增加 动态的增加数组空间 vector使用allocator来进行内存管理 使用3个迭代器来引用这段内存 vector的iterato
  • 10分钟教你写一个数据库

    今天教大家借助一款框架快速实现一个数据库 这个框架就是Calcite 下面会带大家通过两个例子快速教会大家怎么实现 一个是可以通过 SQL 语句的方式可以直接查询文件内容 第二个是模拟 Mysql 查询功能 以及最后告诉大家怎么实现 SQL
  • Java中存储金额的数据类型java.math.BigDecimal

    在数据库中存储金额的数据类型通常用的是 decimal 20 2 在java中与之对应的数据类型并不是double 而是java math BigDecimal 上例子 Test public void testBigDecimal dou
  • FPGA学习:TMDS协议编码与解码测试

    TMDS协议是当下很重的一个视频传输协议 DVI以及HDMI均采用该协议进行视频数据的转化和传输 TMDS编码部分如下 通过该模块可将8bit视频像素数据转为10bit 具体的转化流程图可自行搜索 算法并不复杂 Testbench time
  • 常见的大型软件项目开发文件目录结构

    常见的大型软件项目开发文件目录结构 1 Java 项目 调试阶段编译后的 class 文件放到 classes 目录 将 classes 目录和 lib 中的其他工具 jar 放到 classpath 中 运行当前目录是项目根目录 正式发行
  • 动漫头像生成如此简单,教你接口快速制作动漫头像

    动漫头像生成如此简单 教你如何快速制作动漫头像 想生成这样的动漫头像吗 告诉你 很简单 这里以nodejs作为示例 第一步 引入腾讯人脸转换sdk npm install tencentcloud sdk nodejs ft save 第二
  • HDU 1599(floyd)(求最小回路问题)

    find the mincost route Problem Description 杭州有N个景区 景区之间有一些双向的路来连接 现在8600想找一条旅游路线 这个路线从A点出发并且最后回到A点 假设经过的路线为V1 V2 VK V1 那
  • windows excel 的一些官方模板

    中文版 https templates office com zh cn templates for Excel 日文版 https templates office com ja jp templates for Excel
  • 10个问题解答火热的元宇宙概念

    这篇转自金色财经平台的文章涵盖了我们近期文章中所讨论过的大部分关于元宇宙的内容 虽然不甚全面 但胜在系统 虽然现在探讨最终应用为时甚早 但各行各业开始想元宇宙靠拢已是不争 让我们通过十个由点及面浅层问题 一同简单的回顾下元宇宙伊始至今都经历
  • easyexcel 数据量过大问题

    java总的生成excel工具 poi太费事了 于是就是用来 阿里提供的 easyexcel 很简单 具体使用方式参考 https zhuanlan zhihu com p 88720415 utm source wechat timeli
  • WebSocket协议及优点(总结)

    参考文章 https www zhihu com question 20215561 参考书籍 图解HTTP 这篇文章通过http的瓶颈 引出ajax轮询以及长轮询 最后说明为什么使用websocket以及他的原理 当我们使用http协议探