WebSocket协议分析及实现

前言

   Webscoket是Web浏览器和服务器之间的一种全双工通信协议,WebSocket协议由IETF定义标准,WebSocket API则由W3C定义标准。

一、通信流程

   Web客户端与服务器通过http协议建立起连接,然后在接下来的通信过程中,通过websocket协议可互相发送JSON、XML、HTML或图片等任意格式的数据。
WebSocket通信原理图
   如此一来服务器可以直接向客户端推送消息。相对比之前采取的方式都是客户端主动向服务器发送请求,然后由服务器响应,这样比较耗费网络及cpu的资源。(相当节省了向服务器请求这个过程);采用websocket协议,只要第一次建立连接,就可以一直进行通信,不用像HTTP协议频繁的建立请求(一问一答)。

二、握手过程

1. 客户端请求连接

   websocket是基于TCP的一个应用协议,websocket的握手先是以 HTTP包与HTTP服务器通过Update request HTTP包建立起连接,然后接下来的通信使用websocket自己的协议。具体的请求格式如下:

GET /chat HTTP/1.1								//请求的方法,类型必须为GET,协议版本号必须大于1.1
Host: server.example.com
**Upgrade: websocket**							//Upgrade字段:必须包含,值为websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 	//Connection字段:必须包含,值为Upgrade
Origin: https://example.com						//Origin:作安全使用,防止跨站攻击
Sec-WebSocket-Protocol: chat, superchat			//Sec-WebSocket-Key字段:必须包含,记录握手的键值
Sec-WebSocket-Version: 13						//Sec-WebSocket-Protocol字段:必须包含,记录使用的子协议
2. 服务器响应连接

   websocket服务器接收到请求后,返回状态码为101 Switching Protocols 响应客户端;

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=	//握手请求中的Sec-WebSocket-Key字段生层的。
Sec-WebSocket-Protocol: chat
3. WebSocket独立的数据帧
说明
FIN 1bit,是否为信息的最后一帧
RSV 1-3 1bit,备用,默认为0
opcode 4bit,帧类型
0x00 连续消息分片
0x01 文本消息分片
0x02 二进制消息分片
0x03 ~ 0x07 为将来的非控制消息片段保留测操作吗
0x08 连接关闭
0x09 心跳检查 ping
0x0a 心跳检查pong
0x0b ~ 0x0f 为将来的控制消息片段保留的操作码
MASK 定义传输的数据是否有加掩码
如果设置为1,掩码键必须放在masking-key区域,客户端发送给服务端的所有消息,此位的值都是1
payload length 7bit,传输数据长度,以字节为单位。
当这个长度为7bit数字为126时,紧随其后的2个字节也是表示数据长度。
当这个长度为7bit数字为127时,紧随其后的8个字节也是表示数据长度。
Masking-key 0或者4bit,只有当MASK设置为1时才有效。
Playload data 负载数据,为扩展数据和应用数据之和,Extension data + Application data。
Extension data 扩展数据,如果客户端和服务端没有特殊的约定,那么扩展数据长度始终为0
Application data 应用数据

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章