通讯协议说明
相较于http协议,通讯只能由客户端发起,如果服务器有连续状态变化,只能通过轮询发送请求,且效率低浪费资源;而websocket是一种全双工的通讯协议,由IETF定为标准。
相同点:
都是基于TCP的应用层协议
都使用Request/Response模型进行连接建立
在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码;
都可以在网络中传输数据
不同点:
WS使用HTTP建立连接,但是定义一系列新的header域
WS连接建立后,通讯双方都可以在任何时刻向另一方发送数据
WS连接建立后,数据的传输使用帧来传递,不再需要Request消息
WS数据帧有序
![](https://img-blog.csdnimg.cn/img_convert/314b8140a518b91b15ba38809b13c3a9.png)
数据包结构
2.1http协议格式
2.1.1http建立连接请求包
![](https://img-blog.csdnimg.cn/img_convert/33a049222f6ba834cc427674c5232f92.png)
请求方法必须为GET,协议版本号必须大于1.1
Upgrade字段必须包含,值为websocket
Connection字段必须包含,值为Upgrade
Sec-WebSocket-Key字段必须包含,记录着握手过程中必不可少的键值(一个 Base64 编码的 16 字节随机数,作为简单的认证密钥)
Sec-WebSocket-Version字段必须包含,固定为13
2.1.2http建立连接响应包
![](https://img-blog.csdnimg.cn/img_convert/efab328cefefa227b4d1667615b252e3.png)
返回状态码101Switching Protocols
Upgrade字段必须包含,值为websocket
Connection字段必须包含,值为Upgrade
Sec-WebSocket-Accept字段由请求包Sec-WebSocket-Key字段生成(防止误连接 通常加一个专用的uuid计算)
客户端收到报文用同样的算法比对是否相等,如果相等认证成功;连接成功后通讯不再使用HTTP报文,而是websocket协议报文。
2.2Websocket协议格式
![](https://img-blog.csdnimg.cn/img_convert/c66f5d372faecd2de1998d5b79220507.png)
帧头:结束标志位+操作码+帧长度+掩码
![](https://img-blog.csdnimg.cn/img_convert/c0bd65963a5f7db43d475c5d9a50bcff.png)
FIN: 是否是一个Message里最后Frame(Message可能有多个Frame组成);1bit,是否为信息的最后一帧
RSV1-RSV3: 默认是0 (必须是0),除非有扩展定义了非零值的意义
Opcode
0x00 denotes a continuationframe(表示延续帧)
0x01 表示一个textframe
0x02 表示一个binaryframe(二进制数据帧)
0x03-0x07 预留字段
0x08 表示连接关闭
0x09 表示ping(心跳检测相关)
0x0a 表示pong(心跳检测相关)
Mask:指“payload data”是否计算掩码,与后面Masking-key有关,如果设置为1,掩码必须放在Masking-key区域,且后面客户端发送给服务端的所有信息,此为都是1
Payload len:数据长度
Masking-key:0或4bit,只有MASK设置为1时才有效,放websocket掩码
Payload data: 帧真正发送的数据,可以是任意长度,虽然理论上帧大小没限制,但是发送数据不能太大,否则会导致无法高效利用网络带宽,正如上面所讲的websocket提供分片
2.3心跳ping-pong
Client 定时发送ping数据到server, server收到返回pong数据