| |
|
开发:
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的计算方法: 而得到的响应头中重要的字段: 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一样,可以边生成数据边传递消息,即提高传输效率。
参数说明如下: 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地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |