美文网首页QiShare文章汇总
今天,我们来探一探WebSocket原理

今天,我们来探一探WebSocket原理

作者: QiShare | 来源:发表于2020-02-10 20:25 被阅读0次

级别:★★☆☆☆
标签:「WebSocket」「Starscream」
作者: 647
审校: 沐灵洛


前言:
前段时间,在公司的项目中用到了WebSocket,当时没有时间好好整理。
最近,趁着有时间,就好好梳理了一下WebSocket的相关知识。


本篇将介绍以下内容:
1、什么是WebSocket
2、WebSocket使用场景
3、WebSocket底层原理(协议)
4、iOSWebSocket的相关框架


一、什么是 WebSocket ?

WebSocket = “HTTP第1次握手” + TCP的“全双工“通信 的网络协议。

主要过程:

  • 首先,通过HTTP第一次握手保证连接成功。
  • 其次,再通过TCP实现浏览器与服务器全双工(full-duplex)通信。(通过不断发ping包、pang包保持心跳)

最终,使得 “服务端” 拥有 “主动” 发消息给 “客户端” 的能力。

这里有几个重点:

  1. WebSocket是基于TCP的上部应用层网络协议。
  2. 它依赖于HTTP的第一次握手成功 + 之后的TCP双向通信。

二、WebSocket 应用场景

1. IM(即时通讯)

典型例子:微信、QQ等
当然,用户量如果非常大的话,仅仅依靠WebSocket肯定是不够的,各大厂应该也有自己的一些优化的方案与措施。但对于用户量不是很大的即时通讯需求,使用WebSocket是一种不错的方案。

2. 游戏(多人对战)

典型例子:王者荣耀等(应该都玩过)

3. 协同编辑(共享文档)

多人同时编辑同一份文档时,可以实时看到对方的操作。
这时,就用上了WebSocket

4. 直播/视频聊天

对音频/视频需要较高的实时性。

5. 股票/基金等金融交易平台

对于股票/基金的交易来说,每一秒的价格可能都会发生变化。

6. IoT(物联网 / 智能家居)

例如,我们的App需要实时的获取智能设备的数据与状态。
这时,就需要用到WebSocket

......
等等等等

只要是一些对 “实时性” 要求比较高的需求,可能就会用到WebSocket


三、WebSocket 底层原理

WebSocket是一个网络上的应用层协议,它依赖于HTTP协议的第一次握手,握手成功后,数据就通过TCP/IP协议传输了。

WebSocket分为握手阶段和数据传输阶段,即进行了HTTP一次握手 + 双工的TCP连接。

1、握手阶段

首先,客户端发送消息:

GET /chat HTTP/1.1
Host: server.qishare.org
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://qishare.org
Sec-WebSocket-Version: 13

然后,服务端返回消息:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

这里值得注意的是Sec-WebSocket-Accept的计算方法:
base64(hsa1(sec-websocket-key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11))

  • 如果这个Sec-WebSocket-Accept计算错误,浏览器会提示:Sec-WebSocket-Accept dismatch
  • 如果返回成功,Websocket就会回调onopen事件

2、传输阶段

WebSocket是以 frame 的形式传输数据的。
比如会将一条消息分为几个frame,按照先后顺序传输出去。

这样做会有几个好处:

  • 较大的数据可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。
  • HTTPchunk一样,可以边生成数据边传递消息,即提高传输效率。

WebSocket传输过程使用的报文,如下所示:

具体的参数说明如下:

  • FIN(1 bit):
    表示信息的最后一帧,flag,也就是标记符。
    PS:当然第一个消息片断也可能是最后的一个消息片断;

  • RSV1、RSV2、RSV3(均为1 bit):
    默认均为0。如果有约定自定义协议则不为0,一般均为0。(协议扩展用)

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

操作码 含义
%x0 连续消息片断
%x1 文本消息片断
%x2 二进制消息片断
%x3-7 (预留位)为将来的非控制消息片断保留的操作码。
%x8 连接关闭
%x9 心跳检查ping
%xA 心跳检查pong
%xB-F (预留位)为将来的控制消息片断的保留操作码。
  • Mask(1 bit):
    是否传输数据添加掩码。
    若为1,掩码必须放在masking-key区域。(后面会提到..)
    注:客户端给服务端发消息Mask值均为1

  • Payload length:
    Payload字段用来存储传输数据的长度。

本身Payload报文字段的大小可能有三种情况:7 bit7+16 bit7+64 bit

第一种:7 bit,表示从0000000 ~ 1111101(即0~125),表示当前数据的length大小(较小数据,最大长度为125)。

第二种:(7+16) bit:前7位为1111110(即126)126代表后面会跟着2个字节无符号数,用来存储数据length大小(长度最小126,最大为65 535)。

第三种:(7+64) bit:前7位为1111111(即127)127代表后面会跟着8个字节无符号数,用来存储数据length大小(长度最小为65536,最大为2^16-1)。

Payload报文长度 所传输的数据大小区间
7 bit [ 0, 125]
7 +16 bit [ 126 , 65535]
7 + 64 bit [ 65536, 2^16 -1]

说明:
传输数据的长度,以字节的形式表示:7位、7+16位、或者7+64位。
1)如果这个值以字节表示是0-125这个范围,那这个值就表示传输数据的长度;
2)如果这个值是126,则随后的2个字节表示的是一个16进制无符号数,用来表示传输数据的长度;
3)如果这个值是127,则随后的是8个字节表示的一个64位无符号数,这个数用来表示传输数据的长度。

  • Masking-key(0 bit / 4 bit):
    0 bit:说明mask值不为1,无掩码。
    4 bit:说明mask值为1,添加掩码。

PS:客户端发送给服务端数据时,mask均为1。
同时,Masking-key会存储一个32位的掩码。

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

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

  • Application data(y byte):
    任意的应用数据,放在扩展数据之后。
    应用数据的长度 = 负载数据的长度 - 扩展数据的长度
    即:Application data = Payload data - Extension data


四、iOS 中 WebSocket 相关框架

WebSocket(iOS客户端):
Socket(iOS客户端):

下一篇,我们将用Starscream写一个简单的客户端WebSocket Demo。

相关参考链接:
《微信,QQ这类IM app怎么做——谈谈Websocket》(冰霜大佬)
《WebSocket的实现原理》 `


小编微信:可加并拉入《QiShare技术交流群》。

关注我们的途径有:
QiShare(简书)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公众号)

推荐文章:
用 Swift 进行贝塞尔曲线绘制
Swift 5.1 (11) - 方法
Swift 5.1 (10) - 属性
iOS App后台保活
奇舞周刊

相关文章

  • 今天,我们来探一探WebSocket原理

    级别:★★☆☆☆标签:「WebSocket」「Starscream」作者: 647 审校: 沐灵洛 前言:前段时...

  • WebSocket 双端实践(iOS/Golang)

    上一篇:《今天我们来聊一聊WebSocket》 主要介绍了WebSocket的原理、应用场景等等。 本篇将介绍W...

  • websocket + node.js

    websocket的原理和应用 在继续本文之前,让我们了解下websocket的原理: websocket通信协议...

  • 从源码角度解析悬浮窗

    今天我们从源码角度来一探 Android 悬浮窗的究竟。 一、如何创建一个悬浮窗 在 AndroidManifes...

  • 从零开始学SpringBoot之SpringBoot WebSo

    前言: 这节我们介绍下WebSocket的原理。 一、websocket与http WebSocket是HTML5...

  • 通经络减肥到底是什么?

    现在市面上流行的不再是排毒,排宿便,而是上面提到的减肥法。那么它效果到底怎么样,是什么原理呢。今天由我来带大家一探...

  • WebSocket 原理

    今天来讲一下WebSocket的原理,能让你更深入的去了解WebSocket,深知其原理,才能更好的去使用它。 ...

  • 两个程序间通信(二):WebSocket

    素材来源:WebSocket 是什么原理?为什么可以实现持久连接 WebSocket是HTML5出来的东西(协议)...

  • 山河锦绣,我来一探

    人间一趟,看看太阳。 山河锦绣,当奋而往。 我只是普普通通的一个学生,进入简书,也只是想写下一家之言,记录下生活的...

  • WebSocked 基本用法

    WebSocket 原理 创建 WebSocket 对象。 Socket.readyState属性 WebSock...

网友评论

    本文标题:今天,我们来探一探WebSocket原理

    本文链接:https://www.haomeiwen.com/subject/bzszxhtx.html