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

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的报文如下:

客户端发送关闭帧报文如下:

服务端发送关闭帧报文如下:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关于正运动学解机器人手臂算法
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信
  • 海外社媒矩阵为何会被关联?如何IP隔离?
  • 学懂C语言(十五):C语言递归函数在实际应用中的要点,关键点
  • Diffusion大模型
  • 生成式 AI 的发展方向:Chat 和 Agent 的有机结合
  • 【Docker】Docker Desktop - WSL update failed
  • 粘包问题、mmap和分片上传
  • spring整合mybatis,junit纯注解开发(包括连接druid报错的所有解决方法)
  • [web]-反序列化-base64
  • 嵌入式C++、STM32、树莓派4B、OpenCV、TensorFlow/Keras深度学习:基于边缘计算的实时异常行为识别
  • 如何使用“Claude Artifact”来生成前端代码
  • 智慧旅游的新引擎:景区客服呼叫中心系统的建设与运营
  • 解决fastjson不输出空字符串、null/设置显示fastjson空值也显示
  • springSecurity学习之springSecurity过滤web请求
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【刷算法】从上往下打印二叉树
  • 03Go 类型总结
  • E-HPC支持多队列管理和自动伸缩
  • JavaScript对象详解
  • Java比较器对数组,集合排序
  • JS基础之数据类型、对象、原型、原型链、继承
  • Linux后台研发超实用命令总结
  • Rancher-k8s加速安装文档
  • 排序算法之--选择排序
  • 区块链将重新定义世界
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 仓管云——企业云erp功能有哪些?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​第20课 在Android Native开发中加入新的C++类
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #每天一道面试题# 什么是MySQL的回表查询
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (09)Hive——CTE 公共表达式
  • (2)空速传感器
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (SERIES12)DM性能优化
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (力扣)循环队列的实现与详解(C语言)
  • (五)关系数据库标准语言SQL
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转) Face-Resources
  • (转)我也是一只IT小小鸟
  • .net 无限分类
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET单元测试
  • .net访问oracle数据库性能问题
  • .net中生成excel后调整宽度