WebSocket的那些事(1-概念篇)

news2025/1/4 19:29:47

目录

  • 一、什么是Websocket
  • 二、WebSocket部分header介绍
  • 三、HTTP VS WebSocket
  • 四、什么时候使用WebSockets
  • 五、关于SockJS和STOMP

一、什么是Websocket

根据 RFC 6455 标准,Websocket协议提供了一种标准化的方式在客户端和服务端之间通过TCP连接建立全双工、双向通信渠道。它是一种不同于HTTP的TCP协议,但是被设计为在HTTP基础上运行。

Websocket交互始于HTTP请求,该请求会通过HTTP Upgrade请求头去升级请求,进而切换到Websocket协议。请求报文如下:

GET /spring-websocket-portfolio/portfolio HTTP/1.1
Host: localhost:8080
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==
Sec-WebSocket-Protocol: v10.stomp, v11.stomp
Sec-WebSocket-Version: 13
Origin: http://localhost:8080

我们可以看到在该请求报文中有两个特殊的请求头,一个是Upgrade请求头,代表升级为websocket协议。还有一个是Connection请求头,代表升级连接。

正常的HTTP响应报文如果正常返回,响应码是200,请求升级为websocket协议的响应报文如下:

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=
Sec-WebSocket-Protocol: v10.stomp

我们可以看到该响应报文中状态行返回的响应码是101,后面还附带了Switching Protocols切换协议关键字。

在成功握手后,底层HTTP升级请求TCP套接字会在客户端和服务端之间保持开放,从而继续发送和接收消息。

备注:关于Websockets如何工作的完整文档可以参考 RFC 6455。


二、WebSocket部分header介绍

我们可以看到请求和响应报文中有一些特殊的websocket头部信息,这里简单的介绍一下:

  • Sec-WebSocket-Key:用于客户端与服务端初次握手唯一标识,Base64编码字符串。
  • Sec-WebSocket-Accept:初次握手服务端返回的唯一标识,也是Base64编码字符串,用来证明来自客户端的握手请求已经收到了,该响应头的值为:SHA-1(“Sec-WebSocket-Key” + “GUID”),然后再经过Base64编码。

备注:这里的GUID为固定值 258EAFA5-E914-47DA-95CA-C5AB0DC85B11

  • Sec-WebSocket-Protocol:WebSocket子协议,比如可以是STOMP协议。
  • Sec-WebSocket-Version:WebSocket协议版本号,值必须为13。

三、HTTP VS WebSocket

虽然WebSocket被设计成和HTTP协议兼容,但是两种协议有不同的架构和应用编程模型。

在HTTP和REST中,应用被模型化为许多URL,客户端和应用交互需要访问这些URL,服务端对请求进行路由并交给合适的处理器,处理器会基于HTTP URL、方法和头部进行处理。

WebSocket和HTTP相反,通常只有一个URL用于初始链接,后面所有应用消息都会在相同的TCP连接上传输,这是一种完全不同的异步、事件驱动的消息。

WebSocket也是一种低级的传输协议,不像HTTP,它并没有规定消息内容的语义,也就意味着客户端和服务端之间如果没有对消息语义达成一致,是没办法路由和处理消息的。

WebSocket客户端和服务端之间可以协商使用更高级消息协议,比如STOMP,可以通过HTTP握手请求的请求头Sec-WebSocket-Protocol指定。


四、什么时候使用WebSockets

WebSockets可以让Web页面动态化和可交互,然而,在很多场景下,AJAXHTTP Streaming或者长轮询也能提供简单、有效的解决方案。

例如,新闻、邮件和社会实事需要动态更新,每几分钟更新一次就好。而协作类、游戏和金融类APP需要更加的实时。

延时也不是决定性因素,如果消息体量比较小,HTTP Streaming或者长轮询也能解决,而像低延时、高频次和大消息体量的场景,WebSocket更适合。


五、关于SockJS和STOMP

SockJSSTOMP 都是用于 Web 应用程序与消息代理进行通信的技术,但它们解决的问题不同。

SockJS 是一个 JavaScript 库,它提供了一种在 Web 浏览器和 Web 服务器之间建立 WebSocket 连接的跨浏览器解决方案。

SockJS 旨在解决 WebSocket 不受支持或无法使用的情况下,使用轮询和其他技术建立实时双向通信的问题。SockJS 库支持多种传输方式,包括 WebSocket、XHR 流、XHR 短轮询等,从而保证了最大的兼容性和可靠性。

STOMP(Simple Text Oriented Messaging Protocol)是一种基于文本的简单消息协议,它提供了一种可互操作性的机制,用于跨语言和平台之间的实时消息传递。

STOMP 协议定义了一组命令和消息格式,用于在客户端和服务器之间进行消息传递,它与特定的消息代理无关,因此可以使用 STOMP 协议与多个消息代理进行通信。STOMP 支持订阅/发布模式和点对点模式,可以用于实现诸如聊天室、通知系统和实时数据更新等应用程序。

通常情况下,使用 SockJSSTOMP结合使用可以获得最佳的性能和可靠性。

SockJS 提供了一种建立 WebSocket 连接的可靠跨浏览器解决方案,而 STOMP 提供了一种在 WebSocket 连接上实现实时消息传递的标准化协议。

在使用 SockJSSTOMP 的组合时,可以使用 SockJS 建立 WebSocket 连接,然后使用 STOMP 协议在 WebSocket 连接上进行消息传递,从而获得最佳的性能和可靠性。

在这里插入图片描述

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

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

相关文章

【DarkLabel】使用教程(标注MOT数据集)

DarkLabel 使用教程 功能部分 Open video 第 2 处的内容为数据集类型。例如:VOC、COCO、MOT、YOLO等。 第 3 处的内容为标签名称。 可在 darklabel.yml 中修改 classes_set。例如:classes_set: "mot_classes" 第 4 处的内容为两种跟踪方法…

Maven项目的配置

Maven是什么?它的作用是什么? Maven是一种开源的构建工具,它可以自动化构建、测试、部署和管理Java项目。它提供了一个中心化的构建过程,包括依赖管理、项目结构管理、插件管理等,使得开发人员更方便地维护和协作应用…

【Python】操作MySQL

一、Python 操作 Mysql的方式 Python 操作 Mysql 主要包含下面 3 种方式: Python-MySql Python-MySql 由 C 语法打造,接口精炼,性能最棒;但是由于环境依赖多,安装复杂,已停止更新,仅支持 Python…

记一次我的漏洞挖掘实战——某公司的SQL注入漏洞

目录 一、前言 二、挖掘过程 1.谷歌语法随机搜索 2.进入网站 3.注入点检测 3.SQLMAP爆破 (1)爆库 (2)爆表 (3)爆字段 三、总结 一、前言 我是在漏洞盒子上提交的漏洞,上面有一个项目叫…

【远程工具】- Tabby 下载、安装、使用、配置【ssh/Serial】-免安装、解压即用

目录 一、Tabby 概述 二、Tabby 下载、安装 三、Tabby 的使用  👉3.1 使用SSH协议连接Linux开发主机  👉3.2 使用Serial(串口)协议连接开发板 一、Tabby 概述 在远程终端工具中,secureCrt 和 XShell 是两款比较有名的远程工具,但…

矩阵求逆方法

1.待定系数法 矩阵A 1, 2 -1,-3 假设所求的逆矩阵为 a,b c,d 则 从而可以得出方程组 a 2c 1 b 2d 0 -a - 3c 0 -b - 3d 1 解得 a3; b2; c -1; d -1 2.伴随矩阵求逆矩阵 伴随矩阵是矩阵元素所对应的代数余子式,所构成的矩阵,转置后得到的新矩阵…

图的存储--邻接矩阵/边集数组/邻接表/链式邻接表/链式前向星

邻接矩阵 使用二维数组w[u][v]存储点u到点v的边的权值。一般应用在点数不多的稠密图 时间复杂度&#xff1a;O(n2) 空间复杂度&#xff1a;O(n2) int w[N][N]; // edge int vis[N]; // visitedvoid dfs(int u){vis[u] true;for(int v 1; v < n; v)if(w[u][v]){prin…

Java 基础进阶篇(六)—— 面向对象三大特征之三:多态

文章目录 一、多态的概述二、多态中成员访问特点 ★三、多态的优势与劣势四、多态下的类型转换4.2 自动类型转换&#xff08;从子到父&#xff09;4.2 强制类型转换&#xff08;从父到子&#xff09;4.3 instanceof 关键字 一、多态的概述 多态&#xff1a;是指执行同一个行为…

自动驾驶——最优控制算法里卡提方程推导【连续系统】

1. Why use the Riccati equation&#xff1f; Q、R就是需要设计的半正定矩阵和正定矩阵。考虑根据实车的情况去标定此参数&#xff0c;从理论和工程层面去理解&#xff0c;如果增大Q、减小R&#xff0c;则此时控制系统响应速度比较快速&#xff08;比较剧烈&#xff09;&…

[SpringBoot]什么是服务器前后端的一个流程图bmi练习案例

前点: 服务器&#xff1a; 服务器就是一台高性能的电脑, 在电脑上安装了提供XXX服务的软件, 这台电脑就可以称为XXX服务器 - 举例: - 数据库服务器: 在电脑上安装了提供数据增删改查服务的软件(DBMS) - 邮件服务器: 在电脑上安装了提供邮件收发服务的软件 - FTP服务器: …

普通的2D Average pooling是怎么进行backward的呢?

二维平均池层计算损失相对于其输入张量的梯度&#xff0c;方法是将损失相对于输出张量的梯度均分在输入子区域&#xff0c;这些子区域在前向传播中被用来计算平均值。 由于平均集合计算的是每个输入子区域的平均值&#xff0c;所以子区域中的每个元素对平均值的贡献是相同的。…

Java Servlet_HTTP

今日内容 零、 复习昨日 一、Servlet 二、HTTP 三、HttpServlet 零、 复习昨日 见晨考 一、Servlet 1.1 介绍 javaweb开发,就是需要服务器接收前端发送的请求,以及请求中的数据,经过处理(jdbc操作),然后向浏览器做出响应. 我们要想在服务器中写java代码来接收请求,做出响应,我…

SignOff Criteria——AOCV(Advanced OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. A O C V P r i n c i p l e I n t r o d u c t i o n AOCV\ Principle\ Introduction AOCV Principle Introduction2.1 G B A − A O C V GBA-AOCV GBA−AOCV2.1.1 A b o u t L o g i c a l D e p t h About\ Logical\ De…

第六章 Iptables与Firewalld防火墙

第六章 Iptables与Firewalld防火墙 一、Iptables 1、策略与规则链 &#xff08;1&#xff09;、防火墙策略规则的设置 一种是“通”即放行&#xff0c;另一种是“堵”即阻止。 当防火墙的默认策略为拒绝时&#xff08;堵&#xff09;&#xff0c;就要设置允许规则通&#x…

NECCS|全国大学生英语竞赛C类|听力|短对话|14:20~15:30

目录 一、短对话 1. 定位词 2. 场景词汇 &#xff08;1&#xff09;餐馆用餐 &#xff08;2&#xff09;商场用语 &#xff08;3&#xff09;校园用语 &#xff08;4&#xff09;图书馆用语 二、题目类型 1. 人物类 考点聚焦 2. 地点类 主要涉及 3. 数字类 4. 主题…

【数据库】JDBC编程

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 什么是JDBC&#xff1f; JDBC工…

sql注入(三)绕过方法及防御手段

一、sql注入的绕过方法 1.注释符过滤绕过 常用的注释符有&#xff1a; 1&#xff09;-- 注释内容 2&#xff09;# 注释内容 3&#xff09;/* 注释内容 */ 绕过方法 构造闭合&#xff1a; ?id1 and sql语句 and 11 这样接收源码前面的引号被 id1 中的后引号所闭合&…

关于MPU的笔记

MPU&#xff08;memory protection unit&#xff09;内存保护单元。这些系统必须提供一种机制来保证正在运行的任务不破坏其他任务的操作。即要防止系统资源和其他一些任务不受非法访问。嵌入式系统有专门的硬件来检测和限制系统资源的访问。它能保证资源的所有权&#xff0c;任…

unity 性能优化之画质分级

如果你的游戏兼容多平台&#xff0c;或者当前平台的设备也有硬件差距&#xff0c;比如低端设备就是带不动你的画质&#xff0c;无论如何你如何优化就是带不动。这种情况下&#xff0c;我们可以考虑对画质进行分级&#xff0c;减少一些特性&#xff0c;来提高运行质量。接下来我…

JavaWeb《HTML基础标签》

本笔记学习于Acwing平台 MDN官方文档https://developer.mozilla.org/zh-CN/ 目录 1. html文件结构 2. 文本标签 3. 图片 4. 音频和视频 5. 超链接 6. 表单 7. 列表 8. 表格 9. 语义标签 10. 特殊符号 1. html文件结构 文档结构 html的所有标签为树形结构&#xff…