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

news2024/11/18 17:27:01

一、轮询和长轮询

        在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.coloradmin.cn/o/1498963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考68-上午题-【面向对象技术2-UML】-事物

一、事物 UML中有4种事物: 结构事物;(模型的静态部分)行为事物;(模型的动态部分)分组事物;注释事物。 1-1、结构事物 1-2、行为事物 1-3、分组事物 1-4、注释事物 二、真题 真题1…

excel统计分析——裂区设计

参考资料:生物统计学 裂区设计(split-plot design)是安排多因素试验的一种方法,裂区设计对因素的安排有主次之分,适用于安排对不同因素试验精度要求不一的试验。 裂区设计时,先按第一因素的处理数划分主区&…

PyCharm Community Edition 2023.3.3,UI界面设置成旧版

File->Settings->Appearance & Behavior->New UI->Enable new UI(取消勾选)->重启PyCharm 旧版UI: 新版UI:

卫星导航 | 坐标系---地理坐标系与UTM坐标系

卫星导航 | 坐标系---地理坐标系与UTM坐标系 世界坐标系地理坐标系UTM坐标系 全球卫星导航系统(Global Navigation Satelite System,GNSS),简称卫星导航,是室外机器人定位的一个主要信息来源。 卫星导航能给机器人提供什么信息? 正常工作时&…

RPC——远程过程调用

一、RPC介绍 1.1 概述 RPC(Remote Procedure Call Protocol) 远程过程调用协议。RPC是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。RPC主要作用就是不同的服务间方法调用就像本地调用一样便捷。 1.2 RPC框架 …

二分搜索算法分析

目录 时间复杂度 空间复杂度 注意 二分搜索代码归纳 时间复杂度 怎么计算二分查找算法的时间复杂度呢?如果用T (n )来表示n 个有序元素的二分查找算法的时间复杂度,那么结果如下。 • 当n 1时,需要一次做比较,T (n )O (1)。 …

间隔5分钟执行1次Python脚本设置步骤 —— 定时执行专家

《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件,用于在 Windows 系统上定时执行各种任务,包括执行脚本或程序。 下面是使用 "定时执行专家" 软件设置定时执行 Python 脚本的步骤: 步骤 1: 设置 P…

基于qt的图书管理系统----05其他优化

参考b站:视频连接 源码github:github 目录 1 优化借阅记录显示2 时间显示为年月日3 注册接口 1 优化借阅记录显示 现在只能显示部分信息,把接的书名和人的信息全部显示 在sql语句里替换为这一句即可实现查询相关联的所有信息 QString str…

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context

[React 进阶系列] React Context 案例学习:使用 TS 及 HOC 封装 Context 具体 context 的实现在这里:[React 进阶系列] React Context 案例学习:子组件内更新父组件的状态。 根据项目经验是这样的,自从换了 TS 之后,…

洗衣洗鞋店小程序对接水洗唛打印,一键预约,支付无忧

随着社会的进步和科技的发展,我们的生活幸福感与日俱增。为了让我们从琐碎中解脱出来,干洗店洗鞋店行业也日新月异。今天,我为大家推荐这款优秀的干洗店小程序系统,让您的洗衣洗鞋服务体验更上一层楼。 干洗店管理系统是一款专为洗…

解读电影级视频生成模型 MovieFactory

Diffusion Models视频生成-博客汇总 前言:MovieFactory是第一个全自动电影生成模型,可以根据用户输入的文本信息自动扩写剧本,并生成电影级视频。其中针对预训练的图像生成模型与视频模型之间的gap提出了微调方法非常值得借鉴。这篇博客详细解…

2016年认证杯SPSSPRO杯数学建模C题(第一阶段)如何有效的抑制校园霸凌事件的发生解题全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现: 近年来,我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的,因此对于这些情况我们应该…

服务器通过impitool设置BMC共享lan实现远程管理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、NC-SI是什么?二、ipmitool是什么三、查看是否支持ipmi设备四、安装ipmitool五、开始配置1.查看网卡状态2.设置运行模式3.设置静态地址 六、验证…

【机器学习】包裹式特征选择之基于遗传算法的特征选择

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

u盘里文件损坏无法打开怎么恢复?这样操作更简单

U盘已经成为我们传输和存储数据的重要工具。然而有时候我们可能会遇到U盘里的文件损坏无法识别的情况,这无疑给我们的工作和学习带来了不小的困扰。 那么面对这种情况应该如何应对呢?本文将为你介绍个实用的恢复方法,帮助你轻松解决U盘文件损…

排序算法:插入排序和希尔排序

一、插入排序 1.基本原理 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上…

ResponseStatusException

目录 概述: 综合实例: 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…

嵌入式培训3-7

1.在主函数定义字符数组&#xff0c;在自定义函数中实现字符串比较 int strcmp(char *s1, char *s2); 参数&#xff1a;两个字符串 返回值&#xff1a;s1-s2差 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控

一、前言 为什么需要判断视频文件是否含有B帧&#xff0c;这个在推流的时候很容易遇到这个问题&#xff0c;一般来说&#xff0c;没有B帧的视频文件&#xff0c;解码后的数据帧pts和dts都是顺序递增的&#xff0c;而有B帧的则未必&#xff0c;可能有些需要先解码后面显示&…