• 利用Wireshark抓包分析WebSocket原理


    一、引语

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

    在学习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://zhuanlan.zhihu.com/p/425684137

  • 相关阅读:
    2021.12.7
    2021.12.13(观察者模式c++)
    2021.12.05(echarts生成mysql表词云)
    2021.12.10(申请加分项)
    2021.12.10(课程总结)
    2021.12.11(Linux,yum错误,There are no enabled repos.)
    12月读书笔记02
    2021.12.12(springboot报ScannerException)
    2021.12.09
    centos国内镜像站
  • 原文地址:https://www.cnblogs.com/wangjunjiehome/p/16279601.html
Copyright © 2020-2023  润新知