介绍了WebSocket如何建立连接、交换数据的细节

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: http://127.0.0.1:3000
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都以\r\n终极,并且最终一行加上一个附加的空行\r\n。其余,服务端回应的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+16位,或1+64位。

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

  • x为0~126:数据的长短为x字节。
  • x为126:后续2个字节代表一个16位的无符号整数,该无符号整数的值为数量的长度。
  • 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)是由客户端挑选出去的32位的随机数。掩码操作不会影响多少载荷的长度。掩码、反掩码操作都施用如下算法:

首先,假设:

  • 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共商中,数据掩码的效率是增强协商的安全性。但数据掩码并不是为着珍惜数量本身,因为算法本身是公开的,运算也不复杂。除了加密通道本身,似乎并未太多立竿见影的保护通信安全的方法。

这就是说为何还要引入掩码总括呢,除了扩展总括机器的运算量外似乎并从未太多的进项(这也是很多同学疑惑的点)。

答案仍然五个字:安全。但并不是为着防备数据泄密,而是为了防备早期版本的商事中设有的代办缓存污染攻击(proxy
cache poisoning attacks)等问题。

1、代理缓存污染攻击

下面摘自二〇一〇年关于安全的一段讲话。其中提到了代理服务器在情商落实上的缺点或者引致的平安题材。撞倒出处

“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

相关文章