【学习心得】websocket协议简介并与http协议对比

一、轮询和长轮询

        在websocket协议出现之前,要想实现服务器和客户端的双向持久通信采取的是Ajax轮询。它的原理是每隔一段时间客户端就给服务器发送请求找服务器要数据。

        让我们通过一个生活化的比喻来解释轮询和长轮询假设你正在与一位不怎么主动说话的老大爷(服务器)聊天,你想要知道他是否有新的故事或者信息分享给你。

(1)轮询

        就像每隔几分钟你就跑到老大爷家门前敲门,问他:“大爷,您有新消息吗?”每次老大爷如果没有新内容,就会回答:“没有呢,孩子。”然后你失望地离开,过一会儿再回来重复同样的问题。这种方式下,你消耗了大量的精力(客户端资源),而且由于间隔时间的存在,获取新消息的延迟较高,并且无论是否获得新消息,每次询问都会给老大爷带来打扰(服务器负担)。

        为了改善这种需要反复请求浪费带宽资源的情况,人们发明了长轮询,顾名思义长轮询是只客户端只需要发起一个HTTP请求,服务器一直保持连接打开,直到有消息时才返回响应;客户端在收到响应后立刻发起下一个请求,以此实现近似实时推送的效果。

(2)长轮询

         现在改为采用长轮询的方式。你来到老大爷家,站在门口问:“大爷,如果有新消息,请随时告诉我。”然后你就耐心地等待在那儿,老大爷如果没消息就不回应,一旦有了新消息,就立即告诉你。这样,你不再频繁地往返于老大爷家门口,而是保持一个“半开放”的聊天状态。尽管你在门口等待的时间可能较长(长连接维持期间消耗资源),但比起频繁询问,减少了无效交互,提高了发现新消息的速度,同时降低了对老大爷的打扰频率(减轻了服务器负载)。然而,这个过程中你仍然不能做其他事情(浏览器线程被占用),直到老大爷给出答复或超时为止。

二、websocket协议

        websocket是一个在单个 TCP 连接上进行全双工通讯的协议。  websocket允许服务端主动向客户端推送数据。客户端和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。      

        在实际的网络通信中,轮询和长轮询分别对应着客户端周期性地向服务器发送请求查询更新,以及客户端发起请求后保持连接打开等待服务器响应的机制。而websocket则更像是建立了一个实时通讯通道,你和老大爷之间架设了一部电话,只要有新消息,老大爷就能直接拨通你的电话进行通知,无需反复敲门询问。

三、websocket通信

(1)握手(第一次请求服务器)

        在实际的websocket通信过程中,存在一个从HTTP协议升级到websocket协议的过程。这个过程通常称为WebSocket握手,它是通过一次特殊的HTTP请求来实现的。

        当握手完成后,HTTP连接即被转换为WebSocket连接,之后双方就可以进行全双工、低延迟的数据传输了,不再使用HTTP报文格式,而是采用WebSocket帧结构进行数据封装和解封装。

(2)websocket的握手数据包长什么样的?

我们来看看数据包里面的请求头和响应头信息都是什么意思吧!重点关注红色的字段就行。

字段解释
GET wss://live-ws-group10.kuaishou.com/websocket HTTP/1.1HTTP GET方法的请求,请求的目标资源是wss://live-ws-group10.kuaishou.com/websocketwss表示这是一个安全的WebSocket连接(基于TLS加密)。
Host

指定服务器的主机名和端口,用于确定目标服务地址。

Connection: Upgrade

表明客户端希望升级当前的HTTP连接为另一个协议,这里是指WebSocket协议。

Pragma: no-cache

告诉服务器不使用缓存机制,确保请求获取最新的数据。

Cache-Control: no-cache

同样用于控制缓存策略,禁止缓存此请求的响应内容。

User-Agent

描述客户端软件信息,这里是Chrome或Edge浏览器在Windows 10系统上的版本号。

Upgrade: websocket

明确指出要将连接升级到WebSocket协议。

Origin

标识本次WebSocket连接发起的源站点,这是同源策略中的一部分,用来说明请求是从哪个页面或者应用发起的。

Sec-WebSocket-Version

客户端支持的WebSocket协议版本号,13是RFC 6455定义的最新版本。

Accept-Encoding

客户端支持的编码压缩方式,包括gzip、deflate和br(Brotli)算法。

Accept-Language

客户端偏好使用的语言顺序,首先是简体中文,然后是其他英文变种。

Sec-WebSocket-Key

一个Base64编码的随机字符串,由客户端生成并发送给服务器,服务器需要根据这个值计算出一个回应摘要来完成WebSocket握手验证。

Sec-WebSocket-Extensions

客户端提议启用WebSocket扩展 permessage-deflate,这是一种数据压缩扩展,可以减少通过WebSocket传输的数据量;client_max_window_bits 参数表明客户端愿意接受的最大压缩窗口大小设置

(3)wss数据包对比https数据包

  • http对应于ws,https对应于wss
  • http包有Headers、preview、Response、Cookies

  • websocket包有Headers、Messages

  • http包是文本类型数据。
  • websocket包是二进制数据。
  • http包是我们客户端去触发,我们请求一个地址返回一个数据。
  • websocket包是当我们客户端连接服务器后,一直接受服务器的数据并且要对不同的服务发送来的数据做出回应。

(4)服务器如何知道我们离开了?

服务器判断客户端是否还在保持通信有很多方式,这里重点讲一个方式——心跳包(Heartbeat)

        为了保持WebSocket连接的活跃并确保客户端仍然在线,客户端和服务器之间会定期交换“心跳”消息。如果服务器在一段时间内没有收到客户端发送的心跳消息,则可以认为客户端已经离线或者连接已断开。反过来,服务器也可以主动向客户端发送心跳消息,等待客户端确认回复。如果没有收到回复,则视为客户端已断开连接。

        还是拿上面我和老大也聊天的例子:在WebSocket通信场景中,我(客户端)和老大爷(服务器)之间建立了持久的聊天管道。为了防止因为网络波动、设备休眠或其他原因导致的连接无声无息地断开,我和大爷商定了一项规则:每过一定时间,比如15秒,我就向老大爷发送一个简短的消息,例如“我还在线呢”。

  • 客户端发送心跳包: 就像我在规定的时间间隔内走到老大爷面前说一声:“嘿,大爷,我还在。”(在这个例子中,“嘿,大爷,我还在。”就相当于心跳包的内容,它有一个专门的名字叫ACK确认字符,表示发来的数据已确认接收无误)

  • 服务器响应心跳包: 老大爷听到你的问候后,通常会回复你一个确认信息,如:“收到,孩子,我知道了。”这样,你就能知道老大爷还清醒着,并且你们的沟通渠道依然畅通。

        如果某次或连续几次心跳周期过后,老大爷没有回应我的问候,那么我可以推断出可能是老大爷暂时走开了(服务器故障),或者我喊的声音太小他没听见(网络问题),于是我可以采取行动,比如重新建立连接或是通知用户连接已断开。

五、参考资料

(1)如果你想了解更多有关websocket和http协议的细节,我推荐你去mdn的官网学习:

MDN中文官网icon-default.png?t=N7T8https://developer.mozilla.org/zh-CN/docs/Learn

(2)如果你只是想快速入门websocket协议,那么看我这篇文章其实就够了,但除此之外菜鸟教程也是非常不错的新手必看网站:

菜鸟教程-websocket协议icon-default.png?t=N7T8https://www.runoob.com/html/html5-websocket.html

(3)还有关于websocket的属性、事件和方法后续会再出一篇文章结合Python来给大家介绍哦! 

【学习心得】Python好库推荐——websocket-clienticon-default.png?t=N7T8http://t.csdnimg.cn/Qdk1W 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习人工智能:吴恩达《AI for everyone》2019 第3周:实现智能音箱和自动驾驶的几个步骤;无监督学习;增强学习

吴恩达 Andrew Ng, 斯坦福大学前教授,Google Brain项目发起人、领导者。 Coursera 的联合创始人和联合主席,在 Coursera 上有十万用户的《机器学习》课程;斯坦福大学计算机科学前教授。百度前副总裁、前首席科学家;谷…

开发知识点-Apache Struts2框架

Apache Struts2 介绍S2-001S2CVE-2023-22530介绍 Apache Struts2是一个基于MVC(模型-视图-控制器)设计模式的Web应用程序框架,它是Apache旗下的一个开源项目,并且是Struts1的下一代产品。Struts2是在Struts1和WebWork的技术基础上合并出来的全新web框架,其核心是WebWork。…

网络入侵检测系统之Suricata(十)--ICMP实现详解

ICMP协议 Common header 0 1 2 40 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 0 1 2 3 4--------------------------------| Type | Code | Checksum |-----…

VUE_自适应布局-postcss-pxtorem,nuxt页面自适配

postcss-pxtorem是一个PostCSS插件,用于将CSS中的像素值转换为rem单位,以实现响应式布局和适配不同屏幕尺寸的需求。 它的适配原理是将CSS中的像素值除以一个基准值,通常是设计稿的宽度,然后将结果转换为rem单位。这样&#xff0…

根据用户名称实现单点登录

一、参数格式 二、后端实现 Controller层 public class IAccessTokenLoginController extends BaseController {Autowiredprivate ISysUserService sysUserService;Autowiredprivate ISingleTokenServiceImpl tokenService;/*** 登录方法** return 结果*/PostMapping("/l…

AI智能分析网关V4智慧园区视频智能监管方案

一、背景需求分析 随着科技的不断发展,智慧园区建设已成为现代城市发展的重要方向。通过智能化技术提高园区的运营效率、降低成本、增强环境可持续性等具有重要作用。视频智能监管作为智慧园区安全管理体系的重要组成部分,对于提高园区的安全管理水平和…

女神节快乐,谁说程序猿不懂浪漫, 50多份表白代码收好~

谁说程序猿不懂浪漫💗 今天是女神节,祝各位女神节日快乐! 在 GitHub 上有个表白代码收藏馆 Awesome-Love-Code,收集了 50 多份表白代码。 GitHub:github.com/sun0225SUN/Awesome-Love-Code 分享给有需要的人。 Web Py…

提高数字化处理质量和效率:重视OCR软件的识别准确率

在当今数字化时代,纸质文件的数字化处理变得尤为重要。而作为纸质文件数字化的关键工具之一,OCR(Optical Character Recognition,光学字符识别)软件的识别准确率对于将大量纸质文件转为Excel具有至关重要的地位。本文将…

必看——怎么把HTTP升级成为HTTPS

现在很多朋友的网站都从原来的HTTP升级成了HTTPS,这种情况就是因为给网站安装了SSL证书的原因,使用了HTTPS协议。安装完SSL证书之后,网站就不会再被浏览器提示不安全,也不会显示连接不安全打不开网站的情况了。而是有一个绿色的小…

分析:如何多线程运行测试用例

这是时常被问到的问题,尤其是UI自动化的运行,过程非常耗时,所以,所以多线程不失为一种首先想到的解决方案。 多线程是针对的测试用例,所以和selenium没有直接关系,我们要关心的是单元测试框架。 unittest …

【C++干货基地】六大默认成员函数: This指针 | 构造函数 | 析构函数

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

YOLO目标检测——森林火灾烟雾检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:森林火灾监控与预警标注说明:使用lableimg标注软件标注,标注框质量高,含voc(xml)、coco(json)和yolo(txt)三种格式标签,分别存放在不同文件夹下,可以直接用于YOLO系列的目标检测。其他&#x…

3D-Genome | Hi-C互作矩阵归一化指南

Hi-C 是一种基于测序的方法,用于分析全基因组染色质互作。它已广泛应用于研究各种生物学问题,如基因调控、染色质结构、基因组组装等。Hi-C 实验涉及一系列生物化学反应,可能会在输出中引入噪声。随后的数据分析也会产生影响最终输出噪声&…

PandasAI—让AI做数据分析

安装 pip install pandasai !pip install --upgrade pandas pandasai 导入依赖项 import pandas as pdfrom pandasai import PandasAIfrom pandasai.llm.openai import OpenAI使用pandas创建一个数据框 df pd.DataFrame({"country": ["United States",…

VisionPro 判断圆是不是无限接近圆或存在缺陷

项目上可能需要判断圆是否是无限接近圆或者判断圆边缘是否存在缺陷等。 第一种方法:找圆工具和点到点的距离计算圆边缘上的点到圆心距离的最大值和最小值的差值。 #region namespace imports using System; using System.Collections; using System.Drawing; usin…

Batch Nomalization 迁移学习

Batch Nomalization 1.Batch Nomalization原理 图像预处理过程中通常会对图像进行标准化处理,这样能够加速网络的收敛。就是按照channel去求均值和方差,然后原数据减均值除标准差,使我们的feature map满足均值为0,方差为1的分布…

AI助力剧本创作:如何5分钟内构思出热门短剧大纲

人工智能重塑短剧行业:从剧本创作到市场推广 在当今短剧行业的飞速发展中,剧本创作的质量及其更新的速度已然成为短剧能否转化为热门作品的关键性因素。然而,随着短剧创作成本的日益攀升,一个卓越的剧本无论在创作时间上还是在构思…

基于SpringBoot+MYSQL的大学生租房平台

目录 1、 前言介绍 2、主要技术 3、系统流程 3.1、操作流程 3.2、登录流程 3.3、删除信息流程 3.4、添加信息流程 4、功能需求 5、系统设计 5.1、功能结构设计 5.1、数据库概念设计 6、运行截图(部分) 6.1、管理员功能实现 6.1.1、房东管理 6.1.2、信息审批管理 …

物联网在智慧城市建设中的关键作用:连接、感知、智能响应

一、引言 随着信息技术的飞速发展,物联网(IoT)技术已经渗透到我们生活的方方面面,特别是在智慧城市建设中发挥着至关重要的作用。智慧城市是指通过运用先进的信息和通信技术,实现城市基础设施、公共服务、交通管理、环…

断开服务器仍后台运行程序

1.可以使用nohup命令: nohup python xx.py 2>1& 不要忘记 2>1& 之后会返回一个进程号(记不住也没关系,可以看3),此时程序就在后台运行了,与服务器断开连接也能正常运行 2.在终端实时打印…
最新文章