IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> WebSocket协议学习 -> 正文阅读

[网络协议]WebSocket协议学习

什么是WebSocket

首先,我们需要弄明白,WebSocket本质上一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。

我们知道http协议本身是无状态协议,每一个新的http请求,只能通过客户端主动发起,通过 建立连接-->传输数据-->断开连接 的方式来传输数据,传送完连接就断开了,也就是这次http请求已经完全结束了(虽然http1.1增加了keep-alive请求头可以通过一条通道请求多次,但本质上还是一样的)。

并且服务器是不能主动给客户端发送数据的(因为之前的请求得到响应后连接就断开了,之后服务器根本不知道谁请求过),客户端也不会知道之前请求的任何信息。

所以说,http协议本身是没有持久通信能力的,但是我们在实际的应用中,是很需要这种能力的,所以WebSocket协议由此而生,于2011年被IETF定为标准RFC6455,并被RFC7936所补充规范。

并且在HTML5标准中增加了有关WebSocket协议的相关api,所以只要实现了HTML5标准的客户端,就可以与支持WebSocket协议的服务器进行全双工的持久通信了。

ps1:这里的持久通信能力指的是协议本身的能力,我们当然可以通过编程的方式实现这种功能,比如轮询的方式,但谁不喜欢原生就支持呢?

ps2:计算机网络里还有socket关键字,这里的socket指的是运输层协议的某一端,泛指某个应用程序。

ps3: unix编程里还有一个socket接口,这里的译名是套接字,泛指应用层协议的端口号。

WebSocket协议的原理

与http协议一样,WebSocket协议也需要通过已建立的TCP连接来传输数据。具体实现上是通过http协议建立通道,然后在此基础上用真正的WebSocket协议进行通信,所以WebSocket协议和http协议是有一定的交叉关系的。

WebSocket 的实现分为握手,数据发送/读取,关闭连接。

WebSocket的URI格式:

ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]

wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]

用于“WS”的默认端口是80,而用于“WSS”默认端口是443。

实际上wss对应的是HTTPS,使用SSL证书加密。

下面是WebSocket协议请求头:

其中请求头中重要的字段:

Connection:Upgrade

Upgrade:websocket

Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits

Sec-WebSocket-Key:mg8LvEqrB2vLpyCNnCJV3Q==

Sec-WebSocket-Version:13

1. Connection和Upgrade字段告诉服务器,客户端发起的是WebSocket协议请求

2. Sec-WebSocket-Extensions表示客户端想要表达的协议级的扩展

3. Sec-WebSocket-Key是一个Base64编码值,由浏览器随机生成

4. Sec-WebSocket-Version表明客户端所使用的协议版本

这里值得注意的是Sec-WebSocket-Accept的计算方法:
base64(hsa1(sec-websocket-key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11))
如果这个Sec-WebSocket-Accept计算错误浏览器会提示:Sec-WebSocket-Accept dismatch
如果返回成功,Websocket就会回调onopen事件

而得到的响应头中重要的字段:

Connection:Upgrade

Upgrade:websocket

Sec-WebSocket-Accept:AYtwtwampsFjE0lu3kFQrmOCzLQ=

1. Connection和Upgrade字段与请求头中的作用相同

2. Sec-WebSocket-Accept表明服务器接受了客户端的请求

Status Code:101 Switching Protocols

并且http请求完成后响应的状态码为101,表示切换了协议,说明WebSocket协议通过http协议来建立运输层的TCP连接,之后便与http协议无关了。

WebSocket协议具体内容请参考:https://github.com/zhangkaitao/websocket-protocol

协议定义说明

Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处:

a、大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。

b、和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。


websocket传输使用的协议如下图:

参数说明如下:

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

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

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

* ?%x0 表示连续消息片断

* ?%x1 表示文本消息片断

* ?%x2 表未二进制消息片断

* ?%x3-7 为将来的非控制消息片断保留的操作码

* ?%x8 表示连接关闭

* ?%x9 表示心跳检查的ping

* ?%xA 表示心跳检查的pong

* ?%xB-F 为将来的控制消息片断的保留操作码

Mask: 1位,定义传输的数据是否有加掩码,如果设置为1,掩码键必须放在masking-key区域,客户端发送给服务端的所有消息,此位的值都是1;

Payload length: 传输数据的长度,以字节的形式表示:7位、7+16位、或者7+64位。如果这个值以字节表示是0-125这个范围,那这个值就表示传输数据的长度;如果这个值是126,则随后的两个字节表示的是一个16进制无符号数,用来表示传输数据的长度;如果这个值是127,则随后的是8个字节表示的一个64位无符合数,这个数用来表示传输数据的长度。多字节长度的数量是以网络字节的顺序表示。负载数据的长度为扩展数据及应用数据之和,扩展数据的长度可能为0,因而此时负载数据的长度就为应用数据的长度。

Masking-key: 0或4个字节,客户端发送给服务端的数据,都是通过内嵌的一个32位值作为掩码的;掩码键只有在掩码位设置为1的时候存在。

Payload data: (x+y)位,负载数据为扩展数据及应用数据长度之和。

Extension data: x位,如果客户端与服务端之间没有特殊约定,那么扩展数据的长度始终为0,任何的扩展都必须指定扩展数据的长度,或者长度的计算方式,以及在握手时如何确定正确的握手方式。如果存在扩展数据,则扩展数据就会包括在负载数据的长度之内。

Application data: y位,任意的应用数据,放在扩展数据之后,应用数据的长度=负载数据的长度-扩展数据的长度。

WebSocket协议的优缺点

优点:

· WebSocket协议一旦建议后,互相沟通所消耗的请求头是很小的

· 服务器可以向客户端推送消息了

缺点:

· 少部分浏览器不支持,浏览器支持的程度与方式有区别

WebSocket协议的应用场景

·?即时聊天通信

· 多玩家游戏

· 在线协同编辑/编辑

· 实时数据流的拉取与推送

· 体育/游戏实况

· 实时地图位置

WebSocket插件和抓包

Chrome浏览器插件

下载浏览器的客户端插件:

https://www.crx4chrome.com/extensions/mdmlhchldhfnfnkfmljgeinlffmdgkjo/

打开浏览器的扩展程序管理器,将crx文件拖到上面就会自动安装。

打开开发者模式后,在浏览器右上角就会出现插件的图标,点击就可以打开插件。

打开插件后如下,输入服务器的URL:ws://192.168.3.177/api/im?userid=3ebb84bb-d6b8-cbde-b176-39fcbf691120&activityid=8ea059d6-47e2-e263-df24-39fd7221c432,66629733,点击Connect按钮连接服务器,如果连接成功,则会显示OPENED。

在连接状态中,输入json格式数据或者json字符串,点击Send按钮发送数据,下面红色显示的就是发送的数据,黑色字体的数据是接收到的数据。

如果没有WebSocket连接的相关信息,则需要我们自己抓包进行分析查看,目前Chrome浏览器也是支持抓取WebSocket数据的。按F12打开开发者模式,选择Network标签,WebSocket客户端连接服务器,左侧可以看到所有网络请求,点击连接请求,右侧自动打开解析数据的面板,可以查看请求和响应的详细说明,例如URL,请求和响应的头信息,请求的参数等。

发送接收数据,点击右侧面板的Messages标签,可以查看发送和接收的消息详情。

Python的WebSockets模块

安装WebSockets模块:

pip install websockets

客户端实现简单例子,功能如下:

建立和服务器的连接。

发送json字符串消息。

接收服务端发送过来的消息。

退出关闭连接。

Jmeter的WebSocket插件

在插件管理器中搜索WebSocket,就可以找到插件,然后安装重启。

在sampler列表中就会有WebSocket相关的6个samplers,这些sampler可以根据测试的需要进行自由组合使用。

WebSocket Close:关闭连接

WebSocket Open Connection:打开连接

WebSocket Ping/Pong:心跳

WebSocket Single Read Sampler:只读(接收)

WebSocket Single Write Sampler:只写(发送)

WebSocket request-response Sampler:发送和接收

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 21:21:43  更:2021-07-07 21:21:59 
 
开发: 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/25 17:53:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码