>

5秒钟从入门到明白

- 编辑:www.bifa688.com -

5秒钟从入门到明白

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 13个人,或1 六11个人。

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

  • x为0~126:数据的长短为x字节。
  • x为126:后续2个字节代表多少个15个人的无符号整数,该无符号整数的值为多少的尺寸。
  • x为127:后续8个字节代表几个63位的无符号整数(最高位为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)是由顾客端挑选出来的30位的随机数。掩码操作不会潜移默化多少载荷的长短。掩码、反掩码操作都使用如下算法:

首先,假设:

  • 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、代理缓存污染攻击

上边摘自二〇〇八年有关安全的一段讲话。个中涉及了代理服务器在磋商落到实处上的短处恐怕引致的平安主题材料。撞倒出处。

“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

本文由必发88官网发布,转载请注明来源:5秒钟从入门到明白