抓包红色_抓包三部曲 WebSocket 协议原理抓包分析

这篇文章通过抓包分析 WebSocket 协议的细节,学习一下 WebSocket 执行流程。

1.WebSocket 流程说明

  • (1)客户端和服务器之间完成三次握手建立 TCP 连接(TLS/SSL)握手。

  • (2)客户端发起 HTTP 请求和服务器之间建立 WebSocket 握手。

  • (3)WebSocket 连接建立之后,双方通信是基于 TCP 连接的,此后不需要 HTTP 协议了。

  • (4)完成 WebSocket 握手之后,就可以发送消息内容了。

2.HTTP 建立 WebSocket 握手(HTTP 升级到 WebSocket)

cab9ea17605178767f89b3f49fdaa558.png

Tips:其中红色部分为必须,完成如上图所示过程即建立了 WebSocket 连接,Sec-WebSocket-Key: 5C2dTYo3LMpWd/H+Nix4HQ==\r\n 表示建立握手生成的随机串。

2.1 如何证明握手被服务器接受

从上图可以看到构建 WebSocket 握手的时候,发送了一个 Sec-WebSocket-Key

#请求中的 Sec-WebSocket-Key 随机数
Sec-WebSocket-Key:c3SkgVxVCDhVCp69PJFf3A==

#响应中的 Sec-WebSocket-Accept 证明值
Sec-WebSocket-Accept:YzgwZjRlZTcxMThiYTdjNDliYzAyNTdmZmNlN2E5MzBmYzNiYTQ0Mg==

2.2 Sec-WebSocket-Accept 证明值构造规则

  • GUID(RFC4122):258EAFA5-E914-47DA-95CA-C5AB0DC85B11

  • 值构造规则:BASE64(SHA1(Sec-WebSocket-Key+GUID))

  • 拼接值:c3SkgVxVCDhVCp69PJFf3A==258EAFA5-E914-47DA-95CA-C5AB0DC85B11

  • SHA1值:c80f4ee7118ba7c49bc0257ffce7a930fc3ba442

  • BASE64值:YzgwZjRlZTcxMThiYTdjNDliYzAyNTdmZmNlN2E5MzBmYzNiYTQ0Mg==

2.3 抓包数据

48f5ac7a1ddf9ca1b5a372618568319a.png

3.消息与数据帧说明

  • Message 消息:1 条消息由一个或者多个帧组成,这些数据帧属于同一类型,代理服务器可能合并、拆分消息的数据帧。

  • Frame 数据帧:持续帧、文本帧、二进制帧

4.WebSocket 协议格式

4.1 WebSocket 协议的特点

  • 基于帧:不是基于流(HTTP、TCP)

  • 每一帧要么承载字符数据,要么承载二进制数据

  • 基于浏览器的同源策略,可以使用 Access-Control-Allow-Origin 等头部

  • 基于 URI、子协议支持同主机同端口上的多个服务

4.2 帧格式示意图

365bbf2d41b11c005b66358c1991463e.png

Tips:图中蓝色的 2 字节是必然存在的帧首部。

抓取到的包数据如下图:895c88d895cb5b5cc3d02ab8f6188816.png

Tips:可以在百度搜索 WebSocket 在线测试,然后使用 Wireshark 工具抓取。

4.3 帧类型

从上图抓取到的数据包可以看到帧首部中有 Opcode,它表示 帧类型,下面列出不同类型的帧对应的 Opcode 的值:

  • 持续帧:0

  • 非控制帧:1:文本帧,2:二进制帧,3-7:为非控制帧保留

  • 控制帧:8:关闭帧,9:心跳帧ping,A:心跳帧pong,B-F:为控制帧保留

    Tips:从 3.2 中可以看出 Opcode 的值为 1,表示文本帧。

4.4 MASK 掩码作用

从上面的图中可以看到 WebSocket 每次发送消息的时候帧首部会有MASK 掩码,如下图所示:71e0357559066f2e9d11579441b3b156.png

Tips:MASK 的作用是为了防止缓存污染攻击,防止伪造 WebSocket 请求。

4.5 ABNF 描述的帧格式

ws-frame = frame-fin;1 bit int length
frame-rsv1;1 bit in length
frame-rsv2;1 bit in length
frame-rsv3;1 bit in length
frame-masked;1 bit in length
frame-payload-length;3 种长度
[frame-masking-key];32 bits in length
frame-payload-data;n*8 bits in;length,where;n >= 0

5.如何保持会话心跳

HTTP 长连接是基于定时器维持的会话,若在定时器设置的时间范围内,还没有数据到达,就会自动断开,而 WebSocket 连接保持会话是基于心跳的;

5.1 心跳帧

心跳帧是可以穿插在数据帧中传输的

  • ping 帧Opcode=9,可以含有数据

  • pong帧Opcode=A,必须与 ping 帧数据相同

63cd8a47c8580afb88b1710b91975811.png

6.如何关闭 WebSocket 会话

6.1 关闭 WebSocket 会话

  • 控制帧中的关闭帧:在 TCP 连接之上的双向关闭。

  • 发送关闭帧后,不能再发送任何数据。

  • 接收关闭帧之后,不再接收任何到达的数据。

  • TCP 连接意外中断也会关闭 WebSocket。

6.2 关闭帧的格式

4714d0fc64d76002083d04d45cf598d3.png

  • 关闭帧:Opcode=8

  • 可以含有数据,但仅用于解释关闭会话的原因,前 2 字节为无符号整型,遵循 mask 掩码规则。

6.3 关闭帧抓包

59a68bea34019fc90439c5218eb8ce41.png

Tips:从抓包软件中可以看出 TCP 连接是在 WebSocket 关闭之后再关闭的。

6.4 关闭帧的错误码

bb2471c57e4a0ca5374cabc3a3f6630c.png

986fe1b20f7f7de9c2e6e0b5bf58f8ca.gif

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

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

相关文章

计算机农业sci,IEEE旗下JCR1区智慧农业类SCIEI期刊

原标题:IEEE旗下JCR1区智慧农业类SCI&EI期刊各位学者,EA-ISET 协会(www.ea-iset.org)重点期刊推荐,IEEE旗下JCR1区智慧农业类SCI&EI期刊 ,版面有限,录满即止,具体信息如下:一、期刊信息JCR1区智慧农…

python 多条件 选择 算法_python部署python算法 - 快速寻找满足条件的两个数

题目前提是一定存在这样两个数 解法一就不写了...一般想不到吧 一开始想到的是解法二最后的用hash表 (其实是想到创建一个跟target一样大的数组啦..存在就写入index,但是要全部找出,那得二维数组,但是后面想到target要是很大的话&…

3d打印主要的切片参数类型_3D打印机切片参数详情说明

在使用3D打印机的过程中,切片是一个我们无法避免要操作的步骤,接下来我们将简单介绍一下切片的相关参数。底部类型设置模型打印第一层的类型,以适应不同打印需求Skirt模型底部不与模型接触,确保挤出正常SkirtBrim与模型底部接触&a…

西南科技大学研究生计算机,我们毕业啦……西南科技大学2020研究生毕业记!...

“各位旅客,列车前方到站是终点站,毕业。要下车的乘客,请带好您的行李和贵重物品,准备下车。”每当毕业季来临时,时间的流逝似乎开了倍速,掠过青春的云海,不因剧情的精彩而暂停。近日&#xff0…

决策树和随机森林算法 简介

决策树(Decision Tree) 是一种基础的分类和回归算法随机森林 是由多棵决策树集成在一起的集成学习算法 决策树生成过程: 特征选择决策树生成决策树剪枝 信息熵 用来衡量一个节点内信息的不确定性的。 信息熵越大, 不确定性越大, 样本就越多样, 样本…

java 抽象类_什么是final?Java抽象类又是什么?抽象类能使用 final 修饰吗?

第十三题讲解人:张小龙 8.23邮箱:2304940425qq.com一.什么是final?final是java中的一个关键字,可以用来修饰变量、方法和类。用关键词final修饰的域成为最终域。用关键词final修饰的变量一旦赋值,就不能改变&…

mysql范式与反范式_MySQL 三种范式以及反范式 | 剑花烟雨江南

第一范式确保数据表中每列(字段)的原子性,即每个字段都是最小单位,不可拆分。如:用户表(user)中的 user_name,password,nick_name。第二范式在第一范式的基础上,保证表中的每列都与主键相关。如果一个关系满…

查找微信公众号服务器地址,手把手教大家搭建微信公众号查题功能

最近比较主流的公众号输入查题功能比较火爆,现在手把手教大家搭建自己的公众号查题。如下图:准备:备案域名、服务器、公众号域名备案、服务器申请、公众号申请在这里就不单独介绍了。1、配置PHP文件把两个php代码上传服务器。更改api.php接口…

python更新excel内容_使用python将Excel表中的数据更新到数据库中

代码如下: # -*- coding: utf-8 -*- import pymysql import xlrd # 连接数据库 try: db pymysql.connect(host"127.0.0.1", user"root", passwd"root", db" test", charsetutf8) except: print("could not connect t…

mysql 中文字符排序规则_mysql中字符集和排序规则说明

数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation)。一.字符集字符集,即用于定义字符在数据库中的编码的集合。 常见的字符集:utf-8 gbk 等。二.排序规则数据库中的排序规则用来定…

sql server服务器位置,SQL语句实现查询SQL Server服务器名称和IP地址

获取服务器名称:SELECT SERVERPROPERTY(MachineName)select SERVERNAMEselect HOST_NAME()获取IP地址可以使用xp_cmdshell执行ipconfig命令:--开启xp_cmdshellexec sp_configureshow advanced options, 1reconfigure with overrideexec sp_configurexp_c…

如何卸载MySQL8.0.11_win10安装mysql8.0.11卸载5.7

卸载5.7的安装方式是免安装版本的,需要卸载。1、停止服务以管理员身份启动cmd命令窗口net stop mysql或是任务管理器找到mysql服务停止。2、删除sc delete mysql3、windowsR 开始运行里面输入regedit,打开注册表,有MySQL文件夹的对MySQL文件删除HKEY_LOCAL_MACHINE/…

django项目如何连接前端_工作笔记前端小白如何搭建前端项目

“前言,来到杭州差不多有两年左右了,大小小做过不少项目。之前都是有技术大佬在前面抗住、作为菜鸡的本人只要在大佬后面听大佬指挥摸鱼划水就行。最近公司接到一个新项目,由于大佬们纷纷出走,于是搭建前端框架的任务就落到本人的…

mysql编码转换工具_mysql编码转换搞定

按照下面做法,终于成功了!庆祝,纪念......背景:某个系统的mysql数据库dnname采用默认的latin1字符集,系统升级需要将所有数据转换成utf-8格式,目标数据库为newdbname(建库时使用utf8)方法一:步骤…

python基础面试都问什么问题_基本 Python 面试问题

def Stack(object): def __init__(self): self.stack [] def push(self,value): # 进栈 self.stack.append(value) def pop(self): # 出栈 if self.stack: self.stack.pop() else: raise LookupError(stack is empty!) def is_empty(self): # 查看stack是否为空 reture bool(s…

按钮点击计数器存入mysql_按钮点击数统计计数器(PHP+MYSQL+JS)

公共页面con.php <?php mysql_connect("localhost:3306","user","password") or die("数据库连接失败");mysql_select_db("click") or die("数据表连接失败");mysql_query("set names gbk");?>…

es6去除重复项_Excel的去除重复项你真的明白原理吗?浅尝去除重复项的函数奥秘...

Excel函数学习&#xff1a;悟空百问の009&#xff1a;去除重复项的深入思考我们经常整理一些数据&#xff0c;数据不可以动原数据&#xff0c;又需要进行数据分析处理&#xff0c;整理&#xff0c;数据汇总&#xff0c;如何快速的找到这些重复的值&#xff0c;这成了我们很头疼…

unit类型是什么?_面试官虚晃一枪:项目中有用过锁吗?能解释一下什么是AQS?...

1 前言锁是用来控制多个线程访问共享资源的方式&#xff0c;一般来说&#xff0c;一个锁能防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源&#xff0c;如读写锁)。在以前&#xff0c;Java程序是靠synchronized来实现锁功能的&#xff0c;而在Java…

浏览器里面看到的表单数据映射到python_python爬虫入门01:教你在 Chrome 浏览器轻松抓包...

通过python爬虫入门&#xff1a;什么是爬虫&#xff0c;怎么玩爬虫&#xff1f;我们知道了什么是爬虫也知道了爬虫的具体流程那么在我们要对某个网站进行爬取的时候要对其数据进行分析就要知道应该怎么请求就要知道获取的数据是什么样的所以我们要学会怎么抓咪咪&#xff01;哦…

sql查询mysql参数配置_查询参数配置

示例请求示例http(s)://rds.aliyuncs.com/?ActionDescribeParameters&DBInstanceIdrm-uf6wjk5xxxxxxx&正常返回示例XML 格式此选项设置服务器范围内的默认填充因子值。提供填充因子是为了优化索引数据存储和性能。fill factor50mssql2008r2此选项设置服务器范围内的默…