前言
Webscoket是Web浏览器和服务器之间的一种全双工通信协议,WebSocket协议由IETF定义标准,WebSocket API则由W3C定义标准。
一、通信流程
Web客户端与服务器通过http协议建立起连接,然后在接下来的通信过程中,通过websocket协议可互相发送JSON、XML、HTML或图片等任意格式的数据。
如此一来服务器可以直接向客户端推送消息。相对比之前采取的方式都是客户端主动向服务器发送请求,然后由服务器响应,这样比较耗费网络及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 | 应用数据 |