【网络】WebSocket协议详解

WebSocket协议详解

  • 一 、WebSocket 诞生背景
  • 二、WebSocket 特点
  • 三、WebSocket 的握手环节
  • 四、WebSokect 的数据格式
    • 1、 第一个字节
    • 2、第二个字节
    • 3、Masking-key
    • 4、playload Data
    • 5、一些注意细节

WebSocket 的官方文档
WebSocket 的中文文档(非官方)

一 、WebSocket 诞生背景

在互联网早期,HTTP(超文本传输协议)因其简单易用和功能强大而广受欢迎,成为了互联网通信的基石。然而,随着互联网的快速发展和网络安全、隐私保护需求的日益增长,HTTP逐渐显露出一些局限性,比如缺乏数据加密、身份验证和会话管理等安全特性。为了克服这些限制,HTTP的扩展和替代方案应运而生,其中最著名的就是HTTPS(安全超文本传输协议)

HTTPS 解决了数据安全的问题,但是 HTTP 协议还有其他的缺陷:HTTP链接的半双工的,而且通信只能由客户端发起,服务端无法将数据主动推送给客户端

为了解决这个问题WebSocket协议出现了(2008年),并在2011年成为国际标准。

扩展

  • 在早期没有WebSocket时,HTTP 协议为了实现推送技术,所用的技术都是轮询,由浏览器每隔一段时间向服务器发出 HTTP请求,然后服务器返回最新的数据给客户端。
  • 轮询方式分为轮询与长轮询,具体的细节可以参考这篇文章:轮询与长轮询

二、WebSocket 特点

WebSocket 特点:

  1. WebSocket是基于TCP 协议的。

  2. WebSocket链接是全双工的,客户端和服务端都可以主动发送数据给对方。

  3. WebSocket的协议标识符是ws(如果加密,则为wss),服务器网址就是 URL

// http协议
http://example.com
https://example.com// WebSocket协议
ws://example.com
wss://example.com
  1. WebSocketHTTP 协议有着良好的兼容性。默认端口也是80和443(wss)。

  2. WebSocket在连接建立阶段需要进行一次 HTTP 握手,在握手完毕以后会从HTTP协议升级到WebSocket 协议

  3. WebSocket数据格式比较轻量,性能开销小,通信高效,发送的数据可以发送文本,也可以是二进制数据。

三、WebSocket 的握手环节

首先Websocket是借用了HTTP的协议来完成握手的。
我们来看个典型的 Websocket 握手

  • 客户端
GET / HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13
Origin: http://example.com

这是一段经典的HTTP格式的报文,我来讲解一下这里面一些重要字段的作用:

  • Upgrade : 这个头部用于表明客户端希望服务器升级当前的连接到一个更高版本的协议。由于这里我们要使用WebSocket 所以这里我们设置为 "websocket"

  • Connection: 这个头部用来指定当前连接应该被升级,并且通常与 Upgrade 头部一起使用。它的值通常设置为 "Upgrade",表示客户端请求将连接升级到由 Upgrade 头部指定的新协议。

  • Sec-WebSocket-Key: 这个字段不是HTTP的标准字段,而是 WebSocket 协议特定的字段。它是在 WebSocket 握手过程中使用的,这个字段包含一个随机生成的字符串,用于生成最终的握手密钥,验证客户端和服务器之间的连接安全。

  • Sec-WebSocket-Version: 这个字段也不是HTTP的标准字段,它用来指明WebSocket 的协议版本。


  • 服务端
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

这里的 101 Switching Protocols 状态码表示服务器准备切换到WebSocket协议。UpgradeConnection 头部再次出现以确认协议升级。

  • Sec-WebSocket-Accept 是服务器根据客户端的Sec-WebSocket-Key 计算出来的值,这些字段确保了 WebSocket 连接的安全性。

这里是具体的步骤:

  1. 客户端生成一个随机字符串,并将其放在 Sec-WebSocket-Key 头部中。
  2. 客户端将此字符串发送给服务器。
  3. 服务器接收到此字符串后,将其与 '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' 这个固定的 GUID 结合,并进行 SHA-1 哈希运算。
  4. 服务器将得到的哈希值进行 Base64 编码,并将结果放在 Sec-WebSocket-Accept 头部中返回给客户端。
  5. 客户端验证 Sec-WebSocket-Accept 中的值是否正确,以确认握手成功。

四、WebSokect 的数据格式

握手成功以后,双方通信都会采用WebSocket进行通信,所以接下来让我们一起来看一看WebSokect 的数据格式:

在这里插入图片描述

1、 第一个字节

  • FIN: 占1bit
    • FIN=1:表示当前帧是消息的最后一部分,即该帧之后没有其他帧属于同一消息。这意味着当接收方收到FIN=1的帧时,可以认为整个消息已经完整接收,无需再等待后续帧。
    • FIN=0:表示当前帧不是消息的最后一部分,即该帧之后还有更多的帧属于同一消息。接收方在收到FIN=0的帧时,需要继续接收后续的帧,直到遇到FIN=1的帧为止。

当消息较大,无法在一个帧中完全传输时,就需要进行分片处理。在这种情况下,除了最后一个帧外,其他所有帧的FIN字段都将被设置为0,以指示这些帧只是消息的一部分。而最后一个帧的FIN字段将被设置为1,以指示消息的结束。这种方式确保了接收方能够正确地重组分片消息,并恢复出原始的消息内容。
(这里类似与IP层的分片)

  • RSV1, RSV2, RSV3: 各占1bit, 一般情况下全为0, 这些字段与Websocket拓展有关, 如果出现非零的值且没有采用WebSocket拓展, 会导致连接出错。

  • Opcode: 占4bit,描述了WebSocket 有关的一些操作指示

    • 0x0: 表示本次数据传输采用了数据分片, 当前数据帧为其中一个数据分片
    • 0x1: 表示这是一个文本帧
    • 0x2: 表示这是一个二进制帧
    • 0x3-7: 保留的操作代码, 用于后续定义的非控制帧
    • 0x8: 表示连接断开
    • 0x9: 表示这是一个心跳请求(ping)
    • 0xA: 表示这是一个心跳响应(pong)
    • 0xB-F: 保留的操作代码, 用于后续定义的非控制帧

pingpong 这两个标志和WebSocket的心跳机制有关。

  • 为了保持 WebSocket 稳定的长连接,在连接建立之后,服务器和客户端之间通过心跳包来保持连接状态,以防止连接因为长时间没有数据传输而被切断。
  • 这两个是一种特殊的数据包,不包含任何实际数据,仅用来维持连接状态,是一个空数据帧定期发送,确保链接仍然有效,避免长时间没有数据传输而被中断如果一段时间内没有收到对方的心跳包,就可以认为连接已经断开。

2、第二个字节

  • Mask: 占1bit

    • 0表示不对数据载荷进行掩码异或操作
    • 1表示对数据载荷进行掩码异或操作。
  • Payload length: 表示的是有效载荷的长度,这个字段的长度的可变的,最小占据7个bit位,或7+16或7+64bit

    • 0~125: 数据长度在此区间内时,Payload Length 是7 个bit 位。
    • 126: 数据长度等于此值时,Payload Length 是7 + 16 个bit 位。
    • 127: 数据长度大于等于此值时,Payload Length 是7 + 16 + 48个bit 位。

3、Masking-key

Masking-key掩码值,如果Mask字段被设置为1,那么Masking-key 就占用4bytes,否则不存该字段。这个字段主要用来对数据进行加密。

4、playload Data

payload data: 载荷数据,如果没有设置Mask字段,这里的数据可以直接使用,如果设置了Mask字段,这里的数据还需要解除掩码之后才可以直接使用。

5、一些注意细节

  • WebSocket协议要求客户端所发送的帧必须掩码,掩码的密钥是一个32位的随机值。所有数据都需要与掩码做一次异或运算。帧头在第二个字节的第一位表示该帧是否使用了掩码。

  • WebSocket服务器接收的每个载荷在处理之前首先需要处理掩码,解除掩码之后,服务器将得到原始消息内容。

  • WebSocket协议中,当服务器收到一个没有掩码的帧时,服务器必须丢弃这个消息,并且关闭服务器连接。同时服务器端给客户端发送的所有帧都是不含有掩码的,如果客户端检测到掩码的帧时,也一样必须丢弃该报文并且关闭连接。

  • 根据上面的数据格式可以知道最小的WebSocket 数据报文是两个字节的数据,不含有任何有效载荷(心跳包即使如此)。

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

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

相关文章

进阶SpringBoot之 Shiro(2)环境搭建

Spring Boot 创建 Web 项目&#xff0c;pom.xml 导入 Thymeleaf 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> resources 目录下 templates 包新…

tomcat 相关

使用内置JDK jdk免配置环境变量&#xff0c;内置tomcat里面启动_64位自带1.8jdk tomcat,无需配置环境变量直接启动-CSDN博客 乱码&#xff1a; 打开tomcat文件下的conf文件&#xff0c;打开logging.properties文件&#xff1b; 然后java.util.logging.ConsoleHandler.encod…

WiFi标签注册(电脑版)

安装WiFi-Tool工具 需要windows系统电脑并且有WiFi功能 下载软件安装包&#xff1a;http://a.picksmart.cn:8088/picksmart/app/WiFi-Tool-Setup-V1.0.37.zip 配置操作流程 登录WiFi标签管理系统到设备管理-产品管理&#xff0c;复制“产品ApiKey”参数&#xff0c;打开“WiFi-…

ip地址变化是什么意思?手机地址ip一直变化怎么办

IP地址作为互联网设备的唯一标识&#xff0c;‌其稳定性对于网络连接至关重要。‌然而&#xff0c;‌手机IP地址频繁变动可能带来一系列问题。‌本文将深入探讨IP地址变化的含义、‌IP地址频繁变动的原因&#xff0c;‌以及提供手机地址IP一直变化的有效应对策略。‌ 一、IP地址…

当AI遇上制药:加速跑向未来的快车道,还是布满荆棘的征途?

01 在全球科技领域&#xff0c;AI的崛起无疑掀起了一场变革的风暴&#xff0c;其影响力已渗透至各行各业&#xff0c;促使各领域积极寻求与AI技术的深度融合&#xff0c;以提升效率、创新产品及优化服务。在医疗健康领域&#xff0c;AI与制药的结合自2007年起航&#xff0c;历…

计网_整体概念逻辑简单过一遍

1. 简述四层TCP/IP 网络模型 由于 OSI 模型实在太复杂&#xff0c;提出的也只是概念理论上的分层&#xff0c;并没有提供具体的实现方案。 事实上&#xff0c;我们比较常见&#xff0c;也比较实用的是四层模型&#xff0c;即 TCP/IP 网络模型&#xff0c; 1.1 应用层 在四…

WPF ToolkitMVVM IOC IServiceConllection

用微软自带的 IOC 需要安装 using Microsoft.Extensions.DependencyInjection; using System.Configuration; using System.Data; using System.Windows;namespace WpfApp3 {/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class…

EXO:StandardNode _process_tensor

目录 EXO:StandardNode _process_tensor EXO:StandardNode _process_tensor 这段代码是在处理某种分片(sharding)逻辑时使用的,特别是在处理大型模型或数据处理任务时,这些任务被分割成多个较小的部分(即分片)来并行处理。这里,代码片段关注于根据特定的调试级别(DEBU…

Windows系统安装MySQL

下载MySQL 打开网址MySQL :: Download MySQL Community Server点击图下所示位置Download 进入图下所示界面&#xff0c;点击图下所示位置不登录下载 已下载完成 安装MySQL 将下载好的压缩包解压到一个专门的位置&#xff0c;该软件为绿色版软件&#xff0c;解压即可使用 配置…

若依,前后端分离项目,部署到服务器

1.后端项目用maven打包 正式服的话&#xff0c;测试不用加。 application.yml加上context-path: /prod-api 一定要选择root的ruoyi&#xff0c;他会把你自动打包其他模块的依赖 全部成功。然后去ruoyi-admin拿到这个包&#xff0c;java -jar ruoyi-admin.jar就可以了 将jar上…

VM ware虚拟机下载安装教程

1.安装包下载 目前VM ware官网无法直接下载虚拟机安装包&#xff0c;需要跳转到Broadcom&#xff08;点击此处&#xff09;官网进行下载 点击链接自动进入登录界面&#xff0c;没有注册过可以通过邮箱进行注册&#xff0c;接下来将为您介绍注册流程。 Username即注册邮箱&…

Mac/Linux系统matplotlib中文支持问题

背景 matplotlib是python中最常用的数据可视化分析工具&#xff0c;Mac和Linux系统无中文字体&#xff0c;不支持中文显示&#xff08;希望后续可以改进&#xff09;&#xff0c;需要进行字体的下载和设置才能解决。笔者经过实践&#xff0c;发现Mac系统和Linux系统解决方案略…

raw.githubusercontent.com未能解析” 解决方案

1.操作场景 通过windows11 powershell 下载依赖包 2.报错信息如下 irm : 未能解析此远程名称: raw.githubusercontent.com 所在位置 行:1 字符: 27 & ([scriptblock]::Create((irm "https://win11debloat.raphi.re/"))) ~~~~~~~~~…

SpringBoot SSM vue在线作业考试系统

SpringBoot SSM vue在线作业考试系统 首页 图片轮播 作业信息 通知公告 登录注册 留言板 个人中心 我的收藏 后台管理 登录注册 个人中心 教师信息管理 学生信息管理 学院信息管理 专业信息管理 班级信息管理 作业信息管理 作业提交管理 通知公告管理 试卷管理 试题管理 系统…

【C++ 第十八章】C++11 新增语法(4)

前情回顾&#xff1a; 【C11 新增语法&#xff08;1&#xff09;&#xff1a;1~6 点】 C11出现与历史、花括号统一初始化、initializer_list初始化列表、 auto、decltype、nullptr、STL的一些新变化 【C11 新增语法&#xff08;2&#xff09;&#xff1a;7~8 点】 右值引用和…

基于ASO-BP原子探索优化BP神经网络实现数据预测Python实现

本文提出了一种基于ASO算法优化BP神经网络的数据预测方法。通过ASO算法对BP神经网络的权值和阈值进行优化&#xff0c;克服了BP神经网络易陷入局部最优解和对初始权值敏感的缺点。实验结果表明&#xff0c;优化后的BP神经网络在预测精度上得到了显著提升&#xff0c;为数据预测…

Java 入门指南:Java 并发编程 —— 线程安全问题与锁机制

线程安全的概念 线程安全可以简单理解为在多线程环境下&#xff0c;一个方法或实例在并发执行时能够保持数据的一致性和完整性&#xff0c;不会因为多个线程的交替执行而导致错误的结果。 线程不安全的原因 线程不安全通常由以下几个原因引起&#xff1a; 原子性问题&#x…

ncnn之yolov5(7.0版本)目标检测pnnx部署

一、pnxx介绍与使用 pnnx安装与使用参考&#xff1a; https://github.com/pnnx/pnnxhttps://github.com/Tencent/ncnn/wiki/use-ncnn-with-pytorch-or-onnxhttps://github.com/Tencent/ncnn/tree/master/tools/pnnx 支持python的首选pip&#xff0c;否则就源码编译。 pip3 …

Leetcode面试经典150题-36-有效数独升级版-37.解数独

解法都在代码里&#xff0c;不懂就留言或者私信&#xff0c;比第一题稍微难点 public static void solveSudoku(char[][] board) {/**定义三个二维数组分别代表行、列、桶&#xff08;每9个格子&#xff09;*/boolean[][] rowExists new boolean[9][10];boolean[][] colExist…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一&#xff1a;为什么要继承 ①代码重用&#xff1a;继承允许我们重用、扩展或修改父类的属性和方法&#xff0c;而无需重…