WebSocket实战之二协议分析

news2024/11/24 12:30:06

一、前言

上一篇  WebSocket实战之一 讲了WebSocket一个极简例子和基础的API的介绍,这一篇来分析一下WebSocket的协议,学习网络协议最好的方式就是抓包分析一下什么就都明白了。

二、WebSocket协议

本想盗一张网络图,后来想想不太好,还是自己画了一张。

1、WebSocket握手

WebSocket握手是用一个特殊的HTTP请求和响应来完成,客户端握手请求头会携带Upgrade:websocket,表示请求将协议升级为WebSocket协议。

响应码 101 表示同意将协议进行升级,Sec-WebSocket-Accept是从请求的Sec-WebSocket-key继承而来,包含一个特殊的响应值,必须和客户端预期精确匹配才能握手成功。Sec-WebSocket-Accept=Base64(SHA1(Sec-WebSocket-key+KEY_SUFFIX))。

2、发送数据

WebSocket握手成功连接打开后,客户端和服务端就可以在任何时候相互发送数据,在昨天简单例子中客户端open事件加上发送信息,在浏览器可以看到发送的消息和接收到的消息。这就是和HTTP最本质的区别,只要握手完成后无论哪一端想发送数据就发送,而不是像HTTP那样服务端一定要等客户端的请求然后做出响应。

将前一节例子客户端也改成每隔5秒发送一条数据。

在浏览器控制台Message标签可以查看Send(向上箭头)和Receive(向下箭头)的数据,全双工相互发送。

3、关闭握手

终止连接的端点发送一个数字代码以及关闭原因字符串,关闭握手能正常关闭连接,使应用程序可以区分出是有意关闭还是意外终止连接。

三、抓包分析

IP:115.192.133.59 WebSocket客户端

IP:172.16.79.224   WebSocket服务端(内网IP)

为了便于查看数据包内容,代码稍微调整,将客户端服务端持续发送数据去掉

服务端改为接连发送三条数据

客户端改为不发送消息,而只在收到消息后关闭websocket

1、【1、2、3】开始三个包就是普通的TCP三次握手。

2、【4】第4个包是请求头携带了Upgrade:websocket的普通HTTP请求。

3、【5】服务端一个TCP响应包,【6】服务端一个HTTP响应包,101 Switching Protocols告诉客户端协议进行升级。

4、【7、8、9】第7、8、9个包,服务端向客户端以WebSocket协议发送了三个包,WebSocket以帧格式发送消息内容

  • Fin:1位,用来表明这是一个消息的最后的消息片断,当然第一个消息片断也可能是最后的一个消息片断.

  • RSV1, RSV2, RSV3: 分别都是1位,如果双方之间没有约定自定义协议,那么这几位的值都必须为0,否则必须断掉WebSocket连接.

  • Opcode:4位操作码,定义有效负载数据,如果收到了一个未知的操作码,连接也必须断掉,以下是定义的操作码.

  • Payload length: 传输数据的长度,以字节的形式表示.

  • Payload data: 负载数据,这一帧里传的数据是 【b】.

5、【10、11、12、13】客户端向服务端发送4个TCP应答包,应该是对收到消息的一个应答

6、【14】客户端调用close方法关闭websocket连接,可以看到在关闭之前服务端包已经发出来了。

7、【15】服务端对客户端的close进行了应答,关闭了连接。

8、【16、17、18、19、20】 TCP的4次挥手,另外一个包没搞清楚是做什么的。

四、总结

WebSocket是基于TCP的,与HTTP同样也是应用层协议,但WebSocket的首次握手是依赖于HTTP协议,握手成功协议升级为WebSocket,然后就是长连接可以相互一直发送消息而不再是HTTP的那种请求/响应机制,另外可以看到客户端的端口在开始随机用了一个值是52914后,在关闭之前一直会用同一端口,这样才能找得到,IP用来找机器,端口用来找应用。

注:下一篇再介绍一下心跳机制以及断开重连机制。

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

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

相关文章

ImportSelector使用详解

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl ImportSelector概述 利用Import和ImportSelector可将组件批量添加至IoC容器 ImportSelector案例 在此,介绍ImportSelector使用案例。 定义ImportSelector S…

Kotlin前置检测判断check,require,requireNotNull

Kotlin前置检测判断check&#xff0c;require&#xff0c;requireNotNull &#xff08;1&#xff09;check fun main(args: Array<String>) {val b falsecheck(b) {println("check $b")}println("end") } check监测到值非真时候&#xff0c;抛出一…

国庆作业day5

应用层&#xff1a;提供用户与网络应用程序之间的接口。表示层&#xff1a;负责数据的格式转换、加密和解密。会话层&#xff1a;负责建立、管理和终止会话。它提供会话控制和同步&#xff0c;允许应用程序之间建立连接和交换数据。传输层&#xff1a;提供端到端的连接。网络层…

【ppt技巧】给ppt文件设置带有密码的只读模式

有没有同学&#xff0c;想要给PPT文件设置修改权限&#xff0c;却没有找到功能&#xff0c;给PPT文件设置只读模式&#xff0c;没有密码设置的&#xff1f;今天给大家分享给PPT文件设置带有密码的只读模式&#xff08;修改权限&#xff09;。 打开PPT文件之后&#xff0c;将PP…

数据结构与算法课后题-第三章(顺序队和链队)

#include <iostream> //引入头文件 using namespace std;typedef int Elemtype;#define Maxsize 5 #define ERROR 0 #define OK 1typedef struct {Elemtype data[Maxsize];int front, rear;int tag; }SqQueue;void InitQueue(SqQueue& Q) //初始化队列 {Q.rear …

WebSocket实战之一

一、前言 2017年做股票软件开始关注WebSoocket技术&#xff0c;不过当时客户端是Native采用的网络通讯框架是Netty&#xff0c;这次做收银台项目决定把WebSocket技术实践一把&#xff0c;主要应用于实时销量大盘数据展示以及消息系统提醒功能等。 注&#xff1a;一个技术点尽…

10.4号作业

Qt实现客户端搭建的代码和现象 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpSocket> #include <QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJ…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石④ 第十九章 驱动程序基石④19.7 工作队列19.7.1 内核函数19.7.1.1 定义 work19.7.1.2 使用 work&#xff1a;schedule_work19.7.1.3 其他函数 19.7.2 编程、上机19.7.3 内部机制19.7.3.1 Linux 2.x的工作队列创建过程19.7.3…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石⑤ 第十九章 驱动程序基石⑤19.9 mmap19.9.1 内存映射现象与数据结构19.9.2 ARM架构内存映射简介19.9.2.1 一级页表映射过程19.9.2.2 二级页表映射过程 19.9.3 怎么给APP新建一块内存映射19.9.3.1 mmap调用过程19.9.3.2 cach…

傅里叶系列 P1 的定价选项

如果您想了解更多信息&#xff0c;请查看第 2 部分和第 3 部分。 一、说明 这是第一篇文章&#xff0c;我将帮助您获得如何使用这个新的强大工具来解决金融中的半分析问题并取代您的蒙特卡洛方法的直觉。 我们都知道并喜欢蒙特卡洛数字积分方法&#xff0c;但是如果我告诉你你可…

InnoDB索引机制

导学&#xff1a;索引什么时候失效&#xff1f;为什么类型转换索引会失效&#xff1f;不满足最左匹配原则&#xff1f; 我们都知道&#xff0c;MySQL它主要有2大模快组成&#xff0c;第一块就是我们的MySQL服务&#xff0c;里面包含了像连接管理、解析器、预处理、优化器、执行…

数据分析:人工智能篇

文章目录 第三章 数据可视化库matplotlib3.1 matplotlib基本绘图操作3.2 plot的线条和颜色3.3 条形图分析3.4 箱型图分析3.5 直方图分析3.6 散点图分析3.7 图表的美化 第四章 数据预测库Sklearn4.1 sklearn预测未来4.2 回归数据的预测4.2.1 回归数据的切分4.2.2 线性回归数据模…

【vue3】shallowReactive与shallowRef;readonly与shallowReadonly;toRaw与markRaw

假期第六篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 1、shallowReactive与shallowRef shallowReactive&#xff1a;只处理对象最外层属性的响应式&#xff08;浅响应式&#xff09; shallowRef&#xff1a;只处理…

2023 彩虹全新 SUP 模板,卡卡云模板修复版

2023 彩虹全新 SUP 模板&#xff0c;卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化&#xff0c;修复了 PC 端购物车页面显示不正常的问题。 使用教程 将这俩个数据库文件导入数据库&#xff1b; 其他的直接导入网站根目录覆盖就好&#xff1b; 若首页显示不正常&a…

华为云云耀云服务器L实例评测|部署在线轻量级备忘录 memos

华为云云耀云服务器L实例评测&#xff5c;部署在线轻量级备忘录 memos 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 产品优势1.3 应用场景1.4 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 memos3.1 memos介绍3.2 Docker 环境搭建…

服务器挂机

title: “服务器挂机” createTime: 2022-05-11T11:05:4308:00 updateTime: 2022-05-11T11:05:4308:00 draft: false author: “name” tags: [“服务器”] categories: [“服务器”] description: “测试的” 服务器挂机策略 地址&#xff1a;pve.dongshanxia.top:35000用户…

安装软件显示“为了对电脑进行保护,已阻止此应用”——已解决

我是在安装Tableau时遇到的这个情况。事情是这样的&#xff1a;我先安装了一次&#xff0c;发现安装选项错了&#xff0c;我就用360软件管家删除了&#xff0c;结果就没法按照教程使用管理员身份打开了&#xff0c;提示“为了对电脑进行保护&#xff0c;已阻止此应用”。 解决…

Git使用【下】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;标签管理理解标签标签运用 …

VUE3照本宣科——应用实例API与setup

VUE3照本宣科——应用实例API与setup 前言一、应用实例API1.createApp()2.app.use()3.app.mount() 二、setup 前言 &#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f33e;&#x1f4dd;记录学习成果&#xff0c;以便温故而知新 “VUE3照本宣科”是指照着中文官网和菜鸟教…

IntelliJ IDEA 常用快捷键

目录 一、IDEA 常用快捷键 1 通用型 2 提高编写速度 3 类结构、查找和查看源码 4 查找、替换与关闭 5 调整格式 二、Debug快捷键 三、查看快捷键 1、已知快捷键操作名&#xff0c;未知快捷键 2、已知快捷键&#xff0c;不知道对应的操作名 3、自定义快捷键 4、使用…