一文带你了解什么是websocket
百度内推,可文末扫码加微信
一、websocket简介:
websocket,顾名思义就是web端的socket,其作用就是给web端提供了与httpserver端之间的长连接,使得httpserver在建立连接的任何时候都可以主动通知web页面事件,如果没有此协议存在的话,web端需要不断的通过轮询的方式去查询一些服务器端的状态。websocket的之下使用的是我们传输层的tcp协议,我们知道任何通信协议都有其协议规则,只要搞清楚了其协议内容就可以知道怎么运用协议进行编程,章节2就是websocket协议整个内容及详解。
二、websocket协议:
图1
websocket的整个协议内容如图1所示:
想要实现此协议,我们需要弄明白协议中每个字段的作用,下面对每个字段做详细介绍。
FIN : 占1位,数据是否已经发送完成的标志,如为1,表示负载数据是全部数据已经收齐,如为0,表示负载数据还未收齐,需要继续收接下来的数据。
RSV1-RSV3:各占一位,预留字段,为留作后续扩展使用。
操作码:占4位,用来标识后续负载是什么类型的数据,常用操作码:
①0x0 码表示是连续数据帧,接收端需要不断接受0x0码标识的负载数据直到FIN变为1;
②0x1 码表示是文本数据
③0x2 码表示是二进制数据
④0x9 码是ping,与pong一起来维护心跳的数据。
⑤0xa 码是pong,与ping一起来维护心跳的数据。
⑥0x8 码是一方主动关闭websocket的时候发送的数据。
MASK:占1位,是否开启掩码的标志,如为1,表示开启掩码运算,如为0,表示不开启掩码运算,这里客户端必须要开启掩码,即必须设置为1。这里的掩码运算是将负载中的数据与掩码值做 异或运算以得出真实的数据。
负载长度:占7位,如果负载长度小于126,则表示负载数据的实际大小;如果等于126,则表示有扩展负载长度字段,且扩展长度字段占16位;如果等于127,则表示有扩展负载长度字段,且 扩展负载字段占64位。如果有扩展负载字段,那么扩展负载字段才是真正的负载数据大小。
扩展负载长度:占0位或16或64位,占位大小取决于上述负载长度的大小。负载长度小于126,占0位,无扩展负载长度;负载长度等于126,扩展负载长度占16位;负载长度等于127,扩展负 载长度占64位。与负载长度字段一起标识了负载数据的实际大小。
掩码值:占32位,要参与掩码运算的值,在MASK位置1的前提下有效,且客户端发送过来的websocket数据一定是带有掩码值的。
负载数据:负载数据的实际占位大小由上述的负载长度和扩展负载长度共同决定。有效数据在此存放。
注意:上述内容在编程的时候要注意的内容如下:
①FIN字段,每次在接收完数据后要判断FIN是否为1,不为1要继续收数据
②MASK字段,如果是客户端该字段必须为1,否则接收到客户端为非1的MASK数据直接丢弃。
③负载数据长度是由负载长度和扩展负载长度共同决定的,是在动态变化的,在编程时先计算负载长度大小,由负载长度的大小才能计算出实际的负载数据长度。
④掩码值是用来对有效数据进行编码的,服务器端在收到之后必须对有效数据进行解码,解码的算法其实就是一个简单的异或运算。
三、websocket过程:
websocket在建立连接的时候首先是发送的http请求进行握手,握手请求成功之后就会变成长连接进行普通的socket通信。具体步骤如下:
①客户端(网页)发起http握手请求,请求内容如下:
GET /chat HTTP/1.1 (http请求行,GET方法,协议是http1.1版本)
Host: example.com:8000 (请求头,指定访问的主机,这里假设是example.com:8000)
Upgrade: websocket (升级协议为websocket)
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== (websocket key)
Sec-WebSocket-Version: 13
②服务器收到握手请求后应答如下:
HTTP/1.1 101 Switching Protocols (应答行,协议是http1.1版本)
Upgrade: websocket (升级协议为websocket)
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= (该字段是请求中Sec-WebSocket-Key经过sha签名然后base64编码之后的内容)
③若上述都成功后则建立起普通的socket长连接,这个时候不论是服务器还是客户端都可以给对方在任意时刻发送数据。
扫一扫,可加楼主微信,一起交流C语言,嵌入式等IT技术。
声明:图文原创,码字不易,版权必究,编辑转载请注明链接出处与原作者。
一文带你了解什么是websocket相关推荐
- linux awk语法格式,Awk是什么?一文带运维小白快速掌握Linux Awk用法
原标题:Awk是什么?一文带运维小白快速掌握Linux Awk用法 作者:a8 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以 ...
- DNN、RNN、CNN.…..一文带你读懂这些绕晕人的名词
DNN.RNN.CNN.-..一文带你读懂这些绕晕人的名词 https://mp.weixin.qq.com/s/-A9UVk0O0oDMavywRGIKyQ 「撞脸」一直都是娱乐圈一大笑梗. 要是买 ...
- 一文带你深入理解JVM内存模型
一文带你深入理解JVM内存模型 一.JAVA的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物 ...
- 训练的神经网络不工作?一文带你跨过这37个坑
近日,Slav Ivanov 在 Medium 上发表了一篇题为<37 Reasons why your Neural Network is not working>的文章,从四个方面(数 ...
- 还不会ts?一文带你打开ts的大门
一文带你打开ts的大门 序言 一.什么是TypeScript? 1.编程语言的类型 2.TypeScript究竟是什么? 二.为什么要学习TypeScript? 1.程序更容易理解 2.效率更高 3. ...
- 一文带你了解Java Agent
转载自 一文带你了解Java Agent Java Agent这个技术,对于大多数同学来说都比较陌生,像个黑盒子.但是多多少少又接触过,实际上,我们平时用的很多工具,都是基于Java Agent实现 ...
- 一文带你理解Java中Lock的实现原理
转载自 一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...
- pyecharts对于经纬度_一文带你掌握Pyecharts地理数据可视化的方法
本文主要介绍了Pyecharts地理数据可视化,分享给大家,具体如下: 一.Pyecharts简介和安装 1. 简介 Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计, ...
- python中集合运算_入门 | 一文带你了解Python集合与基本的集合运算
原标题:入门 | 一文带你了解Python集合与基本的集合运算 选自DataCamp 作者:Michael Galarnyk 参与:Geek Ai.思源 一般我们熟悉 Python 中列表.元组及字典 ...
最新文章
- oracle取_后的数字,聊聊四种Oracle数字取整函数
- python 下载网页文件_『如何用python把网页上的文本内容保存下来』python爬取网页内容教程...
- MongoDB最简单的入门教程之五-通过Restful API访问MongoDB
- aspose转pdf横版_aspose实现Office转Pdf
- Pycharm设置开发模板/字体大小/背景颜色 - Python零基础入门教程
- c语言学习与应用 北京邮电大学出版社,《C语言程序设计与应用》低价购书_计算机与互联网_孔网...
- 1.13编程基础之综合应用_14求满足条件的3位数
- data自定义属性获取方法和设置
- [学习笔记] [数据分析] 01.Python入门
- Python_基础1
- 三菱FX PLC编程口通讯协议详解
- process.start打开后没有界面_越狱后安装这些美化插件,让手机变好看
- 虚拟机VM12磁盘扩容
- 玩玩socket-socket是什么意思
- js使用cookie实现7天免登录
- enumerate用法
- gic_architecture_specification解读一
- 运维必看,zabbix详细攻略,监控原理、监控流程、部署流程
- java11的新特性
- ygomobile卡组下载网站_YGOMobile:用手机也能免费玩游戏王