WebSocket协议解析 : 双向实时通信的利器

1. WebSocket是什么

WebSocket是一种在单个TCP连接上进行全双工通信的协议。

WebSocket允许客户端和服务器之间进行实时的双向通信。这意味着服务器可以主动推送数据到客户端,而不需要客户端每次都发送请求来获取数据。这种通信方式通过长连接实现,即连接建立后,可以持续进行数据传输,直到一方主动关闭连接。

1.1 什么是实时通信 ?

传统的通信方式,比如电子邮件或者普通的网页浏览,通常都会存在一定的延迟。需要用户主动地请求来获取更新数据。

而实时通信,通过利用及时传输的技术和协议,使得数据能够立即传输给接收方。他也因此普遍被运用在及时聊天,在线会议,协同编辑等环境下。

通过建立全双工的持久连接,客户端和服务器之间,就能实现高效、实时性更强的通信。
可以说WebSocket的出现,就是为了解决实时通信的问题。

1.2 在WebSocket出来之前,实时通信的方案

在WebSocket出来之前,实时通信问题主要通过以下几种技术来解决 :

  • 轮询 : 客户端定期向服务器发送请求,询问是否有新的数据可以用。服务器在接收到请求后,再检查是否有更新的数据,并将其返回给客户端。
    • 这种做法会产生大量的请求和响应,导致不必要的网络开销和延迟。
  • 长轮询 : 在客户端发起请求后,设定超长的超时时间(比如30秒),保持连接打开一段时间,等待新数据响应后再关闭连接。
    • 比如百度网盘扫码,就是这么做的
    • 虽然解决了无效轮询的数量,但还是需要频繁的建立和关闭连接。
  • Comet : 同样是基于HTTP的技术,不同的是 : 在返回请求后继续保持连接打开。
    • 核心思想就是通过保持长连接,来模拟实时通信,并允许服务器通过流式传输,frame等推送技术,来主动向客户端推送数据。
    • 不过Comet虽然可以模拟实时通信,但它仍然是基于HTTP的模型。
    • 在Comet中,服务器推送数据给客户端的方式,通常还是通过延长响应,或使用推送技巧来实现的。

1.3 WebSocket的优势

总的来说,WebSocket相比起其他的技术,有着以下这些优势 :

  • 实时通信 : WebSocket允许在单个长时间的连接上,进行双向实时通信。在需要快速实时更新的应用程序里,WebSocket会比HTTP更加高效。
  • 降低延迟 : WebSocket一旦建立连接,就会保持开放,数据可以在客户端和服务器之间以比HTTP更低的延迟进行传输。
  • 更高效的资源利用 : 可以减少重复请求和响应的开销,因为它的连接只需要建立一次。

WebSocket的出现,填补了HTTP在实时通信方面的不足。他允许客户端和服务器,通过单个TCP连接进行双工通信,并且进行实时的数据交换。

目前的WebSocket技术,已经得到了主流浏览器的支持。而且由于WebSocket的标准定义了一套通信规范,所以无论是JavaScript还是Java、Python等各种语言,都存在相应的库。

1.4 WebSocket有哪些应用场景

WebSocket协议非常适用于基于Web的游戏、聊天应用,以及任何需要低延迟、实时连接的应用程序。比如 :

  • 实时通信应用
    如在线聊天、在线会议等场景,用户可以实时地发送和接收消息。在这些应用中,WebSocket 提供的双向通信能力可以让用户快速地得到反馈,并且服务器能够及时推送新消息,避免了像 HTTP 轮询那样频繁请求造成的资源浪费。
  • 实时数据推送应用
    包括股票交易平台、体育赛事实时比分推送等。这些应用需要将实时的数据及时地传递给用户,WebSocket 的持久连接和实时推送功能使其成为理想的选择。
  • 在线游戏
    对于多人在线游戏,玩家的操作和游戏状态的更新需要实时双向传递。WebSocket 能够很好地满足这种需求,保证游戏的流畅性和实时性。

2. WebSocket的工作原理

HTTP对单独的请求使用单独的连接,他增加了服务器的负载,因为服务器必须为每个请求创建新的握手。一旦请求完成,连接就会关闭。

在这里插入图片描述

而WebSocket,只要任何一方不中断连接,连接就是持久的。

WebSocket协议是一个独立的,基于TCP的协议。它与HTTP的唯一的关系是,HTTP服务器将其握手解析为升级请求。

WebSocket握手过程,是客户端和服务器之间建立实时通信通道的关键步骤。它利用熟悉的HTTP协议进行初始连接,然后协商升级到WebSocket协议。

具体连接步骤如下 :

2.1 客户端发起握手请求

客户端向服务器发起一个特殊的HTTP GET请求,这个HTTP请求包含一些关键的头部信息,用于表明客户端希望将通信协议从 HTTP 升级到 WebSocket。
在这里插入图片描述

  • Upgrade:WebSocket : [重要] 升级WebSocket标头,告诉客户端想要升级到WebSocket连接。
  • Connection:Upgrade: [重要] 连接升级标头通知服务器希望从当前连接协议进行升级。
  • Sec-WebSOcket-Key: 密钥,是包含随机生成的,本次握手特有的Base64编码的字符串的标头。服务器稍后会使用它来验证握手。
  • 还有一些额外的标头,具体取决于服务器的实现和所需的功能。
  • Sec-WebSocket-Version : WebSocket版本,目前主流的是13版本
  • Sec-WebSocket-Protocol: 用于指定客户端希望与服务器通信时所使用的子协议

然后客户端等待服务器对于HTTP升级请求的相应。

2.2 服务器响应并完成握手

服务器收到客户端的请求后,会检查请求头部是否符合WebSocket握手的要求。

  • 比如服务器会验证Upgrade:WebSocketConnection:Upgrade是否存在

如果符合,服务器会生成一个特殊的响应来完成握手过程。响应的状态码是101,表示协议正在切换。

响应头部也会包含“Upgrade”和“Connection”字段,其值与客户端请求中的相同。

此外,服务器会解析 “Sec - WebSocket - Key” ,使用这个密钥来生成一个 “Sec - WebSocket - Accept” 响应头。并将其放在响应头部中返回给客户端。

在这里插入图片描述

2.3 客户端确认

一旦客户端收到,带有正确Sec标头的服务端相应,它就会验证该相应,确认握手成功。
客户端和服务器,现在可以通过已建立的TCP连接,使用WebSocket协议交换数据,HTTP本质上被WebSocket取代。

3. WebSocket报文格式解析

WebSocket有一个默认的URI格式,可以是ws:,也可以是wss:

  • 端口是可选择的,默认端口80用于ws:,443端口用于wss:
  • wss用于安全,因为设置了安全标志,并且在服务器和客户之间完成TLS握手,以实现安全通信
  • 在WebSocket协议中,数据是使用帧序列来传输的
    • WebSocket中的真实客户端和服务器之间,交换数据的基本单位,并且每个框架都有特定的结构。

在这里插入图片描述

3.1 FIN : 表示消息是否结束

  • 当 FIN 位的值为 1 时,表示当前帧是消息的最后一个帧。例如,一个简单的文本消息可能只需要一个帧来传输,此时这个帧的 FIN 位会被设置为 1。
  • 当 FIN 位的值为 0 时,表示消息还没有发送完,后面还有紧跟的帧。这在发送较长消息时非常有用,因为 WebSocket 允许将一个消息分割成多个帧进行发送。

3.2 RSV1、RVS2、RVS3

为了将来协议扩展而预留的空间,目前通常设置为0

3.3 opcode : 操作码

  • 0x00(十进制为 0) - 延续帧 : 当一个消息被分割成多个帧发送时,除了第一个帧之外的其他帧都使用opcode = 0x00
  • 0x01(十进制为 1) - 文本帧 : 用于发送 UTF - 8 编码的文本数据
  • 0x02(十进制为 2) - 二进制帧 : 用于发送二进制数据
  • 0x09(十进制为 9) - 心跳帧 : 用于发送心跳请求,也就是检查连接是否还存活。接收方收到心跳请求(opcode = 0x09)后应该回复一个opcode = 0x0A 的帧,以确认连接正常。

3.4 mask : 掩码

掩码机制是用于对从客户端发送到服务器的数据帧进行加密处理的一种机制。主要是为了防止代理服务器、中间件等第三方设备被恶意利用来缓存和篡改数据。

  • mask : 掩码,是一个比特(bit)的标志位,用于指示是否需要对数据载荷(Payload)进行掩码操作。如果mask为1,那么会在数据帧中定义一个掩码键(masking key),使用这个掩码键来对数据载荷进行掩码或反掩码操作。
  • masking key : 掩码密钥,是一个 32 位(4 字节)的数据,是一个用于掩码操作的密钥。
    • masking key与数据载荷进行特定的二进制运算(如XOR运算),从而实现对数据的掩码或反掩码。
    • 这种运算过程对于客户端和服务端来说是公开的,但具体的masking key是未知的,这确保了数据的传输
      安全。

3.5 payload length : 有效负载长度

用于告诉接收方这个帧中实际承载的数据长度是多少

3.6 payload : 有效载荷

是指 WebSocket 帧中包含的实际数据部分。这部分数据是通信双方真正想要传输的内容

4. WebSocket中的片段 : Fragments

片段(Fragments)是指将一个完整的消息分割成多个 WebSocket 帧来进行发送的情况。当消息内容过长或者需要分块传输时,就会使用到片段。

  • FIN标志位,用于指示这是否是消息的最后一个片段。如果FIN1,则表示该帧是消息的结尾;如果FIN0,则表示该帧是消息的一个中间片段。

5. Sec-WebSocket-Key为什么能确保服务器只接受来自合法客户端的 WebSocket 升级请求 ?

Sec - WebSocket - Key 是一个 Base64编码 的随机值。在每次客户端请求建立 WebSocket 连接时,这个值都是不同的。这种随机性使得攻击者很难猜测出正确的密钥来伪装成合法客户端。例如,它类似于一个每次进门都随机生成的 “门禁密码”,只有拥有正确密码(由客户端生成)的请求才能被服务器视为可能是合法的升级请求。

这种验证机制是 WebSocket 协议标准 的一部分。因为协议规定了双方都必须按照这个固定的方式进行密钥处理和验证,所以只要客户端和服务器都正确地实现了协议,就可以确保只有合法生成 Sec - WebSocket - Key 的客户端能够通过服务器的验证。

假设一个恶意攻击者试图伪造请求,它很难生成一个能够通过服务器验证的 Sec - WebSocket - Key。因为 SHA - 1 哈希算法是单向的,攻击者几乎不可能从期望的 Sec - WebSocket - Accept 值反推出正确的 Sec - WebSocket - Key。而且,由于 Sec - WebSocket - Key 是随机生成的,攻击者也很难猜测出一个有效的密钥来通过验证。

6. 参考

websocket是什么?和HTTP是什么区别?长轮询是什么?服务器推是什么?_哔哩哔哩_bilibili
10 分钟 理论 + 实操 搞懂 WebSocket_哔哩哔哩_bilibili
WebSocket的工作原理_哔哩哔哩_bilibili
WebSockets原理,握手和代码实现!用Socket.io制作实时聊天室_哔哩哔哩_bilibili

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

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

相关文章

分页查询日期格式不对

方式一:在属性上加入注解,对日期进行格式化 方式二:在 WebMvcConfiguration 中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理 /*** 统一转换处理扩展spring mvc* 后端返回前端的进行统一转化处理* param converters*/Overrideprotected voi…

Mybatis:CRUD数据操作之多条件查询及动态SQL

Mybatis基础环境准备请看:Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之多条件查询 1,编写接口方法 在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。在 BrandMapper 接口中定义多条件查询的方法。 而该功能有三个参数,…

接口测试工具:reqable

背景 在众多接口测试工具中挑选出一个比较好用的接口测试工具。使用过很多工具,如Postman、Apifox、ApiPost等,基本上是同类产品,一般主要使用到的功能就是API接口和cURL,其他的功能目前还暂未使用到。 对比 性能方面&#xff…

Chapter 17 v-model进阶

欢迎大家订阅【Vue2Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 1 v-model原理2 表单类组件封装3 v-model简化代码 1 v-model原理 1. 基本原理 v-model 本质上是一个语法糖,它将 value 属性 和 input 事件 的绑定合并为一个指令…

区块链技术如何改变我们的日常生活?

区块链技术,这个听起来很高科技的词,其实已经在悄悄地改变我们的日常生活了。不信?让我给你举几个例子: 防作弊:想象一下,如果有一个账本,每个人都能随时查看,那想在里面作弊就难了…

nacos安装部署

nacos安装部署 1.安装nacos 1.安装nacos nacos的安装很简单下载后解压启动即可,但是在启动前请确保jdk环境正常; 1.首先我们要下载nacos安装包:可以到官网下载,注意我这里使用的是2.1.0版本; 2.下载完成后&#xff0…

前端css实例

前端css实例 一、带条纹的表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>条纹样式的表格<…

基于云模型和遗传算法的建设工程风险决策多目标优化研究

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于云模型和遗传算法的建设工程风险决策多目标优化研究 基于云模型和遗传算法的建设工程风险决策多目标优化研究涉及在建设工程领域中运用云模型和遗传算法来优化风险决策的多个目标。云模型是一种将模糊理论与概率…

【Vue2.x】vue-treeselect修改宽度、回显

目录 修改vue-treeSelect 组件的高度方法1&#xff1a;CSS中的important语法&#xff0c;覆盖样式方法2&#xff1a;修改组件样式文件&#xff0c;重新引入样式文件 修改单选的回显&#xff0c;显示当前选中节点以及相应父级节点第一步 下载源码第二步 修改源码第三步 编译源码…

利用 SpringBoot 开发的新冠密接者跟踪系统:医疗机构疫情防控辅助方案

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子&#xff0c;还有数据中台、数据湖、数据仓库、数据集市的区别的帖子&#xff0c;发现帖子写的都很多&#xff0c;而且专业名词很多&am…

Mac 环境下类Xshell 的客户端介绍

在 Mac 环境下&#xff0c;类似于 Windows 环境中 Xshell 用于访问 Linux 服务器的工具主要有以下几种&#xff1a; SecureCRT&#xff1a; 官网地址&#xff1a;https://www.vandyke.com/products/securecrt/介绍&#xff1a;支持多种协议&#xff0c;如 SSH1、SSH2、Telnet 等…

Linux系统编程——进程替换

目录 前言 二、进程程序替换的概念 三、进程程序替换的原理 ​编辑 四、为什么需要进行进程程序替换 五、如何进行进程程序替换 1、进程替换函数&#xff1a; 1)execl()函数 2)execv()函数 3) execlp()函数 4) execvp()函数 5&#xff09;execle函数 6&#xff09;ex…

MATLAB 中有关figure图表绘制函数设计(论文中常用)

在撰写论文时&#xff0c;使用 MATLAB 导出的图像常常因大小和格式不统一&#xff0c;导致投稿时编辑部频繁退稿&#xff0c;要求修改和调整。这不仅浪费时间&#xff0c;也增加了工作量。为了减少这些麻烦&#xff0c;可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第13篇:YOLOv10——实时端到端物体检测】

YOLOv10 1 摘要2 网络结构3 YOLOv1-v10对比 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇&#xff1a;YOLO系列论文、代码和主要优缺点汇总】【第3篇&#xff1a;YOLOv1——YOLO的开山之作】【第4篇&#xff1a…

Python基于滑动窗口CNN损伤梁桥数据、故宫城墙图像数据分类可视化|数据分享

全文链接&#xff1a;https://tecdat.cn/?p38442 分析师&#xff1a;Yufei Guo 在现代土木结构工程领域&#xff0c;结构损伤的准确识别与定位对于保障基础设施的安全性和耐久性具有极为关键的意义。传统的人工检查方法&#xff0c;如目视检查以及借助专业设备进行检测&#x…

基于Pytorch的CIFAR100数据集上从ResNet50到VGG16的知识蒸馏实验记录

知识蒸馏的概念 可以参照NeurIPS2015的论文“Distilling the Knowledge in a Neural Network”了解知识蒸馏的概念。 知识蒸馏的狭义概念就是从复杂模型中迁移知识来提升简单模型的性能。复杂模型称之为教师模型&#xff0c;简单模型称之为学生模型。最近&#xff0c;笔者重温…

jQuery九宫格抽奖,php处理抽奖信息

功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项&#xff0c;用户点击抽奖按钮后&#xff0c;九宫格开始旋转&#xff0c;最终停在一个随机位置上&#xff0c;此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为&#xf…

鸿蒙修饰符

文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…

输入json 达到预览效果

下载 npm i vue-json-pretty2.4.0 <template><div class"newBranchesDialog"><t-base-dialogv-if"addDialogShow"title"Json数据配置"closeDialog"closeDialog":dialogVisible"addDialogShow":center"…