websocket协议

2023-11-19

WebSocket是一种在Web应用程序中实现实时双向通信的协议,一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

WebSocket 与 HTTP/2 一样,其实都是为了解决 HTTP/1.1 的一些缺陷而诞生的,而 WebSocket 针对的就是 请求-应答 这种"半双工"的模式的通信缺陷。

请求-应答 是"半双工"的通信模式,数据的传输必须经过一次请求应答,这个完整的通信过程,通信的同一时刻数据只能在一个方向上传递。它最大的问题在于,HTTP 是一种被动的通信模式,服务端必须等待客户端请求才可以返回数据,无法主动向客户端发送数据。

那在 WebSocket 出现之前,一些对实时性有要求的服务,通常是基于轮询(Polling)这种简单的模式来实现。轮询就是由客户端定时发起请求,如果服务端有需要传递的数据,可以借助这个请求去响应数据。轮询的缺点也很明显,即是有大量空闲的时间,是在反复发送无效的请求,这显然是一种资源的损耗。

就可以简单当成 HTTP1.1是单向通信的websocket是双向通信的

想要在浏览器中实现双向通信,所以才有websocket。

而HTTP/2是支持双向通信的,其是在websocket后才出现的。

其如何使用c++去编写一个websocket服务器端程序,可以详细看这篇文章21.添加websocket模块

1. WebSocket的工作流程

WebSocket的流程可以分为三个阶段:握手、数据传输和断开连接。

1.1 握手

客户端发起WebSocket连接时,通过向服务器发送一个特殊的HTTP请求头来建立连接。服务器检查请求头中的特定字段,确认支持WebSocket协议后,发送特殊的HTTP响应头进行握手确认。握手成功后,双方建立了WebSocket连接,可以进行后续的数据传输。

客户端发送的握手请求

请求行中的请求方法必须是GET, HTTP版本至少是1.1
请求必须含有Connection, 其值必须含有"Upgrade"记号
请求必须含有Upgrade, 其值必须含有"websocket"关键字
请求必须含有Sec-Websocket-Version, 其值必须是13
请求必须含有Sec-Websocket-Key, 用于提供基本的防护, 比如无意的连接

服务端收到客户端握手连接的回复

响应行: HTTP/1.1 101 Switching Protocols
响应必须含有Upgrade, 其值为"weboscket"
响应必须含有Connection, 其值为"Upgrade"
响应必须含有Sec-Websocket-Accept, 根据请求头部的Sec-Websocket-key计算出来。

这个计算是有通过SHA1计算出摘要, 并转成base64字符串的。这个过程可以不用了解,我们是直接调用函数去获取结果的。

1.2 数据传输

一旦建立了WebSocket连接,客户端和服务器可以通过该连接进行双向的实时数据传输。双方可以发送和接收消息,消息以帧的形式进行传输。WebSocket协议定义了不同类型的帧,如文本帧和二进制帧,用于传输不同类型的数据。

1.3 断开连接

当连接不再需要时,客户端或服务器可以发起关闭连接的请求。双方会交换特殊的关闭帧,以协商关闭连接,并确保双方都接收到了关闭请求。

2.websocket协议解析

  • FIN: 占1bit
    • 0表示不是消息的最后一个分片
    • 1表示是消息的最后一个分片(一般情况是用1的,表示不分包,也好处理)
  • RSV1, RSV2, RSV3: 各占1bit, 一般情况下全为0, 与Websocket拓展有关, 如果出现非零的值且没有采用WebSocket拓展, 连接出错
  • Opcode: 占4bit
    • %x0: 表示本次数据传输采用了数据分片, 当前数据帧为其中一个数据分片
    • %x1: 表示这是一个文本帧
    • %x2: 表示这是一个二进制帧
    • %x3-7: 保留的操作代码, 用于后续定义的非控制帧
    • %x8: 表示连接断开
    • %x9: 表示这是一个心跳请求(ping)
    • %xA: 表示这是一个心跳响应(pong)
    • %xB-F: 保留的操作代码, 用于后续定义的非控制帧
  • Mask: 占1bit
    • 0表示不对数据载荷进行掩码操作, 1表示对数据载荷进行掩码操作
  • Payload length: 占77+167+64bit
    • 0~125: 数据长度等于该值
    • 126: 后续的2个字节代表一个16位的无符号整数, 值为数据的长度
    • 127: 后续的8个字节代表一个64位的无符号整数, 值为数据的长度
  • Masking-key: 占0或4bytes
    • 1: 携带了4字节的Masking-key
    • 0: 没有Masking-key
  • payload data: 载荷数据

注意的点

1.Fin为0,表示一个完整的消息被分片成多个数据帧进行传输的,需要一直等待接到Fin为1的数据帧之后,才算收到一个完整的消息。
2.只有客户端给服务器端发送数据时才会有masking key,服务器端给客户端发送数据不需要masking key。

3.若payload length占用了多个字节的话,payload length需要进行转序操作(网络序<->主机序)。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

websocket协议 的相关文章

  • NodeJS 中的客户端 websocket 证书

    我有一个 NodeJS websocket 客户端应用程序 使用ws https www npmjs com package ws https www npmjs com package ws 这个 NodeJS 应用程序作为客户端连接到
  • 如何在 ASP.NET Core RC2 中制作 websocket 服务器?

    我使用 Microsoft AspNetCore WebSockets Server 0 1 0 rc2 final 制作 websocket 服务器 但不起作用 在rc1中 它是1 0 0 rc1 final 并且工作正常 这是我的代码
  • 如何在目标站点上抓取通过 websocket 传输的 JSON 数据

    我被要求抓取一个通过 websockets 接收数据然后通过 javascript jquery 将其呈现到页面的网站 是否可以绕过中间人 DOM 并使用 抓取通过套接字传入的数据 对于像 phantomJS 这样的无头 webkit 来说
  • TCP 套接字到 Websocket?

    那里有很多 websocket gt 套接字包装器 比如网络套接字 https github com kanaka websockify 但是有相反的可用吗 具体来说 我希望能够使用应用程序连接到 TCP 套接字 并将代理转换为 webso
  • Node.js ws 包上的正确错误处理

    我正在努力将基于 REST 的数据管道替换为基于 Websocket 的数据管道 但我无法找到所有可能出错的地方 该系统是生产系统 因此如果出现故障并且无法恢复 将会发生非常糟糕的情况 这是我到目前为止所得到的 客户端 let server
  • Elastic Beanstalk 剥离 Sec-WebSocket-Accept 标头

    我正在尝试让 NET Core 应用程序在 elastic beanstalk 上运行 以从浏览器中的 javascript 接收 websockets 连接 当我在本地计算机上测试 AWS 之外的客户端和服务器时 我能够在两者之间建立 W
  • NodeJS Websocket如何在服务器重新启动时重新连接

    在 Node js 中我使用网络套接字 ws https github com websockets ws用于 WebSocket 连接 以下是客户端的代码 假设我们正在连接的服务器套接字宕机了一分钟 close 事件将会触发 但是每当服务
  • django 中的实时通知/聊天

    我现在正在用 django 制作一个网站 我想实现一个实时通知功能 就像 facebook 或 SE 上的那样 我做了一些研究 似乎虽然有两种选择 ajax 长轮询和 websockets 但后者是最佳选择 然而 正如你所知 websock
  • Play框架2.5.0 Websockets示例[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 播放框架 2 5 0 Websockets 示例 在 play 2 5 0 websockets 代码
  • 如何使用 Scarlet 在 Android 上通过 WebSocket 进行连接?

    README md 中的代码 val scarletInstance Scarlet Builder webSocketFactory okHttpClient newWebSocketFactory GDAX URL addMessage
  • 通过 WebSocket 发送 ArrayBuffer 的子段而不进行复制

    我正在填充一个ArrayBuffer与要通过发送的数据WebSocket 数据具有可变大小 因此在序列化时我动态扩展ArrayBuffer如所须 然而 当序列化过程完成时 我经常在缓冲区末尾有未使用的空间 我不想发送这些空间 可以将所需部分
  • WebSocket 握手:意外响应代码:404

    正在编写我的第一个 websocket 程序并且正在得到 WebSocket 握手 意外响应代码 404 加载网页时出错 我使用的是 JDK 1 7 和 jboss 8 wildfly8 0 有人可以帮忙吗 window onload in
  • GO Websocket 向所有客户端发送消息

    这段代码一切正常 为了更好的阅读而缩短了它 When Client1向服务器发送请求 服务器立即响应他 但是 其他客户端看不到响应消息 所以我想更进一步 当客户端向服务器发送请求时 服务器会响应所有客户端 以便所有客户端都可以看到该消息 我
  • 仅针对使用通道而定制的 Phoenix 应用程序如何在多台机器上扩展?使用HAProxy?如何向所有节点广播消息?

    我将节点应用程序纯粹用于带有 Redis PubSub 的 socket io 通道 目前我将其分布在 3 台机器上 并由其中一台机器上的 nginx 负载平衡提供支持 我想用 Phoenix 应用程序替换这个节点应用程序 而且我对 erl
  • WebSocket 和负载平衡是瓶颈吗?

    当有一堆充当 WebSocket 无人机的系统和这些无人机前面的负载均衡器时 当 WebSocket 请求进入 LB 时 它会选择一个 WebSocket 无人机 并建立 WebSocket 我在 ELB 上使用 AWS ELB tcp S
  • websocket 订阅服务器不工作。无法到达订阅服务器 graphql-ws ws

    我遵循 相同的文档代码 1 使用websocket graphql创建订阅服务器 但它不适用于graphql ws和ws 当我删除 serverCleanup 定义时 代码有效 并且它也适用于旧的订阅库 subscription trans
  • 在cypress中捕获websocket请求

    我试图捕获测试期间发生的所有请求 我的应用程序使用 WebSocket 并且使用拦截命令我无法捕获 wss 请求 有什么办法可以做到这一点吗 我认为拦截命令不能直接捕获网络套接字 一种方法是观察 ws 通信的结果 如下所示使用 Cypres
  • 客户端如何获取session id? (网络套接字)

    有什么办法可以做到这一点吗 客户端 function connectWebSocket var socket new SockJS socket stompClient Stomp over socket stompClient conne
  • 使用 Netty 将 websocket 与在 tomcat 中运行的 Spring Web 应用程序集成

    我有一个使用 Netty 的 Web 套接字服务器实现 例如监听端口 8081 和一个在 Tomcat 中运行的单独的 Spring Web 应用程序 在端口 80 中运行 我想以某种方式将所有来自 localhost 80 Websock
  • iOS 中通过 USB 进行反向端口转发

    我在桌面上有一个 Web 套接字服务器 在 iPhone 设备上有一个客户端 我想使用 USB 而不是任何网络与他们通信 我已经使用 adb reverse 在 android 上实现了它 但无法找到适用于 iOS 的任何解决方案 我尝试使

随机推荐

  • C语言实现的贪吃蛇(无EasyX,详解)

    前言 或许厌倦了枯燥的做题 那就学学贪吃蛇 激发你的学习乐趣吧 你将进一步加深对结构体 单链表 函数 循环等基础的理解 希望对你有所帮助 纯C实现的贪吃蛇 前言 代码效果 视频 学习新函数 让你的代码变得 高大上 任意位置输出 重点注意事项
  • SaveRenderTextureToPNG保存贴图到本地

    将RenderTexture保存成一张png图片 public bool SaveRenderTextureToPNG RenderTexture rt string contents string pngName RenderTextur
  • Nginx-内存池

    系列文章目录 Nginx资源目录简介 第一章 Nginx学习入门之内存池分析 文章目录 系列文章目录 Ngxin内存池简介 一 nginx内存池结构体 二 使用步骤 1 Ngix 内存池原理 内存作用范围 总结 Ngxin内存池简介 Ngi
  • maven 教程

    Maven项目管理 Maven是什么 Maven是Apache下的项目管理工具 它由纯Java语言开发 可以帮助我们更方便的管理和构建Java项目 为什么要使用Maven jar包管理 从Maven中央仓库获取标准的规范的jar包以及相关依
  • 故障:fork failed:Resource Temporarily Unavailable解决方案

    故障 fork failed Resource Temporarily Unavailable解决方案 在一次crontab bkapp txt导入N多定时任务时候 该用户无法执行任何命令 再ssh连报fork failed Resourc
  • oVirt快速安装指南

    介绍 此文档是针对第一次安装使用oVirt的用户 带领你们逐步完成oVirt的安装 基本环境设置和安装虚拟机 css 系统需求 下面介绍的系统要求只适合典型的中小规模环境的安装 若是对于安装 系统规划和负载均衡有特殊要求的用户 也可使用下面
  • 如何看待中小企业实现数字化转型难的问题?_光点科技

    中小企业在今天的商业环境中扮演着至关重要的角色 它们为就业创造了大量机会 促进了创新 支持了经济增长 然而 中小企业在数字化转型方面面临着许多挑战 这些挑战使得实现数字化转型变得困难 资源限制 中小企业通常拥有有限的资金和人力资源 这使得数
  • Onvif协议学习:12、修改分辨率

    Onvif协议学习 12 修改分辨率 文章目录 Onvif协议学习 12 修改分辨率 1 原理简介 2 函数接口 3 编码流程 4 示例代码 原文链接 https blog csdn net benkaoya article details
  • fc2 php,fc2fans_club.py

    import re from lxml import etree need install import json import ADC function def getTitle htmlcode 获取厂商 print htmlcode
  • 简单看看TypeScript、C# 和 Delphi 这三种编程语言

    TypeScript C 和 Delphi 是三种不同的编程语言 它们都有自己的特点和适用领域 在本篇博客中 我们将对这三种语言进行比较和介绍 分析它们的共同点和区别 TypeScript 是由微软公司的 Anders Hejlsberg
  • xctf-supersqli

    xctf supersqli 堆叠注入 一 堆叠注入 本次采用的靶场xctf的supersqli 一 堆叠注入 进入靶场 发现一个提示框 先随便点一下提交 发现输出了些东西 输入1 判断存在注入点 分别输如1 1 1 2 判断为单引号注入
  • MatConvNet 框架的mnist实例

    mnist 手写是被 cnn mnist m 主函数代码 function net info cnn mnist varargin 主函数 cnn mnist 功能 1 初始化CNN 2 设置各项参数 3 读取和保存数据集 4 初始化tra
  • (图像变换)Python-opencv,(批处理笛卡尔坐标系,也就是平时咱们看到的正常图片)二维彩色图像转化为极坐标系下的图像

    这个其实代码量不大 但对于我这个啥也编不出来的废柴来说我觉得真的好不容易 历经两天的痛苦折磨 终于完成了 下面进入正题 昨天我找了一天代码 然后挑挑拣拣也就找到一篇还是c 的图像极坐标化处理 代码如下 include
  • linux查看显卡型号p4卡或者t4卡_NVIDIA Tesla GPU系列P4、T4、P40以及V100参数性能对比...

    NVIDIA Tesla系列GPU适用于高性能计算 HPC 深度学习等超大规模数据计算 Tesla系列GPU能够处理解析PB级的数据 速度比使用传统CPU快几个数量级 NVIDIA Tesla GPU系列P4 T4 P40以及V100是Te
  • substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。

    tableData sbsj result sbsj substr 0 result sbsj indexOf
  • 使用JDBC操作数据库

    导包 数据库驱动包 msql connector java 1 掌握JDBC连接数据库 1 1 JDBC 流程图 mermaid svg oRZnGw9oql7DhsSu label font family trebuchet ms ver
  • 数据结构与集合之(1)ArrayList 与 Arrays

    数据结构是指逻辑意义上的数据组织方式及其处理方式 从 直接前驱 和 直接后继 个数的维度来看 大体可以将数据结构分为以下四类 1 线性结构 0 至 1 个直接前驱 和 直接后继 线性结构包括 顺序表 链表 栈 队列等 2 树结构 0 至 1
  • 【python数据分析(22)】Matplotlib库绘图的图表样式参数(linestyle、marker、color、style)

    1 linestyle线条参数 默认是导入了相关的库 这里的代码就不再显示了 solid line style 实线样式 dashed line style 虚线样式 dash dot line style 虚点线样式 dotted lin
  • TP6框架--CRMEB学习笔记:项目初始化+环境配置

    这里给大家分享我在网上总结出来的一些知识 希望对大家有所帮助 最近在研究一个基于TP6的框架CRMEB 这里分享下我的开发心得 首先要获取原始项目文件 这里是git地址 https gitee com ZhongBangKeJi CRMEB
  • websocket协议

    WebSocket是一种在Web应用程序中实现实时双向通信的协议 一种在单个TCP连接上进行全双工通信的协议 它使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 WebSocket 与 HTTP 2 一样 其实都