| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 揭开WebSocket的神秘面纱:利用Wireshark的抓包分析 -> 正文阅读 |
|
[网络协议]揭开WebSocket的神秘面纱:利用Wireshark的抓包分析 |
目录 一、引语互联网发展迅速,最初的网页是以文本为主,但很快就发展到使用大量的图片、音频、视频,并且对页面的实时性要求也越来越高。 在学习HTTP协议后,我们知道了,人们已经陆续使用HTTP/1.1的持续连接、HTTP/2的TCP复用等技术来解决这一问题。 那么有没有其他的方式呢?答案是肯定的,那就是我们今天要介绍的WebSocket,它是一种在单个TCP连接上进行全双工通信的协议。 在这里我借助抓包软件Wireshark,图文并茂,辅助理解 一、抓包过程抓包软件下载选择网络选择电脑连接的网络,这里我使用的是校园网WLAN 发送WebSocket请求为了便于学习,我们可以使用网站(在线websocket测试-online tool-postjson)来体验这个过程。点击“连接”,就可以向服务器端发送请求信息,建立WebSocket连接啦 设置过滤器返回软件,你会看到眼花缭乱的抓包结果。赶紧设置过滤器为服务端的ip地址,就可以找到我们的抓包结果啦! 二、抓包分析建立连接的流程概述步骤1:客户端和服务端完成三次握手建立TCP连接,这一点和HTTP协议没有差异 步骤2:由客户端发起HTTP请求,升级协议为WebSocket 步骤3:只需完成一次握手后,就可以实现客户端和服务端主动发送消息内容 步骤4:客户端发送关闭帧,关闭所有连接 现在就让我们来康康,客户端和服务端都偷偷商量了啥~ 客户端:请求升级协议客户端:服务器您好!我想要升级协议为websocket,版本号为13,再给你个暗号用于咱们俩碰头~ 说明:Sec-WebSocket-Key是一个“简单”的认证密钥 服务端:同意升级协议服务端:我回复你一个状态码为101的报文,表明我收到啦。协议已经升级成了websocket,我还把暗号处理了一下,也一并回复给你~ 说明:Sec-WebSocket-Accept是根据发来请求中的认证密钥,通过约定好的规则生成,依然是用于验证 到这里,只经过一次握手,客户端和服务端就成功建立了WebSocket连接,下一步就可以进行双向的通信啦! 发送数据帧接下来让我们康康,使用WebSocket协议发送的数据帧是长的啥样子 这是我向服务端发送了一个文本信息“Hello” 这是服务器端发送给我的一个文本信息“Hello” 仔细看,你会发现如下华点: 1、我发给服务端的信息被MASK了 2、服务端发给我的信息是裸奔的 3、WebSocket的数据帧其实蛮短的 光看抓包结果,当然是云里雾里,这个时候就要打开我们的RFC6455文档,翻到第28页,来康康它写的都是个啥(敲重点!) 前2个字节是必须存在的帧首部,详情如下: FIN:是否为消息的最后一帧,是扣1、不是扣0 RSV1、2、3:保留部分,没啥用(高情商:未雨绸缪) opcode:帧类型,说明这个帧是干嘛用的,若值为1,该帧为文本类型 MASK:数据是否需要掩码处理,需要的请扣1 Payload len:数据的长度,长度的最大值是可以调整的,有7、7+16、7+64三种模式 Mask-key:若进行了掩码处理,则在此处填写4个字节的掩码 以上看不懂也没关系,简单来说,首部=结束标志位+操作码+帧长度+掩码 注意,以上所有双向通信、数据传输的过程,都是在同一个TCP连接下进行的,这是该协议最大的特点 客户端:关闭WebSocket连接客户端:我要讲的东西都讲完了,给你发个关闭帧,后面我就没话说了,挂啦~ 服务端:收到关闭帧啦,那我也不发消息烦你了,拜拜~ 说明:opcode=8(二进制:1000),数值8代表此帧的类型为关闭帧 为什么需要掩码处理?不难看出,客户端发出的消息包裹的很紧,而服务端发出的消息一直在裸奔,两者形成了鲜明的对比。 为什么客户端向服务器发送数据需要掩码处理?其实这是RFC6455的规定,主要是为网络安全考虑,防止出现“缓存污染攻击”,即防止HTTP代理服务器被攻击。 举个例子,我是个坏蛋,我有一台电脑和一台服务器,我看一台代理服务器不爽,想捉弄它。 我的电脑-->代理服务器:麻烦把这条消息,送给我的服务器 代理服务器:好嘞! 代理服务器-->我的服务器:好兄弟,你这来消息啦! 我的服务器:啥玩意啊?我不收,我故障了,这会收不了 代理服务器:那咋办啊?给你你不要,又是交给你的,那要不先先放我缓存里 Two Hours Later 。。。。。。 代理服务器:之前是不是谁有条消息放我缓存了,完了我找不到了,是不是错发出去了? 看完这段描述,大家能否意识到危险了?假如我塞给代理服务器的,是条伪造的破坏消息呢?指不定就发了给哪位倒霉蛋。 然而,在设置了掩码的条件下,消息是乱七八糟的字符,HTTP代理服务器就不会缓存下来尝试解码转发,这样就防止了恶意攻击。 如图,Masked Payload是经过掩码处理的天书,这样发给代理服务器,它就会因为看不懂而直接转发了,会使网络更安全。 三、小结不难看出,WebSocket(又称“网套”)是一种全双工通信,它使得客户端和服务器之间的数据交换变得更加简单,且允许服务端主动向客户端推送数据。 WebSocket显然解决了传统的“轮询”模式带来的缺点,因为HTTP请求每次都要携带完整的首部。建立websocket连接后交换数据,能够显著减少用于协议控制的数据包首部。 在WebSocket中,浏览器和服务器只需要一次握手,就直接可以创建持久性的连接,并进行双向的数据传输。由于协议是全双工的,服务器可以随时主动给客户端发送数据,相比HTTP的请求-响应模式,这种方式的延迟明显更少,更适合用于对实时性要求高的应用场景。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:59:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |