websocket状态机
websocket突破了HTTP协议单向性的缺陷,基于HTTP协议构建了双向通信的通道,使服务端可以主动推送数据到前端,解决了前端不断轮询后台才能获取后端数据的问题,所以在小程序和H5应用中被广泛使用。本文主要集合报文分析对于websocket的状态机进行讲解。
1)websocket状态机
websocket状态机相对于非常经典的TCP状态机来说非常的简单,包括五种状态:INITIAL、CONNECTING、OPEN、CLOSING和CLOSED。其中客户端涉及五种状态:INITIAL、CONNECTING、OPEN、CLOSING和CLOSED,服务端涉及四种状态:INITIAL、OPEN、CLOSING和CLOSED。状态变迁过程如下:
websocket建立过程中状态的变化如下所述:
1)客户端调用connect发起连接,则经过INITIAL进入CONNECTING状态,并且发起握手请求
2)服务端websocket启动进入INITIAL状态
3)服务端接收到客户端的握手请求后回复握手应答,状态变迁为OPEN
4)客户端接收到服务端的握手应答后,状态也变迁到OPEN
(至此客户端和服务端的websocket连接正式链接,可以双向通信了)
5)任何一方都可以关闭websocket连接。发起关闭连接的一方,调用close将发送关闭帧到对端,状态变迁到CLOSING
6)接收到关闭帧的一方状态也变迁到CLOSING,,并发起拆除TCP连接的请求(发送FIN分组,然后经过四次握手后完成TCP连接的关闭操作。
2)websocket协议分析
websocket协议本身是基于TCP的协议,但其中的握手协议使用了HTTP协议,以下是一个websocket客户端与服务端建立连接,连接建立后服务端发送一个票据到客户端,然后客户端发送hello world后,再关闭websocket,报文全貌如下:
前3行是标准的TCP三次握手,建立TCP连接。
第4行到第6行是websocket握手过程,握手完成建立了WEBSOCKET连接(此时客户端和服务端状态机均为OPEN状态)
第7行和第8行是服务端发送票据的报文。
第9行和第10行是客户端发送hello world到服务端
第11行到13行是websocket关闭过程。第11行是客户端发起关闭请求帧(自身进入CLOSING状态),第12行是服务端对关闭帧的确认,第13行是服务端发送关闭请求帧(服务端进入CLOSING状态)
第14行到第17行是服务端发起的关闭TCP连接的过程。TCP连接关闭后,两个状态机均进入CLOSED状态。
3)报文分析
以下仅对websocket相关报文进行分析,TCP的连接建立、关闭和ACK报文不再关注。
客户端发起握手报文如下:
服务端发起握手报文如下:
建立websocket连接后,服务端发送的令牌报文如下:
服务端发送hello word的报文如下:
客户端发送关闭帧报文如下:
服务端发送关闭帧报文如下:
相关文章:
![](https://i-blog.csdnimg.cn/direct/40c2b76c42fd4fc883bd544e163ada6b.png)
websocket状态机
websocket突破了HTTP协议单向性的缺陷,基于HTTP协议构建了双向通信的通道,使服务端可以主动推送数据到前端,解决了前端不断轮询后台才能获取后端数据的问题,所以在小程序和H5应用中被广泛使用。本文主要集合报文分析对于websocket…...
![](https://img-blog.csdnimg.cn/direct/8c06319fa9b246df9d9348bf42a1a2c6.png)
JCR一区级 | Matlab实现CPO-Transformer-LSTM多变量回归预测【2024新算法】
JCR一区级 | Matlab实现CPO-Transformer-LSTM多变量回归预测【2024新算法】 目录 JCR一区级 | Matlab实现CPO-Transformer-LSTM多变量回归预测【2024新算法】效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【JCR一区级】Matlab实现CPO-Transformer-LSTM多变量回归预测…...
![](https://i-blog.csdnimg.cn/direct/8575540877e547688bcdb1c24dc4b8b5.png)
力扣3226 使两个整数相等的位更改次数
写的代码: class Solution { public:string cc(int num){string res"";while(num>0){int rnum % 2;resstatic_cast<char>(48r)res;num/2;}return res;}int minChanges(int n, int k) {int res0;string n2cc(n);string k2cc(k);int n_sizen2.siz…...
![](https://img-blog.csdnimg.cn/img_convert/423298544ec92669517bed92a10a9120.jpeg)
VLAN 划分案例详解
vlan 的应用在网络项目中是非常广泛的,基本上大部分的项目都需要划分 vlan,这里从基础的 vlan 的知识开始,了解 vlan 的划分原理。 为什么需要 vlan: 1、什么是 VLAN? VLAN(Virtual LAN)&…...
![](https://www.ngui.cc/images/no-images.jpg)
[技术总结] C++ 使用经验
const 和 constexpr 有什么区别. const 一般是设置一个只读的属性, 在运行时还有可能通过cast变成一个可修改的. 但是constexpr是告诉编译器这就是一个常亮, 在编译时就可以计算出来然后进行替换.static 修饰的成员函数 & 成员变量 static 修饰的成员函数只能访问 static 修…...
![](https://www.ngui.cc/images/no-images.jpg)
音频数据集
1 多语言 Mozilla Common Voice 下载地址:https://voice.mozilla.org/data 时长:1965小时(目前为止) 最早2017年发布,持续更新,该基金会表示,通过 Common Voice 网站和移动应用,他们…...
![](https://i-blog.csdnimg.cn/direct/8d4f60f660d8496aa2915b71fdabd5d9.png)
Java | Leetcode Java题解之第268题丢失的数字
题目: 题解: class Solution {public int missingNumber(int[] nums) {int n nums.length;int total n * (n 1) / 2;int arrSum 0;for (int i 0; i < n; i) {arrSum nums[i];}return total - arrSum;} }...
![](https://i-blog.csdnimg.cn/direct/8cf9ce6cedef463fb72b97d2edec0e77.png)
指针!!C语言(第二篇)
目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外,今天我们来掌握一些新的知识就是数组与指针,第一个对数组名的了解ÿ…...
![](https://i-blog.csdnimg.cn/direct/eddd6982ea1c49d4a9bd96b482a37af9.png#pic_center)
AIGC-ToonCrafter: Generative Cartoon Interpolation
论文:https://arxiv.org/pdf/2405.17933 代码:https://doubiiu.github.io/projects/ToonCrafter 给定首尾帧,生成逼真生动的动画 MOTIVATION Traditional methods which implicitly assume linear motion and the absence of complicated phenomena like disoccl…...
![](https://www.ngui.cc/images/no-images.jpg)
牛奶供应(三)
一个字贪,第一天,只能选择制作方式,后面的每一天,在<今天制作>与<前期存储>之间取更优解 例如样例:100 5,200 5,90 20,存储成本为10 第1天: 一定是制作&…...
![](https://i-blog.csdnimg.cn/direct/dd08ae06f01c44eeba2929406fb5501a.jpeg#pic_center)
首批通过 | 百度通过中国信通院H5端人脸识别安全能力评估工作
2024年5月,中国信息通信研究院人工智能研究所依托中国人工智能产业发展联盟安全治理委员会(AIIA)、“可信人脸应用守护计划”及多家企业代表共同开展《H5端人脸识别线上身份认证安全能力要求及评估方法》的编制工作,并基于该方法开…...
![](https://i-blog.csdnimg.cn/direct/cd4e4e85b1ae40aa8528cd027dda4d55.png)
JVM---对象是否存活及被引用的状态
1.如何判断对象是否存活 1.1 引用计数算法 概念:在对象头部增加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。 优点࿱…...
![](https://i-blog.csdnimg.cn/direct/9d8f8de0c49a4650b8d2839af07b7245.png)
科研绘图系列:R语言分割小提琴图(Split-violin)
介绍 分割小提琴图(Split-violin plot)是一种数据可视化工具,它结合了小提琴图(violin plot)和箱线图(box plot)的特点。小提琴图是一种展示数据分布的图形,它通过在箱线图的两侧添加曲线来表示数据的密度分布,曲线的宽度表示数据点的密度。而分割小提琴图则是将小提…...
![](https://img-blog.csdnimg.cn/img_convert/7100aa42f19bd972ec00ba2cad370a60.png)
WEB前端09-前端服务器搭建(Node.js/nvm/npm)
前端服务器的搭建 在本文中,我们将介绍如何安装和配置 nvm(Node Version Manager)以方便切换不同版本的 Node.js,以及如何设置 npm(Node Package Manager)使用国内镜像,并搭建一个简单的前端服…...
![](https://www.ngui.cc/images/no-images.jpg)
ASP.NET Core在启动过程中使用数据库实例的几种方式
ASP.NET Core项目启动过程中若要调用SqlSugarClient实例操作数据库数据(假设操作函数如下),特此记录以下几种方式: public class PublicDataBuffer {public static List<EnvironmentRecord> DataBuffer new List<Envir…...
![](https://i-blog.csdnimg.cn/direct/2c962b73ebef434b82ee78ed8315cc63.png)
AndroidStudio 编辑xml布局文件卡死问题解决
之前项目编写的都是正常,升级AndroidStudio后编辑布局文件就卡死,还以为是AndroidStudio文件。 其实不然,我给整个项目增加了版权声明。所以全部跟新后,布局文件也增加了版权声明。估计AndroidStudio在 解析布局文件时候因为有版…...
![](https://i-blog.csdnimg.cn/direct/3436d67ffe884af9b6615180bfe0ba67.png)
使用 PVE 自签 CA 证书签发新证书
前言 PVE 安装时会自动创建一个有效期 10 年的 CA 证书, 我们可以利用这个 CA 证书给虚拟机中的 Web 应用签发新的 TLS 证书用于提供 HTTPS 服务. 下面以 PVE 虚拟机中通过 Docker 跑的一个 雷池 应用为例进行演示. PVE 证书位置 官方文档: https://pve.proxmox.com/wiki/Pr…...
![](https://www.ngui.cc/images/no-images.jpg)
ubuntu 22.04安装Eigen
1 安装 git clone https://gitlab.com/libeigen/eigen.gitcd eigen mkdir build cd build cmake ..sudo make install... -- Installing: /usr/local/include/eigen3/unsupported/Eigen/CXX11/src/TensorSymmetry -- Installing: /usr/local/include/eigen3/unsupported/Eige…...
![](https://i-blog.csdnimg.cn/direct/3da2fe9761ee414c94d2dbdaeabb7cf5.png)
vue使用audio 音频实现播放与关闭(可用于收到消息给提示音效)
这次项目中因为对接了即时通讯 IM,有个需求就是收到消息需要有个提示音效,所以这里就想到了用HTML5 提供的Audio 标签,用起来也是很方便,首先让产品给你个提示音效,然后你放在项目中,使用Audio 标签&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
STM32 产生Hard Fault 调试方法
STM32 产生hard-fault 调试方法 需求 当STM32 产生Hard Fault的时候我们希望可以打印出一些重要的寄存器信息,然后定位代码出错的地方。 参考 https://github.com/ferenc-nemeth/arm-hard-fault-handler 原理 STM32代码运行的时候一般在是main函数while(1)中循…...
![](https://i-blog.csdnimg.cn/direct/47804bdf6a7d43e6876b5f9d618d4971.png)
java-selenium 截取界面验证码图片并对图片文本进行识别
参考链接 1、需要下载Tesseract工具并配置环境变量,步骤如下 Tesseract-OCR 下载安装和使用_tesseract-ocr下载-CSDN博客 2、需要在IDEA中导入tess4j 包;在pom.xml文件中输入如下内容 <!--导入Tesseract 用于识别验证码--><dependency>&l…...
![](https://i-blog.csdnimg.cn/direct/2d47b364e7d94c6f82cc59a8ba10a8ff.png)
【Linux】进程信号 --- 信号产生
👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…...
![](https://www.ngui.cc/images/no-images.jpg)
Docker 容器中的 Docker Compose 简介
Docker Compose是什么 Docker Compose是一个用于定义和运行多个Docker容器的工具。它是Docker官方提供的开源项目,用于实现对Docker容器集群的快速编排。通过Compose,开发者可以使用YAML文件(通常是docker-compose.yml文件)来配置…...
![](https://www.ngui.cc/images/no-images.jpg)
手机日历如何与Outlook同步
有很多人和我一样遇到手机日历与Outlook同步问题,如新版outlook与小米日历的同步问题 - Microsoft Community,outlook账号无法在手机端自带的电子邮件App以exchange模式登录 - Microsoft Community,在安卓手机端无法电子邮件App以exchange模式…...
![](https://img-blog.csdnimg.cn/direct/709ae3d152dd4f018891cb4af1597b96.png)
python基础语法 007 文件操作-1读取写入
1 文件操作 1.1 什么时候用文件操作? 打开文档写东西看东西拿文档做统计 在python 文档操作作用 存储数据读取数据 打开文件有什么用? 读取数据,写入数据不管什么数据都可以用open打开,如可复制一张图片 1.2 open() 读取,…...
![](https://i-blog.csdnimg.cn/direct/7dfd3330aec14e1fb1914ce56c295a98.webp)
C语言·函数(超详细系列·全面总结)
前言:Hello大家好😘,我是心跳sy,为了更好地形成一个学习c语言的体系,最近将会更新关于c语言语法基础的知识,今天更新一下函数的知识点,我们一起来看看吧! 目录 一、函数是什么 &a…...
![](https://i-blog.csdnimg.cn/direct/797afba09cf744b8a9f16d3e046d26a3.png)
Windows及Linux系统加固
君衍. 一、Windows加固1、配置简介2、账户配置3、本地配置4、安全设置 二、Linux加固1、配置简介2、网络配置3、日志和审计配置4、访问认证和授权配置5、系统运维配置 一、Windows加固 1、配置简介 通常在Windows安全配置中有两类对象 一类是Windows Server,如win …...
![](https://i-blog.csdnimg.cn/direct/585df72f29d44623b3bdbc5c3385251b.png)
Postman安装使用教程(详解)
目录 一、Postman是什么 二、安装系统要求 三、下载Postman 四、注册和登录Postman 五、创建工作空间 六、创建请求 一、Postman是什么 在安装之前,让我们先来简单了解一下Postman。Postman是一个流行的API开发工具,它提供了友好的用户界面用于发送…...
![](https://i-blog.csdnimg.cn/direct/2b45ca99b39549ed9716e7d209539e45.png)
【嵌入式开发之标准I/O】文件I/O的基本概念,打开、关闭、定位函数及实例
文件I/O和标准I/O 什么是文件I/O?什么是标准I/O? 文件I/O:文件I/O又称系统IO,系统调用,称之为不带缓存的IO(unbuffered I/O)。是操作系统提供的API接口函数。不带缓存指的是每个read,write都调用内核中的一个系统调…...
![](https://www.ngui.cc/images/no-images.jpg)
C++文件操作-文本文件-读文件
第一种 #include<iostream>//1、包含头文件 fstream #include<fstream> using namespace std;void test01() {//2、创建流对象ifstream ifs;//3、打开文件 并且判断是否打开成功ifs.open("test.txt", ios::in);if (!ifs.is_open()){cout << "…...
![](/images/no-images.jpg)
企石网站建设/制作网站要找什么公司
Python中的代码简化: 1. 赋初值: a, b, c 0, 1, 12. if-else 简写: i 1 if s[0] or s[0]- else 03. if-else-for 简写: nums[0 if i0 else i for i in nums]C语言中的代码简化: 1. if-else 简写: i…...
![](https://www.oschina.net/img/hot3.png)
企业网关/郑州网站优化seo
2019独角兽企业重金招聘Python工程师标准>>> 1.右击计算机-属性-高级系统设置-高级-环境变量,弹出“环境变量”对话框,主要是改下面的环境变量,不是上面的Administrator。(不然其他用户还得自己配) 添加JA…...
![](http://file.elecfans.com/web1/M00/51/D0/o4YBAFsPUJmAW178AACQi3MnT2A448.png)
本地旅游网站模版/公司网站推广方法
python神器 Jupyter Notbook 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。 Jupyter Notebook官方 简而言之,Jupyter Notebook是以网页的形式打开,可以在网页页面…...
![](https://img-blog.csdnimg.cn/img_convert/258d3e361449fae8422daa19973de029.png)
外贸网站开发定制/南京百度网站推广
阿里妹导读:在电子商务中,品牌在用户对商品做点击、购买选择正起着越来越重要的作用,部分原因是用户现在越来越关注商品的质量,而品牌是商品质量的一个保证。 但是,现有的排序系统并不是针对用户对品牌的偏好设计的。某…...
![](/images/no-images.jpg)
新民电子网站建设哪家好/合肥seo公司
剑指 Offer 11. 旋转数组的最小数字 class Solution {public int minArray(int[] numbers) {//面试-->二分思路//注意:将中点值和最右边的边界进行比较,因为这样才能判断出中点值是在左边排序数组还是右边排序数组//目的:找到右边排序数组…...
![](/images/no-images.jpg)
python可以做网站/大地seo视频
一个合格的前端工程师应该具备怎样的能力?下面和千锋广州小编一起来看看吧。 1、学习新技术的能力 无论你是一个入坑多年的老鸟还是刚刚入坑的菜鸟,心里都明白,前端技术的更新真的不是一般的快啊。如果想要做好前端开发这项工作,…...