网络 | 应用层-websocket协议报文格式解析

2024-05-12 17:36

本文主要是介绍网络 | 应用层-websocket协议报文格式解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

websocket的官方文档为rfc(request for comments),是网络协议的规范文档。它包含了许多计算机世界的核心知识
除了这里的websocket,它里边还包含我们熟知的http,tcp等协议的解析。
websocket协议对应的编号是rfc 6455在这里插入图片描述
在这里插入图片描述

websocket协议格式解析

在这里插入图片描述

在这里插入图片描述

由图可知,websocket的报文格式可以分为七大部分,分别是1bite的FIN标志位,3bite的RSV保留位,4bite的Opcode,1bite的mask标志位,7/7+16/7+64bite的payloadLen,可选字段masking-key,可选字段payload。
下边具体解释下:

  1. FIN标志位:此标志位用于指示当前的帧是消息的最后一个分段。

    websocket支持将长消息切割成若干帧发送,切分后,前边的帧的FIN字段均为0,最后一个帧的FIN为1。

    当消息没有分段时,这个帧便包含所有信息,FIN标志位为1.【1bite】

  2. RSV1~3:这是三个保留位。一般情况下为全0。

    当客户端、服务端协商采用websocket扩展时,这三个标志位可以非0,且值的含义由扩展进行定义。

    如果出现非0值但并未采用websocket扩展,连接出错。【3bite】

  3. Opcode:操作码。用于指示帧类型。【4bite】

    它决定了如何解析后续的数据载荷部分,如果操作码是不认识的,接收端应该断开连接。可选的操作码如下:

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

    其中注意websocket既可以传输文本数据,也可以传输二进制数据

  4. Mask标志位:指示帧的payload是否需要使用掩码覆盖。【1bite】

    RFC6455规定,当且仅当由客户端向服务端发送的帧需要覆盖。

    掩码覆盖的作用:解决“缓冲区溢出”(忽略)

    当mask为1,但服务端接收的数据没有进行过掩码操作,服务端需要断开连接

  5. payload length:7位/7+16位(64k)/7+64位(超级大),单位是字节
    模式区分:
    ①当7bite的payloadlength<126,此时为模式1
    ② 7bite的payloadlength=126,16bite生效为模式2
    ③ 7bite的payloadlength=126,64bite生效为模式3在这里插入图片描述

  6. masking-key与mask值有关,当mask为0时,没有masking-key,为1时,有4B的masking-key

  7. payload-data:长度可变。包含扩展数据(x字节)和应用数据(y字节)

    如果通信双方约定使用了websocket扩展,则扩展数据也存放于此。并声明扩展长度。

    如果没有约定使用,则扩展数据为0字节。

其中最重要的便是Opcode、payload length(三种模式),payload data

参考

引用
引用
官方

这篇关于网络 | 应用层-websocket协议报文格式解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983280

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

OWASP十大安全漏洞解析

OWASP(开放式Web应用程序安全项目)发布的“十大安全漏洞”列表是Web应用程序安全领域的权威指南,它总结了Web应用程序中最常见、最危险的安全隐患。以下是对OWASP十大安全漏洞的详细解析: 1. 注入漏洞(Injection) 描述:攻击者通过在应用程序的输入数据中插入恶意代码,从而控制应用程序的行为。常见的注入类型包括SQL注入、OS命令注入、LDAP注入等。 影响:可能导致数据泄

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动