A-A+

利用Wireshark抓包分析WebSocket原理

2024年05月10日 14:34 汪洋大海 暂无评论 共2392字 (阅读86 views次)

一、引语

互联网发展迅速,最初的网页是以文本为主,但很快就发展到使用大量的图片、音频、视频,并且对页面的实时性要求也越来越高。

在学习HTTP协议后,我们知道了,人们已经陆续使用HTTP/1.1的持续连接、HTTP/2的TCP复用等技术来解决这一问题。

那么有没有其他的方式呢?答案是肯定的,那就是我们今天要介绍的WebSocket,它是一种在单个TCP连接上进行全双工通信的协议。

在这里我借助抓包软件Wireshark,图文并茂,辅助理解

一、抓包过程

抓包软件下载

选择网络

选择电脑连接的网络,这里我使用的是校园网WLAN

发送WebSocket请求

为了便于学习,我们可以使用网站()来体验这个过程。

点击“连接”,就可以向服务器端发送请求信息,建立WebSocket连接啦!

设置过滤器

返回软件,你会看到眼花缭乱的抓包结果,赶紧设置过滤器为服务端的ip地址,就可以找到我们的抓包结果啦!

二、抓包分析

建立连接的流程概述

1)客户端和服务端完成三次握手,建立TCP连接,这和HTTP没有差异

2)由客户端发起HTTP请求,升级协议为WebSocket

3)只需完成一次握手后,就可以实现客户端和服务端的双向通信

4)客户端发送关闭帧,关闭所有连接,结束

需要说明的是,完成握手后的双向通信,都在单个TCP连接上进行的,这是它最大的优势

现在就让我们来康康,客户端和服务端都偷偷商量了啥~

客户端:请求升级协议

客户端:服务器您好!我想要升级协议为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连接下进行的,这是该协议最大的特点

客户端:关闭连接

客户端:我要讲的东西都讲完了,给你发个关闭帧,后面我就没话说了,挂啦~

服务端:收到关闭帧啦,那我也不发消息烦你了,拜拜~

说明:opcode=8(二进制:1000),数值8代表此帧的类型为关闭帧

为什么需要掩码处理?

不难看出,客户端发出的消息包裹的很紧,而服务端发出的消息一直在裸奔,两者形成了鲜明的对比。

为什么客户端向服务器发送数据需要掩码处理?其实这是RFC6455的规定,主要是为网络安全考虑,防止出现“缓存污染攻击”,即防止HTTP代理服务器被攻击。


举个例子,我是个坏蛋,我有一台电脑和一台服务器。我看一台代理服务器不爽,想捉弄它。

我的电脑-->代理服务器:麻烦把这条消息,送给我的服务器

代理服务器:好嘞!

代理服务器-->我的服务器:好兄弟,你这来消息啦!

我的服务器:啥玩意啊?我不收,我故障了,这会收不了

代理服务器:那咋办啊?给你你不要,又是交给你的,那要不先先放我缓存里

Two Hours Later 。。。。。。

代理服务器:之前是不是谁有条消息放我缓存了,完了我找不到了,是不是错发出去了?


看完这段描述,大家能否意识到危险?假如我塞给代理服务器的,是条伪造的破坏消息呢?形象来说,这就是“缓存中毒”。然而,在设置掩码的条件下,消息是乱七八糟的字符,HTTP代理服务器就不会缓存下来尝试解码转发,这样就防止了恶意攻击。

如图,Masked Payload像是经过掩码处理的天书,这样发给代理服务器,它就会因为看不懂而直接转发了,会使网络更加安全。

三、小结

不难看出,WebSocket(又称“网套”)是一种全双工通信,它使得客户端和服务器之间的数据交换变得更加简单,且允许服务端主动向客户端推送数据。

WebSocket显然解决了传统的“轮询”模式带来的缺点,因为HTTP请求每次都要携带完整的首部。建立websocket连接后交换数据,能够显著减少用于协议控制的数据包首部。

在WebSocket中,浏览器和服务器只需要一次握手,就直接可以创建持久性的连接,并进行双向的数据传输。由于协议是全双工的,服务器可以随时主动给客户端发送数据,相比HTTP的请求-响应模式,这种方式的延迟明显更少,更适合用于对实时性要求高的应用场景。

文章来源:https://www.cnblogs.com/wangjunjiehome/p/16279601.html

布施恩德可便相知重

微信扫一扫打赏

支付宝扫一扫打赏

×

给我留言