【网络】WebSocket协议详解

news2024/11/24 16:33:59

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.coloradmin.cn/o/2087034.html

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

相关文章

深度学习基础—简单的卷积神经网络

3.1.卷积层 下面以卷积神经网络的某一层为例,详解一下网络的结构。 假设当前位于l层,则输入6*6*3的彩色图片,有两个3*3*3的过滤器,卷积操作后将输出2个4*4的图片。如果把过滤器看成权重w,卷积这一步操作其实就是w*a&am…

消息称华为纯血鸿蒙部分应用采用虚拟机方案

华为预计在11月发布正式版纯血鸿蒙,为了能够适配更多的App,官方也是有了新的解决方案。报道中提到,纯血鸿蒙设备对有些还没上架的应用会使用虚拟机方案过渡。据悉,华为的虚拟机方案作为过渡措施,首先能确保用户在鸿蒙系…

概率论与编程的联系及数据科学应用

目录 引言 第一章 概率模拟与编程实现 1.1 随机数生成与蒙特卡罗模拟 1.1.2 蒙特卡罗模拟 第二章 统计建模与数据分析 2.1 统计模型实现 2.2 概率图模型 第三章 概率论在机器学习中的应用 3.1 随机森林与决策树 3.2 贝叶斯分类器 总结与展望 引言 在大数据和人工智…

学习node.js 十 redis的基本语法

redis Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它提供了一个高效的键值存储解决方案,并支持多种数据结构,如字符串(Strings)、哈希(Hashes)、…

素数之和(c语言)

1./描述 //牛牛刚刚学了素数的定义:素数值指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数 //牛牛想知道在[l, r] 范围内全部素数的和 //输入描述: //输入两个正整数 l,r 表示闭区间范围 //输出描述: //…

sqli-labs靶场通关攻略 46-50

主页有sqli-labs靶场通关攻略 1-45 第四六关 less-46 步骤一:利用报错注入查询库 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1) 步骤二:查询表名 ?sort1 and updatexml(1,concat(0x7e,(select group_concat(table_name)from informatio…

如何通过日志或gv$sql_audit,分析OceanBase运行时的异常SQL

本文作者:郑增权,爱可生 DBA 团队成员,OceanBase 和 MySQL 数据库技术爱好者。本文约 2000 字,预计阅读需要 8 分钟。 简介 在 OCP 云平台的 Top SQL 界面中,能观察到异常SQL,但这些SQL并未明确显示具体的…

防泄密的方法都有哪些?

一、防泄密的方法都有哪些?使用安全通讯工具:采用加密通讯工具,确保敏感信息在传输过程中不被窃取或篡改。定期安全审计:对系统和数据进行定期的安全审计和检查,发现潜在的泄密风险并及时处理。文件加密:对…

光伏电站的施工步骤

施工准备:在施工前,需要进行现场勘查,了解施工场地的地形、地貌、气候等情况,制定施工方案和安全措施。同时,还需要准备好施工所需的材料和设备,如光伏组件、支架、电缆、逆变器等 。基础施工:根…

“面试宝典:高频算法题目详解与总结”

干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…

鸿蒙Harmony开发实战:自定义圆形组件-Canvas

在采用Java配合xml布局编写鸿蒙app页面的时候,发现sdk自带的Image组件并不能将图片设置成圆形,反复了翻阅了官方API手册(主要查阅了Compont和Image相关的API),起初发现了一个setCornerRadius方法,于是想着将…

高职院校人工智能训练师边缘计算实训室建设方案

一、引言 随着人工智能技术的飞速发展,边缘计算在提升数据处理效率、降低延迟、保护数据安全等方面展现出巨大潜力。高职院校作为技能型人才培养的重要基地,建设人工智能训练师边缘计算实训室,旨在培养掌握前沿技术、具备实战能力的复合型人才…

pnpm国内源设置

一、背景 在国内使用pnpm时,由于网络问题,经常会遇到速度慢或无法访问的问题。为了提高效率,可以将pnpm的源设置为国内的镜像源。以下是一些常用的国内pnpm镜像源以及如何设置它们的方法。 二、国内可用源 2.1 淘宝pnpm源 https://registry…

神经网络卷积层

一、卷积操作 对应位置相乘相加,最终组成一个新的矩阵,实现了降维。 二、代码 import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoaderdataset torchvision.datasets.CIFAR10(&…

三级_网络技术_54_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写路由器RG的路由表项。 目的网络/掩码长度输出端口__________S0(直接连接)__________S1(直接连接)__________S0__________S1__________S0__________S1 2.如果将10.10.67.128/2…

C++----简单了解vector

大家好,今天我们来讲讲与string相似的向量类型。之所以说他们是相似的原因是他们其中的数据类型有些效果都是一样的。当然大家不能说,既然是差不多的干嘛还有一个这个啊。不如直接用string就可以了。当然世界名言存在即合理。既然我们都能想到的东西&…

Docker 部署 net6 webapi项目

摘要:记录 net6 webapi 项目在 docker 上部署步骤,方便自己后面查看,也方便他人学习。 1. 创建 webapi 项目 点击创建新项目 选择 ASP.NET Core Web API 项目,点击下一步。 给项目命名,然后勾选将解决方案和项目放在同…

C++初学(18)

18.1、读取数字的循环 假设要编写一个将一系列的数字读入到数组中的程序,并允许用户在数组填满之前结束输入。一种方法是利用cin: int n; cin>>n; 如果用户输入的是一个单词,而不是一个数字将会怎么样?可能会发生这些情况…

环境变量--永久 & 暂时

Linux 环境变量配置信息 查看环境变量 export 查看系统所有环境变量echo $PATH 查看 PATH 环境变量值 环境变量的命名规则为:变量名变量值 多个变量值之间使用 : 分隔 添加环境变量 环境变量分类 按照作用域分类 环境变量可以简单的分成用户自定义的环境变量…

OJ-0829

题目 示例1 输入: 5 4 1 1 2 3 5 1 2 3 1 4 3 4 5 2 3 4 输出: 3 4 1 2说明:测试用例的优先级计算如下: T1Pf1Pf2Pf31124 T2Pf1Pf4134 T3Pf3Pf4Pf523510 T4Pf2Pf3Pf41236 按照优先级从小到大,以及相同优先级,ID小的先执行的规则&…