浅析WebSocket 原理

    长恨此身非我有,何时忘却营营。

简介:先简单了解下WebSocket 原理,日后的使用中再进一步深入研究~

一、什么是WebSocket

WebSocket 是HTML5 开始提供的一种在单个TCP 连接上进行全双工通讯的协议,其最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,属于双向平等对话。更深层次的解释就是WebSocket 是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。也就是说WebSocket 分为握手和数据传输阶段,即进行了HTTP握手 + 双工的TCP连接,当然还有关闭连接。

二、WebSocket 应用场景

1、直播发弹幕、身份认证。

2、社交订阅。

3、多玩家游戏。

4、协通编辑/编程。

5、点击流数据。

6、股票基金报价。

7、体育实况更新。

8、多媒体聊天。

9、基于位置的应用。

10、在线教育等。

三、WebSocket 特点

  • 建立在 TCP 协议之上,服务器端的实现比较容易。

  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

  • 数据格式比较轻量,性能开销小,通信高效。

  • 可以发送文本,也可以发送二进制数据。

  • 没有同源限制,客户端可以与任意服务器通信。

  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

四、WebSocket 协议内容

WebSocket 最新的协议是 13 RFC 6455。协议主要包括两个部分,一个是握手的规则,另一个是数据传输的方式及载体格式。

WS连接生命周期

五、握手阶段

因为 WebSocket 是基于 HTTP 协议的,它借用了 HTTP 协议来完成一部分握手。

所以,握手阶段WebSocket 首先发起一个 HTTP 请求,在请求头加上 Upgrade 字段,该字段用于改变 HTTP 协议版本或者是换用其他协议,把 Upgrade 的值设为 websocket ,即将它升级为 WebSocket 协议。

一个典型的 WebSocket 握手:

1 GET /chat HTTP/1.1
2 Host: server.example.com
3 Upgrade: websocket
4 Connection: Upgrade
5 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
6 Sec-WebSocket-Protocol: chat, superchat
7 Sec-WebSocket-Version: 13
8 Origin: http://example.com

熟悉 HTTP 的一眼就可以看出这段类似 HTTP 协议的握手请求中,多了Upgrade、Connection、Sec-WebSocket-Key、Sec-WebSocket-Protocol、Sec-WebSocket-Version 几个属性。

1 Upgrade: websocket
2 Connection: Upgrade

这几个属性就是 WebSocket 的核心了,Upgrade:websocket属性通知 Apache 、 Nginx 等服务器,此次发起的请求要用 WebSocket 协议,而不是http。

1 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
2 Sec-WebSocket-Protocol: chat, superchat
3 Sec-WebSocket-Version: 13

Sec-WebSocket-Key 字段,它由客户端生成并发给服务端,用于证明服务端接收到的是一个可受信的连接握手,可以帮助服务端排除自身接收到的由非 WebSocket 客户端发起的连接,该值是一串随机经过 base64 编码的字符串。即该字段用于验证服务器端是否采用WebSocket 协议。

收到请求后,服务端做一次响应:

1 HTTP/1.1 101 Switching Protocols
2 Upgrade: websocket
3 Connection: Upgrade
4 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
5 Sec-WebSocket-Protocol: chat

响应里面重要的是 Sec-WebSocket-Accept ,服务端通过从客户端请求头中读取 Sec-WebSocket-Key 与一串全局唯一的标识字符串(俗称魔串)“258EAFA5-E914-47DA- 95CA-C5AB0DC85B11”做拼接,生成长度为160位的 SHA-1 字符串,然后进行 base64 编码,作为 Sec-WebSocket-Accept 的值回传给客户端。

此时成功建立了WebSocket 连接,Upgrade:websocket 字段也标志着这里开始就是 HTTP 最后负责的区域了,通知客户端服务端已切换为WebSocket 协议。至此,HTTP 已经完成它所有工作了,接下来就是完全按照 WebSocket 协议进行了。

六、数据传输阶段

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

  • 1、大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。
  • 2、和http 的chunk 一样,可以边生成数据边传递消息,极大提高了传输效率。

websocket传输协议图

吃透WebSocket 传输协议图请听下回分解~

七、WebSocket 初体验

后端使用SpringBoot,前端使用VUE,通过WebSocket 实现后端发送讯息,前端接收到讯息后即刻播放声音提示。

完整项目链接:https://www.cnblogs.com/taojietaoge/p/14980331.html

长恨此身非我有

        何时忘却营营

 

浅析WebSocket 原理的更多相关文章

  1. WebSocket原理

    一 . WebSocket原理 1.1.背景 WebSocket 是基于Http 协议的改进,Http 为无状态协议,基于短连接,需要频繁的发起请求,第二 Http 只能客户端发起请求,服务端无法主动 ...

  2. python全栈开发day115、116-websocket、websocket原理、websocket加解密、简单问答机器人实现

    1.websocket 1.websocket 与轮询 轮询: 不断向服务器发起询问,服务器还不断的回复 浪费带宽,浪费前后端资源 保证数据的实时性 长轮询: 1.客户端向服务器发起消息,服务端轮询, ...

  3. WebSocket原理与实践(四)--生成数据帧

    WebSocket原理与实践(四)--生成数据帧 从服务器发往客户端的数据也是同样的数据帧,但是从服务器发送到客户端的数据帧不需要掩码的.我们自己需要去生成数据帧,解析数据帧的时候我们需要分片. 消息 ...

  4. WebSocket原理与实践(三)--解析数据帧

    WebSocket原理与实践(三)--解析数据帧 1-1 理解数据帧的含义:   在WebSocket协议中,数据是通过帧序列来传输的.为了数据安全原因,客户端必须掩码(mask)它发送到服务器的所有 ...

  5. WebSocket原理与实践(二)---WebSocket协议

    WebSocket原理与实践(二)---WebSocket协议 WebSocket协议是为了解决web即时应用中服务器与客户端浏览器全双工通信问题而设计的.协议定义ws和wss协议,分别为普通请求和基 ...

  6. WebSocket原理与实践(一)---基本原理

    WebSocket原理与实践(一)---基本原理 一:为什么要使用WebSocket?1. 了解现有的HTTP的架构模式:Http是客户端/服务器模式中请求-响应所用的协议,在这种模式中,客户端(一般 ...

  7. python 全栈开发,Day139(websocket原理,flask之请求上下文)

    昨日内容回顾 flask和django对比 flask和django本质是一样的,都是web框架. 但是django自带了一些组件,flask虽然自带的组件比较少,但是它有很多的第三方插件. 那么在什 ...

  8. websocket 原理

    自己写一个websocket import socket, hashlib, base64 sock = socket.socket() sock.bind(('127.0.0.1', 9000)) ...

  9. WebSocket原理说明

    WebSocket原理说明 众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应 ...

随机推荐

  1. Ubuntu 20.04 版本安装

    Ubuntu 20.04 版本安装 安装步骤 首先创建好Ubuntu 20.04虚拟机 等待系统检查完整性 选择语言 选择不更新,回车确定 键盘语言默认即可 网卡IP配置 设置代理服务器 设置源 自定 ...

  2. TcaplusDB君 · 行业新闻汇编(5月25日)

    TcaplusDB君一直密切关注着游戏行业和数据库行业的动态.以下是TcaplusDB君收集的近期的游戏行业和数据库行业的新闻,汇编整理,献给大家观看. (本篇文章部分内容来自网络) 第十一届中国数据 ...

  3. [leetcode] 39. 组合总和(Java)(dfs、递归、回溯)

    39. 组合总和 直接暴力思路,用dfs+回溯枚举所有可能组合情况.难点在于每个数可取无数次. 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(c ...

  4. 摄像头Camera 标定Calibration原理Theory

    摄像头Camera 标定Calibration原理Theory cv2.cameraCalibration Pinhole camera calibration calls camera vision ...

  5. MegEngine亚线性显存优化

    MegEngine亚线性显存优化 MegEngine经过工程扩展和优化,发展出一套行之有效的加强版亚线性显存优化技术,既可在计算存储资源受限的条件下,轻松训练更深的模型,又可使用更大batch siz ...

  6. 汽车HUD(Head-up Display)的技术难点

    汽车HUD(Head-up Display)的技术难点 首先解析一下HUD是什么原理吧.其实就是把车的前挡风玻璃当成反射镜,在驾驶员人眼前投射一个仪表盘的虚像.图像本身来自下方的电子发光屏,发出仪表盘 ...

  7. Docker_Swarm集群系统

    Docker_Swarm集群系统 一.Docker Swarm 介绍 实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernete ...

  8. NVIDIA DRIVE AGX开发工具包

    NVIDIA DRIVE AGX开发工具包 英伟达drive AGX开发工具包提供了开发生产级自主车辆(AV)所需的硬件.软件和示例应用程序.NVIDIA DRIVE AGX系统建立在汽车产品级芯片上 ...

  9. 用NVIDIA NsightcComputeRoofline分析加速高性能HPC的应用

    用NVIDIA NsightcComputeRoofline分析加速高性能HPC的应用 编写高性能的软件不是一件简单的任务.当有了可以编译和运行的代码之后,当您尝试并理解它在可用硬件上的执行情况时,将 ...

  10. ADAS车辆在行人安全方面得分很低

    ADAS车辆在行人安全方面得分很低 ADAS vehicles score poorly on pedestrian safety 对于热衷于自动驾驶汽车(AV)的狂热者来说,一个现在病毒性的视频片段 ...