当前位置: 首页 > news >正文

WebSocket

握手

1 客户端发起握手请求:客户端向服务器发送一个特殊的HTTP请求,其中包含一个Upgrade字段,表明客户端希望将该连接从HTTP协议升级为WebSocket协议。请求的关键部分包括:

GET请求:客户端使用GET方法请求与WebSocket连接

  • Connection字段:值为Upgrade,指示连接要从HTTP升级。
  • Upgrade字段:值为websocket,表示升级的目标协议。
  • Sec-WebSocket-Key:随机生成的Base64编码密钥,用于握手的安全性验证。
  • Sec-WebSocket-Version:协议版本号,通常为13。

2 服务器响应握手请求:服务器接收到握手请求后,确认请求是否有效,并返回一个包含101 Switching Protocols状态码的响应,表示协议升级成功。服务器的响应包括:

  • HTTP 101状态码:101 状态码表示服务器已经理解了客户端的请求,并将通过 Upgrade 消息头通知客户端采用不同的协议来完成这个请求。
  • Upgrade字段:与客户端相同,表明升级为WebSocket协议。
  • Sec-WebSocket-Accept:根据客户端的Sec-WebSocket-Key计算出的验证密钥,用于完成握手的安全性校验。这个密钥是通过将Sec-WebSocket-Key与一个常量字符串进行拼接(258EAFA5-E914-47DA-95CA-C5AB0DC85B11),然后通过SHA-1哈希生成,再进行Base64编码得到的。

连接升级完成:握手完成后,HTTP连接升级为WebSocket连接,客户端和服务器可以通过这个持久的连接开始双向通信。

1、FIN: 占 1 个 bit

        0:不是消息的最后一个分片 1:是消息的最后一个分片

        2、RSV1, RSV2, RSV3:各占 1 个 bit一般情况下全为 0。当客户端、服务端协商采用         WebSocket 扩展时,这三个标志位可以非 0,且值的含义由扩展进行定义。如果出现非零的值,且并没有采用 WebSocket 扩展,连接出错。

3、Opcode: 4 个 bit

        %x0:表示一个延续帧。当 Opcode 为 0 时,表示本次数据传输采用了数据分片,当前收到的数据帧为其中一个数据分片;

        %x1:表示这是一个文本帧(frame);

        %x2:表示这是一个二进制帧(frame);

        %x3-7:保留的操作代码,用于后续定义的非控制帧;

        %x8:表示连接断开;

        %x9:表示这是一个 ping 操作;

        %xA:表示这是一个 pong 操作;

        %xB-F:保留的操作代码,用于后续定义的控制帧。

4、Mask: 1 个 bit 表示是否要对数据载荷进行掩码异或操作。

        0:否  1:是

5、Payload length: 7bit or 7 + 16bit or 7 + 64bit

       表示数据载荷的长度

  x 为 0~126:数据的长度为 x 字节;

       x 为 126:后续 2 个字节代表一个 16 位的无符号整数,该无符号整数的值为数据的长度;

       x 为 127:后续 8 个字节代表一个 64 位的无符号整数(最高位为 0),该无符号整数的值为数据的长度。

6、Masking-key: 0 or 4bytes

        当 Mask 为 1,则携带了 4 字节的 Masking-key;
        当 Mask 为 0,则没有 Masking-key。
7、Payload Data: 载荷数据

j = i % 4
maskkey[4]     //  j用来形容maskkey  0 1 2 3
payload[N]       // i是给payload做索引用的

payload[i] ^= maskkey[j];

每个WebSocket数据帧包含两个主要部分:帧头(Header)和有效载荷(Payload),帧头部分包含了控制信息,而有效载荷部分则是实际传输的数据。

  • FIN:表示该数据帧是否是消息的最后一个帧,值为1表示结束,0表示后续还有帧。
  • Opcode:标识该数据帧的类型,如文本帧、二进制帧等。常见的值为
    • 0x1:文本帧(UTF-8编码)
    • 0x2:二进制帧
    • 0x8:关闭帧
    • 0x9:Ping帧
    • 0xA:Pong帧
  • Mask:标识数据帧的有效载荷是否进行了掩码操作。客户端发送的帧必须带有掩码,而服务器发送的帧可以不带掩码
  • Payload Length:有效载荷的长度,值为7位或更多,具体取决于载荷的大小。
  • Masking Key:如果Mask位为1,则这个字段存在,用于解码有效载荷数据。
  • Masking Key:如果Mask位为1,则这个字段存在,用于解码有效载荷数据。

客户端发送一帧数据

服务端回复同样的数据

部分测试代码

服务端

使用acl做Websocket服务端 , 只需要在HttpServlet类里面重载doWebSocket方法就可以实现websocket协议的交互

如果要加上ssl验证 , 在创建HttpServlet之前调用conn->setup_hook即可实现wss加密,否则普通的websocket连接将失败

客户端

使用libhv做websocket客户端 , examples里面的例子相当的简单,如果需要支持wss, 则需要在连接之前调用withTLS把初始化的hssl_ctx_opt_t设置进去即可。


wss 报文

server

client

使用了ssl加密之后抓包发现多了很多TLS的报文,且看不到自己发送的明文了

相关文章:

WebSocket

握手 1 客户端发起握手请求:客户端向服务器发送一个特殊的HTTP请求,其中包含一个Upgrade字段,表明客户端希望将该连接从HTTP协议升级为WebSocket协议。请求的关键部分包括: GET请求:客户端使用GET方法请求与WebSocket…...

适配器模式

适配器模式(Adapter Pattern)详解 定义 适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。适配器模式又称“包装器(Wrapper)”。 适配…...

Jmeter最新详细安装及修改中文教程(附安装包)

目录 初识:Jmeter 一、下载:Jmeter 二、安装前必要的配置 1.桌面点击菜单栏搜索【cmd】,然后打开命令提示符 2.输入java -version命令 三、安装:Jmeter 1.首先在D盘创建【Jmeter】文件夹,把下载的【Jmeter】压缩…...

Java 语言的起源发展与基本概念(JDK,JRE,JVM)

Java语言的起源 源起 Java语言最初是由Sun Microsystems公司(该公司于2009年被Oracle公司收购)开发的一种编程语言。其创造者是詹姆斯高斯林(James Gosling),他是一位加拿大计算机科学家。其前身名为Oak(橡…...

利用dockerCompose一键部署前后端分离项目

1.Docker Compose介绍 2.将自己准备好的docker-compose.yml文件上传到宿主机 3.查看docker-compose.yml文件 宿主机的文件内容可参考: 项目部署-通过docker手动部署前后端分离项目(全网超级详细 的教程)-CSDN博客 修改宿主机的nginx.conf …...

redis大key和热key

redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大&#xff…...

在 Linux 系统中根据pid查找软件位置

在 Linux 系统中,如果您知道一个进程的 PID(进程标识符),并且想要找到该进程对应的可执行文件的位置,可以使用以下几种方法: 方法一:使用 ps 命令 ps 命令可以显示进程的详细信息,包括可执行文件的路径。假设您的 PID 是 1234,可以使用以下命令: ps -p 1234 -o co…...

Python开发环境搭建+conda管理环境

下载Miniconda 推荐从清华镜像下载安装包 Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 打开网页后,下拉到最后找到Miniconda3-latest前缀的文件,或者网页中直接搜索Miniconda3-latest,都可以找…...

Java 8新特性详解与实战

目录 引言 1. Lambda 表达式(Lambda Expressions) 2. 函数式接口(Functional Interfaces) 3. 流 API(Stream API) 4. 默认方法(Default Methods) 5. Optional 类 6. 新的时间日…...

K8s内存溢出问题剖析:排查与解决方案

文章目录 一、背景二、排查方案:1. 可能是数据量超出了限制的大小,检查数据目录大小2. 查看是否是内存溢出2.1 排查数据量(查看数据目录大小是否超过limit限制)2.2 查看pod详情发现问题 三、解决过程 一、背景 做redis压测过程中…...

Network Link Conditioner Mac 上模拟网络环境工具的安装和使用

前言 Xcode 的模拟器本身是不支持模拟网络环境的,在开发界面的时候,设计会出无网、弱网这种情况的设计图,为了方便在开发过程中实现这些情况的代码逻辑,Network Link Conditioner 就是模拟网络环境的好帮手。 安装 Network Lin…...

SeggisV1.0 遥感影像分割软件【源代码】讲解

在此基础上进行二次开发,开发自己的软件,例如:【1】无人机及个人私有影像识别【2】离线使用【3】变化监测模型集成【4】个人私有分割模型集成等等,不管是您用来个人学习 还是公司研发需求,都相当合适,包您满…...

电子应用设计方案-27:智能淋浴系统方案设计

智能淋浴系统方案设计 一、系统概述 本智能淋浴系统旨在为用户提供舒适、便捷、个性化的淋浴体验,通过集成多种智能技术,实现水温、水流、淋浴模式的精准控制以及与其他智能家居设备的联动。 二、系统组成 1. 喷头及淋浴杆 - 采用可调节角度和高度的设计…...

旋转图像(java)

题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 代码思路: class Solution {public void ro…...

单片机知识总结(完整)

1、单片机概述 1.1. 单片机的定义与分类 定义: 单片机(Microcontroller Unit,简称MCU)是一种将微处理器、存储器(包括程序存储器和数据存储器)、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…...

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录,有别于基础语法,很多内容只要求会用就行,无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout: 1.3 string以下是字符串的一些简介:字符串…...

Spring Boot【四】

单例bean中使用多例bean 1.lookup-method方式实现 当serviceB中调用getServiceA的时候,系统自动将这个方法拦截,然后去spring容器中查找对应的serviceA对象然后返回 2.replaced-method:方法替换 我们可以对serviceB这个bean中的getServiceA…...

linux基础1

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...

DAMODEL丹摩|部署FLUX.1+ComfyUI实战教程

本文仅做测评体验,非广告。 文章目录 1. FLUX.1简介2. 实战2. 1 创建资源2. 1 ComfyUI的部署操作2. 3 部署FLUX.1 3. 测试5. 释放资源4. 结语 1. FLUX.1简介 FLUX.1是由黑森林实验室(Black Forest Labs)开发的开源AI图像生成模型。它拥有12…...

Python语法基础(三)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们这篇文章来说一下函数的返回值和匿名函数 函数的返回值 我们先来看下面的这一段函数的定义代码 # 1、返回值的意义 def func1():print(111111111------start)num166print…...

计算分数的浮点数值

计算分数的浮点数值 C语言代码C 代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 两个整数a和b分别作为分子和分母,既分数 a/b ,求它的浮点数值(双精度浮点数,保留小数点…...

Staircase mesh” 和 Conformal mesh区别

一、Staircase Mesh(阶梯状网格) 1.1 含义 阶梯状网格就像是用一个个小方块或者矩形拼接起来的网格。在对几何形状进行划分网格时,它会以一种比较简单直接的方式,使得网格边界呈现出像楼梯台阶一样的形状。比如在模拟一个圆形物体…...

探索未来工业的核心:数字孪生技术深度解析

经过数十年的发展,建模和模拟已成为工程和科学的基石。人们针对改进建模的计算方法进行了大量的研究和开发工作。这些计算机模型对系统设计非常有用,可以削减实验和测试的高昂成本。然而在实操中,还需要跟踪系统随时间的演变情况,…...

dns 服务器简单介绍

dns 服务器分类: 根域名服务器顶级域名服务器权威域名服务器本地域名服务器 dns 的查询过程 国内优秀公共域名 腾讯:DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS-烟台帝思普网络科技有限公司 119.29.29.29 和 182.254.118.118 阿里&#xf…...

SQL基础入门——C++与SQL连接实践

在开发中,C与SQL数据库的连接和交互是非常常见的需求。通过将C与SQL数据库连接起来,我们可以轻松地执行数据存取、查询、更新等操作。C与数据库的集成通常依赖于数据库的连接器或驱动程序,本章节将详细讲解如何在C中使用MySQL Connector与SQL…...

对max_seq_length参数的理解,基于open-instruct框架:中英文解释

使用open-instruct (https://github.com/allenai/open-instruct )框架,对其中的max_seq_length参数的理解记录下来。 bash脚本内容如下: # 设置模型和训练参数 MODEL_NAMEgoogle/gemma-2-2b MACHINE_RANK0 MAIN_PROCESS_IP127.0.0.1 MAIN_PROCESS_PORT2…...

似然分布(Likelihood Distribution)和似然函数(Likelihood Function)有什么区别?中英双语

中文版 在统计学中,似然分布(Likelihood Distribution)和似然函数(Likelihood Function)是两个相关但有所不同的概念。它们都涉及给定参数的情况下,数据出现的概率,但是它们的使用方式和含义有…...

LINUX2.4.x网络安全框架

在分析LINUX2.4.x网络安全的实现之前先简介一下它里面包括的几个重要概念:netfilter、iptables、match、target、nf_sockopt_ops、网络安全功能点的实现。详解会在后面的分析中讲到。 首先是netfilter,它定义了协议栈中的检查点和在检查点上引用的数据结…...

Python毕业设计选题:基于django+vue的智能停车系统的设计与实现

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 车主管理 车辆信息管理 车位信息管理 车位类型管理 系统…...

AI界的信仰危机:单靠“规模化”智能增长的假设,正在面临挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

JMeter 并发策略-针对准点秒杀场景的压测实现

一、场景的压测实现 1,创建线程组,10并发用户执行5次; 2,创建 Synchronizing Timer 元件,用于同步线程,设置同步元件 Synchronizing Timer 3,创建 http 请求4,创建 view results in table 元件…...

【如何提升代码工程质量】code review篇

应该对于基本上所有软件相关的公司来说,都有committer机制,即代码写好之后会提交合并请求,待相关人员code review通过后再进行合入,所以code review就是代码合入代码仓库的最后一道关卡,对于代码质量的影响也是不容忽视…...

1041.困于环中的机器人

题目: 解题思路; 由于机器人会一直重复指令,存在重复多次指令才回到原点的情况,需要对不同情况经行分析。 当执行一次指令后回到原点,则机器人永远无法回到原点。当执行一次指令后不回到原点,只有方向向北的无法在多次…...

Python实现IP代理池

文章目录 Python实现IP代理池一、引言二、步骤一:获取代理IP1、第一步:爬取代理IP2、第二步:验证代理IP的有效性 三、步骤二:构建IP代理池四、使用示例1、完整的使用示例2、注意事项3、处理网络问题 五、总结 Python实现IP代理池 …...

【Linux网络编程】第二弹---Socket编程入门指南:从IP、端口号到传输层协议及编程接口全解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Socket 编程预备 1.1、理解源 IP 和目的 IP 1.2、认识端口号 1.2.1、端口号范围划分 1.2.2、理解 &q…...

【机器学习】机器学习学习笔记 - 监督学习 - 多项式回归决策树回归 - 03

多项式回归 解决线性回归的准备性不足问题(线性回归只能是直线,多项式回归引入多项式可以是曲线)通过对预测值进行多项式转换, 使得回归模型可以是非线性的多项式回归的优点是可以处理非线性的数据多项式回归的缺点是它对数据进行了多项式转换 加菲工具&#xff0…...

篡改猴(Tampermonkey)使用指南:为您的浏览器增添超级能力

篡改猴(Tampermonkey)使用指南:为您的浏览器增添超级能力 篡改猴(Tampermonkey) 是一款流行的用户脚本管理工具,可以在浏览器中安装和运行用户脚本,从而增强或自定义网页的功能。无论是去广告、…...

23省赛区块链应用与维护(房屋租凭【下】)

23省赛区块链应用与维护(房屋租凭) 背景描述 随着异地务工人员的增多,房屋租赁成为一个广阔市场。目前,现有技术中的房屋租赁是由房主发布租赁信息,租赁信息发布在房屋中介或租赁软件,租客获取租赁信息后,现场看房,并签订纸质的房屋租赁合同,房屋租赁费用通过中介或…...

Java中三种常用布局方式

引言 在Java Swing和JavaFX中,布局管理器(Layout Managers)用于控制组件(如按钮、文本框等)在容器(如窗口、面板等)内的位置和大小。下面介绍Java Swing中常用的三种布局方式: 1. Fl…...

06_数据类型

数据类型 数据类型分类 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值和第八种 BigInt类型,当前课程暂不涉及) 据类型分类 原始类型(基础类型) var age = 20, var name = 尚学堂"; var le…...

及时+准确|主动元数据平台在监管报送场景中的应用实践

面对海量的数据报送需求和日益严格的监管要求,如何实现监管报送的全链路自动化数据质量保障,是金融机构亟待解决的重要课题。本文旨在介绍一种全新的监管报送场景方案,帮助金融机构通过“一键溯源与口径自动盘点、指标同源自动化分析、全链路…...

[python脚本处理文件入门]-18.使用Python进行PDF文件的合并与拆分

哈喽,大家好,我是木头左! Python PDF处理库概览 1. PyPDF2 PyPDF2是一个纯Python编写的库,用于PDF文件的读写和操作。它提供了丰富的功能,包括PDF文件的合并、拆分、加密、解密等。PyPDF2的安装非常简单,只需通过pip即可安装: pip install PyPDF2安装完成后,你就可以…...

4、常量和进制转换

1、常量 1.1、常量 常量是在程序运行中值不能内改变(常数)。 整型:12 55 实型:21.5 字符型常量: ‘A’ 1.2、常量不同进制表示 常量数据在计算机中除了用 十进制 表示,还可以用 二进制、八进制、十六进制表示。 十进制数据&…...

C++:探索哈希表秘密之哈希桶实现哈希

文章目录 前言一、链地址法概念二、哈希表扩容三、哈希桶插入逻辑四、析构函数五、删除逻辑六、查找七、链地址法代码实现总结 前言 前面我们用开放定址法代码实现了哈希表: C:揭秘哈希:提升查找效率的终极技巧_1 对于开放定址法来说&#…...

java函数式编程和Lambda表达式

https://www.bilibili.com/video/BV1fz421C7tj?spm_id_from333.788.videopod.episodes&vd_source12d5954938d20d50645e227a6a728c76 如果一个接口中只有一个方法,那么就可以函数对象化: interface Add {int add(int a, int b);}Add add (a, b) -&…...

【线程】Java多线程代码案例(2)

【线程】Java多线程代码案例(2) 一、定时器的实现1.1Java标准库定时器1.2 定时器的实现 二、线程池的实现2.1 线程池2.2 Java标准库中的线程池2.3 线程池的实现 一、定时器的实现 1.1Java标准库定时器 import java.util.Timer; import java.util.Timer…...

IOU Loss详解

IoU(Intersection over Union是目标检测中常用的指标,用于评估预测框和真实框的重叠程度。基于 IoU 的损失函数(IoU Loss)是通过优化 IoU 值来提升模型预测框的精度。 IoU 的计算公式 给定预测框 ( B_p ) 和真实框 ( B_g )&#…...

nfs服务器

1、简介 NFS (Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计 算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上…...

Diving into the STM32 HAL----- IWDG and WWDG Timers笔记

墨菲定律指出,任何可能出错的事情都会出错。尤其是对于嵌入式系统来说,情况尤其如此。除了硬件故障也会对软件产生影响外,即使是最仔细的设计也可能会出现一些意外情况,导致我们设备的异常行为。这可能会产生重大成本,…...

使用statefulset管理pod

deployment主要管理无状态的pod,就算需要磁盘也是期望做动态扩容的。而对于那种有状态需要存储数据的,如log、数据库、消息中间件需要持久化数据的,则建议使用StatefulSet,我们的pod现在扩充了pv和pvc,那就使用Statefu…...