WebSocket:5分钟从入门到精通

2019-09-21 18:00栏目:WRB前端

WebSocket:5分钟从入门到精通

2018/01/08 · HTML5 · 1 评论 · websocket

原稿出处: 次第猿小卡   

一、内容大概浏览

WebSocket的出现,使得浏览器材有了实时双向通讯的力量。本文由表及里,介绍了WebSocket怎样建设构造连接、沟通数据的内情,以及数据帧的格式。其余,还简介了针对WebSocket的平安攻击,以及和谐是什么样抵挡类似攻击的。

二、什么是WebSocket

HTML5发端提供的一种浏览器与服务器进行全双工通信的互联网技巧,属于应用层左券。它依照TCP传输公约,并复用HTTP的握手通道。

对绝大比很多web开采者来讲,上边这段描述有一点枯燥,其实借使记住几点:

  1. WebSocket可以在浏览器里应用
  2. 支撑双向通讯
  3. 利用很简短

1、有何优点

谈到优点,这里的比较参照物是HTTP合同,总结地说就是:帮忙双向通讯,更加灵活,更加高速,可扩充性越来越好。

  1. 支撑双向通讯,实时性越来越强。
  2. 更加好的二进制匡助。
  3. 非常少的支配开垦。连接创设后,ws客商端、服务端进行数据沟通时,公约决定的数目佳木斯部非常小。在不分邢台部的景况下,服务端到顾客端的信阳唯有2~10字节(取决于数量包长度),顾客端到服务端的来讲,需要丰硕额外的4字节的掩码。而HTTP公约每一回通讯都急需引导完整的尾部。
  4. 补助扩充。ws和谐定义了扩充,客商能够扩张左券,可能完成自定义的子公约。(比方匡助自定义压缩算法等)

对于背后两点,未有色金属切磋所究过WebSocket左券正式的同室只怕知道起来相当不够直观,但不影响对WebSocket的上学和采用。

2、需求学习怎么样东西

对互联网应用层公约的就学来说,最根本的频仍就是连日创设进度数据交流教程。当然,数据的格式是逃不掉的,因为它一向调控了协商本身的力量。好的数目格式能让合同更高效、扩充性越来越好。

下文主要围绕上面几点开展:

  1. 什么创立连接
  2. 何以交流数据
  3. 数据帧格式
  4. 怎么着保持连接

三、入门例子

在标准介绍合同细节前,先来看贰个简练的事例,有个直观感受。例子满含了WebSocket服务端、WebSocket顾客端(网页端)。完整代码能够在 这里 找到。

此间服务端用了ws其一库。相比较大家耳闻则诵的socket.iows贯彻更轻量,更契合学习的目标。

1、服务端

代码如下,监听8080端口。当有新的连天乞求达到时,打字与印刷日志,同一时间向顾客端发送音讯。当接到到来自客商端的新闻时,同样打字与印刷日志。

var app = require('express')(); var server = require('http').Server(app); var WebSocket = require('ws'); var wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', function connection(ws) { console.log('server: receive connection.'); ws.on('message', function incoming(message) { console.log('server: received: %s', message); }); ws.send('world'); }); app.get('/', function (req, res) { res.sendfile(__dirname '/index.html'); }); app.listen(3000);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var app = require('express')();
var server = require('http').Server(app);
var WebSocket = require('ws');
 
var wss = new WebSocket.Server({ port: 8080 });
 
wss.on('connection', function connection(ws) {
    console.log('server: receive connection.');
    
    ws.on('message', function incoming(message) {
        console.log('server: received: %s', message);
    });
 
    ws.send('world');
});
 
app.get('/', function (req, res) {
  res.sendfile(__dirname '/index.html');
});
 
app.listen(3000);

2、客户端

代码如下,向8080端口发起WebSocket连接。连接构建后,打字与印刷日志,同偶尔间向服务端发送音信。接收到来自服务端的音信后,同样打印日志。

1
 

3、运维结果

可个别查看服务端、顾客端的日志,这里不开展。

服务端输出:

server: receive connection. server: received hello

1
2
server: receive connection.
server: received hello

客户端输出:

client: ws connection is open client: received world

1
2
client: ws connection is open
client: received world

四、怎么着建立连接

前面提到,WebSocket复用了HTTP的抓手通道。具体指的是,顾客端通过HTTP央浼与WebSocket服务端协商进级左券。公约晋级成功后,后续的数据沟通则依据WebSocket的商业事务。

1、客商端:申请公约升级

率先,客商端发起公约晋级乞请。能够见到,选拔的是职业的HTTP报文格式,且只扶助GET方法。

GET / HTTP/1.1 Host: localhost:8080 Origin: Connection: Upgrade Upgrade: websocket Sec-WebSocket-Version: 13 Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==

1
2
3
4
5
6
7
GET / HTTP/1.1
Host: localhost:8080
Origin: http://127.0.0.1:3000
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw==

重大呼吁首部意义如下:

  • Connection: Upgrade:表示要提拔左券
  • Upgrade: websocket:表示要晋级到websocket公约。
  • Sec-WebSocket-Version: 13:表示websocket的版本。倘诺服务端不辅助该版本,需求回到贰个Sec-WebSocket-Versionheader,里面含有服务端补助的版本号。
  • Sec-WebSocket-Key:与后边服务端响应首部的Sec-WebSocket-Accept是配套的,提供基本的幸免,例如恶意的接连,大概无意的连接。

潜心,上边伏乞省略了部分非重视央求首部。由于是标准的HTTP央浼,类似Host、Origin、Cookie等乞求首部会照常发送。在握手阶段,能够经过有关诉求首部进行安全范围、权限校验等。

2、服务端:响应公约进级

服务端重回内容如下,状态代码101表示左券切换。到此形成协商晋级,后续的多少交互都遵从新的说道来。

HTTP/1.1 101 Switching Protocols Connection:Upgrade Upgrade: websocket Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=

1
2
3
4
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU=

备注:每个header都以rn末尾,并且最终一行加上多少个额外的空行rn。其余,服务端回应的HTTP状态码只好在握手阶段选拔。过了拉手阶段后,就只能选拔一定的错误码。

3、Sec-WebSocket-Accept的计算

Sec-WebSocket-Accept基于客商端央求首部的Sec-WebSocket-Key总括出来。

计算公式为:

  1. Sec-WebSocket-Key258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼接。
  2. 由此SHA1估测计算出摘要,并转成base64字符串。

伪代码如下:

>toBase64( sha1( Sec-WebSocket-Key 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 ) )

1
>toBase64( sha1( Sec-WebSocket-Key 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 )  )

评释下前面的归来结果:

const crypto = require('crypto'); const magic = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; const secWebSocketKey = 'w4v7O6xFTi36lq3RNcgctw=='; let secWebSocketAccept = crypto.createHash('sha1') .update(secWebSocketKey magic) .digest('base64'); console.log(secWebSocketAccept); // Oy4NRAQ13jhfONC7bP8dTKb4PTU=

1
2
3
4
5
6
7
8
9
10
const crypto = require('crypto');
const magic = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
const secWebSocketKey = 'w4v7O6xFTi36lq3RNcgctw==';
 
let secWebSocketAccept = crypto.createHash('sha1')
    .update(secWebSocketKey magic)
    .digest('base64');
 
console.log(secWebSocketAccept);
// Oy4NRAQ13jhfONC7bP8dTKb4PTU=

五、数据帧格式

客户端、服务端数据的交流,离不开数据帧格式的概念。因而,在实质上解说数据沟通以前,我们先来看下WebSocket的数额帧格式。

WebSocket客户端、服务端通讯的矮小单位是帧(frame),由1个或多个帧组成一条完整的消息(message)。

  1. 出殡端:将音信切割成多少个帧,并发送给服务端;
  2. 接收端:接收新闻帧,并将关乎的帧重新组装成完全的音信;

本节的重要性,正是教课数据帧的格式。详细定义可参照他事他说加以考察 RFC6455 5.2节 。

1、数据帧格式大概浏览

上边给出了WebSocket数据帧的统一格式。熟练TCP/IP合同的同桌对如此的图应该不生疏。

  1. 从左到右,单位是比特。比如FINRSV1各占据1比特,opcode占据4比特。
  2. 剧情包罗了标志、操作代码、掩码、数据、数据长度等。(下一小节会议及展览开)

0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - - - - ------- - ------------- ------------------------------- |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | - - - - ------- - ------------- - - - - - - - - - - -

          • | Extended payload length continued, if payload len == 127 |
              • - - - - - - - - - ------------------------------- | |Masking-key, if MASK set to 1 | ------------------------------- ------------------------------- | Masking-key (continued) | Payload Data | -------------------------------- - - - - - - - - - - - - - - - : Payload Data continued ... : - - - - - - - - - - - - - - - - - - - - -
              • - - - - | Payload Data continued ... | ---------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- - - - ------- - ------------- -------------------------------
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
- - - - ------- - ------------- - - - - - - - - - - - - - - -
|     Extended payload length continued, if payload len == 127  |
- - - - - - - - - - - - - - - -------------------------------
|                               |Masking-key, if MASK set to 1  |
------------------------------- -------------------------------
| Masking-key (continued)       |          Payload Data         |
-------------------------------- - - - - - - - - - - - - - - -
:                     Payload Data continued ...                :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|                     Payload Data continued ...                |
---------------------------------------------------------------

2、数据帧格式详解

针对前边的格式大概浏览图,这里每种字段举办教学,如有不知晓之处,可参照左券正式,或留言调换。

FIN:1个比特。

倘倘诺1,表示那是新闻(message)的末段二个分片(fragment),假若是0,表示不是是音讯(message)的末尾一个分片(fragment)。

RSV1, RSV2, RSV3:各占1个比特。

相似景色下全为0。当客商端、服务端协商选择WebSocket增加时,那七个标记位能够非0,且值的意思由增添举办定义。假若出现非零的值,且并未使用WebSocket增添,连接出错。

Opcode: 4个比特。

操作代码,Opcode的值决定了应当如何深入分析后续的数额载荷(data payload)。如果操作代码是不认得的,那么接收端应该断开连接(fail the connection)。可选的操作代码如下:

  • %x0:表示一个三回九转帧。当Opcode为0时,表示这一次数据传输采取了数额分片,当前收下的数据帧为内部一个数目分片。
  • %x1:表示那是一个文本帧(frame)
  • %x2:表示那是三个二进制帧(frame)
  • %x3-7:保留的操作代码,用于后续定义的非调整帧。
  • %x8:表示连接断开。
  • %x9:表示那是一个ping操作。
  • %xA:表示那是三个pong操作。
  • %xB-F:保留的操作代码,用于后续定义的调节帧。

Mask: 1个比特。

意味着是不是要对数码载荷进行掩码操作。从客商端向服务端发送数据时,须求对数据开展掩码操作;从服务端向客户端发送数据时,无需对数码开展掩码操作。

倘使服务端接收到的多少未有开展过掩码操作,服务端须求断开连接。

假设Mask是1,那么在Masking-key中会定义三个掩码键(masking key),并用这几个掩码键来对数码载荷举行反掩码。全数顾客端发送到服务端的数据帧,Mask都以1。

掩码的算法、用途在下一小节讲授。

Payload length:数据载荷的尺寸,单位是字节。为7位,或7 18人,或1 六拾肆位。

假设数Payload length === x,如果

  • x为0~126:数据的长短为x字节。
  • x为126:后续2个字节代表一个22人的无符号整数,该无符号整数的值为数量的长度。
  • x为127:后续8个字节代表八个64个人的无符号整数(最高位为0),该无符号整数的值为数据的长短。

除此以外,假诺payload length占用了五个字节的话,payload length的二进制表明采纳互连网序(big endian,首要的位在前)。

Masking-key:0或4字节(32位)

具有从客商端传送到服务端的数据帧,数据载荷都实行了掩码操作,Mask为1,且指点了4字节的Masking-key。借使Mask为0,则未有Masking-key。

备考:载荷数据的长短,不包蕴mask key的长短。

Payload data:(x y) 字节

载荷数据:包蕴了扩张数据、应用数据。在那之中,扩充数据x字节,应用数据y字节。

恢宏数据:若无协商使用扩充的话,扩展数据数据为0字节。全部的扩展都必需注明扩大数据的长短,只怕能够什么计算出恢弘数据的长度。其它,扩张怎样运用必须在拉手阶段就研究好。尽管扩大数据存在,那么载荷数据长度必得将扩充数据的长度蕴涵在内。

使用数据:任性的使用数据,在扩大数据之后(假如存在扩张数据),占有了数码帧剩余的岗位。载荷数据长度 减去 扩展数据长度,就拿走应用数据的长度。

3、掩码算法

掩码键(Masking-key)是由顾客端挑选出来的三十八人的随机数。掩码操作不会潜移暗化多少载荷的尺寸。掩码、反掩码操作都利用如下算法:

首先,假设:

  • original-octet-i:为原始数据的第i字节。
  • transformed-octet-i:为转移后的数据的第i字节。
  • j:为i mod 4的结果。
  • masking-key-octet-j:为mask key第j字节。

算法描述为: original-octet-i 与 masking-key-octet-j 异或后,得到transformed-octet-i。

j = i MOD 4
transformed-octet-i = original-octet-i XOR masking-key-octet-j

六、数据传递

假定WebSocket顾客端、服务端建构连接后,后续的操作都以依附数据帧的传递。

WebSocket根据opcode来区分操作的系列。比如0x8意味着断开连接,0x00x2代表数据交互。

1、数据分片

WebSocket的每条消息只怕被切分成四个数据帧。当WebSocket的接收方收到三个数额帧时,会依靠FIN的值来判别,是还是不是曾经接受音讯的末梢三个数据帧。

FIN=1表示最近数据帧为音信的最后四个数据帧,此时接收方已经接收完整的新闻,能够对音讯进行管理。FIN=0,则接收方还亟需继续监听接收其他的数据帧。

此外,opcode在数据沟通的光景下,表示的是数码的品种。0x01意味着文本,0x02表示二进制。而0x00比较奇特,表示延续帧(continuation frame),看名称就能够想到其意义,正是一体化消息对应的数据帧还没接过完。

2、数据分片例子

直接看例子更形象些。上边例子来自MDN,能够很好地示范数据的分片。客商端向服务端一回发送音讯,服务端收到音讯后回应客商端,这里关键看客商端往服务端发送的音讯。

率先条消息

FIN=1, 表示是当前消息的最后三个数据帧。服务端收到当前数据帧后,能够拍卖音讯。opcode=0x1,表示顾客端发送的是文本类型。

其次条消息

  1. FIN=0,opcode=0x1,表示发送的是文件类型,且信息还没发送达成,还应该有后续的数据帧。
  2. FIN=0,opcode=0x0,表示新闻还没发送完毕,还会有后续的数据帧,当前的数据帧供给接在上一条数据帧之后。
  3. FIN=1,opcode=0x0,表示音信一度发送达成,未有承继的数据帧,当前的数据帧须求接在上一条数据帧之后。服务端能够将关乎的数据帧组装成完全的新闻。

Client: FIN=1, opcode=0x1, msg="hello" Server: (process complete message immediately) Hi. Client: FIN=0, opcode=0x1, msg="and a" Server: (listening, new message containing text started) Client: FIN=0, opcode=0x0, msg="happy new" Server: (listening, payload concatenated to previous message) Client: FIN=1, opcode=0x0, msg="year!" Server: (process complete message) Happy new year to you too!

1
2
3
4
5
6
7
8
Client: FIN=1, opcode=0x1, msg="hello"
Server: (process complete message immediately) Hi.
Client: FIN=0, opcode=0x1, msg="and a"
Server: (listening, new message containing text started)
Client: FIN=0, opcode=0x0, msg="happy new"
Server: (listening, payload concatenated to previous message)
Client: FIN=1, opcode=0x0, msg="year!"
Server: (process complete message) Happy new year to you too!

七、连接保持 心跳

WebSocket为了维持客商端、服务端的实时双向通讯,须求保险客户端、服务端之间的TCP通道保持接二连三未有断开。可是,对于长日子未曾多少往来的总是,即使还是长日子维系着,大概会浪费包罗的接连财富。

但不拔除有个别场景,客户端、服务端固然长日子尚未数量往来,但仍亟需保持连续。这年,能够接纳心跳来达成。

  • 发送方->接收方:ping
  • 接收方->发送方:pong

ping、pong的操作,对应的是WebSocket的多个调控帧,opcode分别是0x90xA

比如来讲,WebSocket服务端向客商端发送ping,只要求如下代码(接纳ws模块)

ws.ping('', false, true);

1
ws.ping('', false, true);

八、Sec-WebSocket-Key/Accept的作用

日前提到了,Sec-WebSocket-Key/Sec-WebSocket-Accept在重大要义在于提供基础的幸免,收缩恶意连接、意外接二连三。

效果大概归咎如下:

  1. 幸免服务端收到违规的websocket连接(举例http客户端十分大心哀告连接websocket服务,此时服务端能够一向拒绝连接)
  2. 保证服务端驾驭websocket连接。因为ws握手阶段选拔的是http左券,由此大概ws连接是被五个http服务器管理并再次来到的,此时客商端能够透过Sec-WebSocket-Key来担保服务端认知ws合同。(并不是百分之百保障,举个例子总是存在这么些无聊的http服务器,光管理Sec-WebSocket-Key,但并不曾兑现ws公约。。。)
  3. 用浏览器里提倡ajax须求,设置header时,Sec-WebSocket-Key以及别的连锁的header是被明令禁止的。那样能够幸免顾客端发送ajax乞求时,意外央浼协议晋级(websocket upgrade)
  4. 能够制止反向代理(不知底ws左券)再次回到错误的数量。举例反向代理前后收到四遍ws连接的提高须求,反向代理把首次呼吁的回来给cache住,然后第二次呼吁到来时直接把cache住的伏乞给再次回到(无意义的归来)。
  5. Sec-WebSocket-Key首要指标并非承接保险数据的安全性,因为Sec-WebSocket-Key、Sec-WebSocket-Accept的改换总括公式是当面包车型大巴,并且极度简单,最要紧的功能是严防一些广阔的不测景况(非故意的)。

重申:Sec-WebSocket-Key/Sec-WebSocket-Accept 的折算,只可以带来基本的涵养,但总是是还是不是平安、数据是或不是平安、顾客端/服务端是或不是合法的 ws客商端、ws服务端,其实并从未实际性的有限支撑。

九、数据掩码的法力

WebSocket商业事务中,数据掩码的功用是拉长协商的安全性。但数据掩码并不是为着珍重数量自个儿,因为算法自己是当着的,运算也不复杂。除了加密大道本人,就像并未太多立竿见影的保安通信安全的不二等秘书籍。

那么为何还要引进掩码总结呢,除了扩大Computer器的运算量外就好像并不曾太多的低收入(那也是成都百货上千同室困惑的点)。

答案照旧五个字:安全。但并非为了防止万一数据泄密,而是为了幸免开始的一段时代版本的合计中留存的代理缓存污染攻击(proxy cache poisoning attacks)等主题素材。

1、代理缓存污染攻击

上边摘自2008年关于安全的一段讲话。当中涉及了代理服务器在协商落实上的缺点也许引致的平安主题素材。撞击出处。

“We show, empirically, that the current version of the WebSocket consent mechanism is vulnerable to proxy cache poisoning attacks. Even though the WebSocket handshake is based on HTTP, which should be understood by most network intermediaries, the handshake uses the esoteric “Upgrade” mechanism of HTTP [5]. In our experiment, we find that many proxies do not implement the Upgrade mechanism properly, which causes the handshake to succeed even though subsequent traffic over the socket will be misinterpreted by the proxy.”[TALKING] Huang, L-S., Chen, E., Barth, A., Rescorla, E., and C.

Jackson, "Talking to Yourself for Fun and Profit", 2010,

1
          Jackson, "Talking to Yourself for Fun and Profit", 2010,

在正规描述攻击步骤在此之前,大家倘若有如下参与者:

  • 攻击者、攻击者本人决定的服务器(简称“邪恶服务器”)、攻击者伪造的能源(简称“邪恶财富”)
  • 被害人、受害者想要访问的资源(简称“正义能源”)
  • 受害者实际想要访问的服务器(简称“正义服务器”)
  • 中等代理服务器

攻击步骤一:

  1. 攻击者浏览器 向 凶恶服务器 发起WebSocket连接。依据前文,首先是叁个公约晋级诉求。
  2. 合计升级央浼 实际达到 代理服务器
  3. 代理服务器 将协商进级乞求转载到 狠毒服务器
  4. 暴虐服务器 同意连接,代理服务器 将响应转载给 攻击者

出于 upgrade 的贯彻上有破绽,代理服务器 以为在此以前转载的是常常的HTTP新闻。因而,当合计服务器 同意连接,代理服务器 认为这一次对话已经终止。

攻击步骤二:

  1. 攻击者 在事先创设的连年上,通过WebSocket的接口向 狞恶服务器 发送数据,且数额是周到布局的HTTP格式的文件。个中含有了 同等对待财富 的地方,以及叁个假冒的host(指向公平服务器)。(见前面报文)
  2. 呼吁达到 代理服务器 。即使复用了在此以前的TCP连接,但 代理服务器 以为是新的HTTP须求。
  3. 代理服务器无情服务器 请求 凶狠财富
  4. 惨酷服务器 返回 残暴能源代理服务器 缓存住 凶横财富(url是对的,但host是 正义服务器 的地址)。

到此处,受害者能够登台了:

  1. 受害者 通过 代理服务器 访问 公正服务器公平财富
  2. 代理服务器 检查该财富的url、host,发掘本地有一份缓存(伪造的)。
  3. 代理服务器阴毒能源 返回给 受害者
  4. 受害者 卒。

附:前面提到的细致组织的“HTTP要求报文”。

Client → Server: POST /path/of/attackers/choice HTTP/1.1 Host: host-of-attackers-choice.com Sec-WebSocket-Key: Server → Client: HTTP/1.1 200 OK Sec-WebSocket-Accept:

1
2
3
4
5
Client → Server:
POST /path/of/attackers/choice HTTP/1.1 Host: host-of-attackers-choice.com Sec-WebSocket-Key:
Server → Client:
HTTP/1.1 200 OK
Sec-WebSocket-Accept:

2、当前缓慢解决方案

早期的提案是对数码进行加密管理。基于安全、效能的考虑,最后选拔了折中的方案:对数码载荷举行掩码管理。

需求专一的是,这里只是限量了浏览器对数码载荷举办掩码管理,但是混蛋完全能够兑现和睦的WebSocket顾客端、服务端,不按准绳来,攻击能够照常进行。

只是对浏览器加上这么些限制后,能够大大增添攻击的难度,以及攻击的震慑范围。若无这些限制,只必要在网络放个钓鱼网址骗人去做客,一下子就足以在短期内开展大规模的口诛笔伐。

十、写在后头

WebSocket可写的东西还挺多,例如WebSocket扩张。客商端、服务端之间是哪些协商、使用扩张的。WebSocket扩张能够给协议自己扩张相当多才干和想象空间,比方数据的缩减、加密,以及多路复用等。

篇幅所限,这里先不开展,感兴趣的同窗能够留言调换。小说如有错漏,敬请建议。

十一、相关链接

RFC6455:websocket规范
https://tools.ietf.org/html/r…

行业内部:数据帧掩码细节
https://tools.ietf.org/html/r…

正式:数据帧格式
https://tools.ietf.org/html/r…

server-example
https://github.com/websockets…

编写websocket服务器
https://developer.mozilla.org…

对网络基础设备的攻击(数据掩码操作所要防备的事情)
https://tools.ietf.org/html/r…

Talking to Yourself for Fun and Profit(含有攻击描述)
http://w2spconf.com/2011/pape…

What is Sec-WebSocket-Key for?
https://stackoverflow.com/que…

10.3. Attacks On Infrastructure (Masking)
https://tools.ietf.org/html/r…

Talking to Yourself for Fun and Profit
http://w2spconf.com/2011/pape…

Why are WebSockets masked?
https://stackoverflow.com/que…

How does websocket frame masking protect against cache poisoning?
https://security.stackexchang…

What is the mask in a WebSocket frame?
https://stackoverflow.com/que…

1 赞 3 收藏 1 评论

图片 1

版权声明:本文由威尼斯人app发布于WRB前端,转载请注明出处:WebSocket:5分钟从入门到精通