WebSocket 的实现,第1张

长连接: 一个链接上可以连续发送多个数据包,在链接期间,如果没有数据包发送,需要双方发链路检查包

TCP/IP: TCP/IP 属于传输层,主要解决网络中的数据传输问题,只管传输数据。但这样对传输的数据没有一个规范的封装、解析等处理。使得传输的数据难以识别,所以才有了应用层协议对数据进行的封装、解析等,如http协议。

HTTP: HTTP协议是应用层协议,用于分装解析传输数据。 从HTTP11开始其实就默认开启了长链接,也就是请求头header中可以看到Connection:Keep-alive。但是长连接只是说保持了(服务器可以告诉客户端保持时间Keep-Alive:timeout=20;max=20;)这个TCP通道,并采用服务器和客户端应答模式(Request-Response),不需要再创建一个链接通道,做到一个性能优化。

socket: 与HTTP协议不一样,socket不是协议,他是在程序层面上对传输层协议(像TCP/IP)的接口封装。我们知道传输层的协议,是解决数据在网络中传输的问题的,那么socket(套接字)就是传输通道两端的接口。

Websocket: WebSocket是包装成了一个应用层协议作为socket,从而能够让客户端和远程服务端通过web建立全双工通信。

WebSocket API 是HTML5 推出的东西。在客户端我们可以通过HTML5 所提供的API 对websocket 进行创建、发送数据、监听信息、监听报错等功能( HTML5 WebSocket )

我们知道WebSocket 是在Socket的基础上实现的,所以我们要做的是对现有的Socket协议进行升级。

步骤: 客户端发送websocket请求-->服务端接受并识别该请求-->对该请求协议进行升级--> 返回给客户端 --> websocket 通道建立 --> 客户端/服务端发送数据

协议升级

在这里需要注意的是头部信息和头部信息中的Sec-Websocket-Accept的值。

该值需要是一个通过base64加密的哈希值(sha1)。 而该加密所用的数据是客户端传过来的sec-websocket-key的值和MAGIC_STRINC内的固定值。 对MAGIC_STRINC的说明

Webscoket 中传输的数据是 数据帧(frame)

数据帧有多种类型 主要有:文本型、二进制数据

数据帧结构

每一列代表一个字节,一个字节8位,每一位又代表一个二进制数。

创建数据帧

解数据帧

心跳检查

由于websocket 不进行交互会关闭通道所以,才有了心跳检查。

websocket与和他http的区别

基于node实现websocket协议

使用nodeJS在HTTP上实现WebSocket

如何让我的服务器返回正确的Sec-WebSocket-Accept标头值

学习WebSocket协议—从顶层到底层的实现原理

websocket 协议帧 解析

nodejs实现Websocket的数据接收发送

一、硬盘类型。服务器中的固态硬盘(SSD)比SATA硬盘驱动器提供更高的磁盘读/写速度,也称为输入/输出(I/O)性能。具有SSD读取和写入磁盘的服务器速度更快,但定价显著高于同等存储容量的SATA硬盘。

二、硬盘存储空间。服务器的硬盘存储是本地数据库大小和文件(如图像)的本地存储的限制因素。配置RAID磁盘阵列可有效增加数据可靠性,增加读取/写入(I/O)性能,RAID需要两个以上单独的存储卷。存储还可以采取网络存储的形式,如NAS(网络连接存储)或SAN(存储区域网络)。

三、CPU。独立服务器的CPU执行诸如服务网页、运行数据库查询或处理计算命令等指令。CPU和内核的数量会影响可执行多少个并发指令。CPU架构和功能也影响执行指令的速度,特别是在围绕这些功能设计程序的网站或应用。

四、带宽。带宽数据传输限制,指的是可以并发到您的服务器的数据量。服务器带宽价格较高,通常提供5Mbps、10Mbps国际带宽。像并发视频流、游戏和大数据处理等工作任务都需要高带宽。

五、网络延迟。网络延迟是服务器和用户之间发送信息的延迟的毫秒。网络延迟的高低由服务器提供商决定,但受到服务器和用户之间的距离和网络质量的影响。为降低延迟,服务器供应商部署中国大陆连通香港地区的CN2专线,是目前中国大陆访问最快的线路,可提供最低的延迟和最好的网络体验。

Sec是Simpleeasycompile的缩写,Simple:简单easy:容易compile:编程中文名称“简易编程”,使用VB6编写的程序,语法参考了C语言和易语言,支持中英文混合编程。

脚本程序和网站游戏服务器的语言则是使用VBScript,Jscript,Javascript这三种脚本为基础,加上脚本解释器提供的各种对象库,使得开发网站和游戏变得更为轻松快捷。

网站和游戏可以相互访问其内部对象,网站可以跟游戏客户端的玩家相互聊天,读取游戏对象数据,编辑游戏装备等。

买内存条还要看你现在用的主板支持的频率范围,如果你现在用的主板不支持你现在用的内存条的频率,内存频率要么变低 要么变高,看看你之前用的内存条品牌,就用用来品牌的内存条吧,或者进入biss设置内存频率来解决问题

11 背景

12 协议概览

协议包含两部分:握手,数据传输。

客户端的握手如下:

GET /chat HTTP/11

Host: serverexamplecom

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

Origin: http://examplecom

Sec-WebSocket-Protocol: chat, superchat

Sec-WebSocket-Version: 13

服务端的握手如下:

HTTP/11 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Sec-WebSocket-Protocol: chat

客户端和服务端都发送了握手,并且成功,数据传输即可开始。

13 发起握手

发起握手是为了兼容基于HTTP的服务端程序,这样一个端口可以同时处理HTTP客户端和WebSocket客户端

因此WebSocket客户端握手是一个HTTP Upgrade请求:

GET /chat HTTP/11

Host: serverexamplecom

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

Origin: http://examplecom

Sec-WebSocket-Protocol: chat, superchat

Sec-WebSocket-Version: 13

握手中的域的顺序是任意的。

5 数据帧

51 概述

WebScoket协议中,数据以帧序列的形式传输。

考虑到数据安全性,客户端向服务器传输的数据帧必须进行掩码处理。服务器若接收到未经过掩码处理的数据帧,则必须主动关闭连接。

服务器向客户端传输的数据帧一定不能进行掩码处理。客户端若接收到经过掩码处理的数据帧,则必须主动关闭连接。

针对上情况,发现错误的一方可向对方发送close帧(状态码是1002,表示协议错误),以关闭连接。

52 帧协议

WebSocket数据帧结构如下图所示:

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 |

+---------------------------------------------------------------+

FIN:1位

表示这是消息的最后一帧(结束帧),一个消息由一个或多个数据帧构成。若消息由一帧构成,起始帧即结束帧。

RSV1,RSV2,RSV3:各1位

MUST be 0 unless an extension is negotiated that defines meanings for non-zero values If a nonzero value is received and none of the negotiated extensions defines the meaning of such a nonzero value, the receiving endpoint MUST _Fail the WebSocket Connection_

这里我翻译不好,大致意思是如果未定义扩展,各位是0;如果定义了扩展,即为非0值。如果接收的帧此处非0,扩展中却没有该值的定义,那么关闭连接。

OPCODE:4位

解释PayloadData,如果接收到未知的opcode,接收端必须关闭连接。

0x0表示附加数据帧

0x1表示文本数据帧

0x2表示二进制数据帧

0x3-7暂时无定义,为以后的非控制帧保留

0x8表示连接关闭

0x9表示ping

0xA表示pong

0xB-F暂时无定义,为以后的控制帧保留

MASK:1位

用于标识PayloadData是否经过掩码处理。如果是1,Masking-key域的数据即是掩码密钥,用于解码PayloadData。客户端发出的数据帧需要进行掩码处理,所以此位是1。

Payload length:7位,7+16位,7+64位

PayloadData的长度(以字节为单位)。

如果其值在0-125,则是payload的真实长度。

如果值是126,则后面2个字节形成的16位无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。

如果值是127,则后面8个字节形成的64位无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。

长度表示遵循一个原则,用最少的字节表示长度(我理解是尽量减少不必要的传输)。举例说,payload真实长度是124,在0-125之间,必须用前7位表示;不允许长度1是126或127,然后长度2是124,这样违反原则。

Payload长度是ExtensionData长度与ApplicationData长度之和。ExtensionData长度可能是0,这种情况下,Payload长度即是ApplicationData长度。

WebSocket协议规定数据通过帧序列传输。

客户端必须对其发送到服务器的所有帧进行掩码处理。

服务器一旦收到无掩码帧,将关闭连接。服务器可能发送一个状态码是1002(表示协议错误)的Close帧。

而服务器发送客户端的数据帧不做掩码处理,一旦客户端发现经过掩码处理的帧,将关闭连接。客户端可能使用状态码1002。

消息分片

分片目的是发送长度未知的消息。如果不分片发送,即一帧,就需要缓存整个消息,计算其长度,构建frame并发送;使用分片的话,可使用一个大小合适的buffer,用消息内容填充buffer,填满即发送出去。

分片规则:

1一个未分片的消息只有一帧(FIN为1,opcode非0)

2一个分片的消息由起始帧(FIN为0,opcode非0),若干(0个或多个)帧(FIN为0,opcode为0),结束帧(FIN为1,opcode为0)。

3控制帧可以出现在分片消息中间,但控制帧本身不允许分片。

4分片消息必须按次序逐帧发送。

5如果未协商扩展的情况下,两个分片消息的帧之间不允许交错。

6能够处理存在于分片消息帧之间的控制帧

7发送端为非控制消息构建长度任意的分片

8client和server兼容接收分片消息与非分片消息

9控制帧不允许分片,中间媒介不允许改变分片结构(即为控制帧分片)

10如果使用保留位,中间媒介不知道其值表示的含义,那么中间媒介不允许改变消息的分片结构

11如果协商扩展,中间媒介不知道,那么中间媒介不允许改变消息的分片结构,同样地,如果中间媒介不了解一个连接的握手信息,也不允许改变该连接的消息的分片结构

12由于上述规则,一个消息的所有分片是同一数据类型(由第一个分片的opcode定义)的数据。因为控制帧不允许分片,所以一个消息的所有分片的数据类型是文本、二进制、opcode保留类型中的一种。

需要注意的是,如果控制帧不允许夹杂在一个消息的分片之间,延迟会较大,比如说当前正在传输一个较大的消息,此时的ping必须等待消息传输完成,才能发送出去,会导致较大的延迟。为了避免类似问题,需要允许控制帧夹杂在消息分片之间。

page 页面,页数 sec 英文second秒的缩写。 指为解析硬页错误从磁盘读取或写入磁盘的页数(是Pages Input/sec 和 Pages Output/sec 的总和)。其值推荐00-20如果服务器没有足够的内存处理其工作负荷,此数值将一直很高。如果大于80,表示有问题(太多的读写数据操作要访问磁盘,可考虑增加内存或优化读写数据的算法),如果值比较低,说明Web 服务器响应请求比较快,否则可能是服务器系统内存短缺引起( 也可能是缓存太大,导致系统内存太少)。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » WebSocket 的实现

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情