Websocket协议的一个简单说明,官方文档
客户端发送
C#
GET / HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== // 握手的随机数,用来生成掩码。
Origin: http://example.com // 访问源
Sec-WebSocket-Protocol: chat, superchat // 子协议的声明
Sec-WebSocket-Version: 13 // 协议版本
服务端回应
C#
HTTP/1.1 101 Switching Protocols // 101状态代表连接建立成功
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Upgrade: websocket
数据帧
FIN | RSV | RSV | RSV | OPCODE | MASK | PLEN | MASK-DATA | DATA | |
1byte | 1byte | 1byte | 1byte | 4byte | 1byte | 7byte | 2||8byte | 4byte | any |
- FIN 是否结束帧,分帧情况下,可能位0,表示后面还有数据
- RSV 保留位,可自由使用
- OPCODE 操作码,描述 payload数据。
0附加数据,1文本数据,2二进制数据,3-7为为控制帧保留,8关闭连接,9ping,apong,b-f为控制帧保留
- MASK 掩码标志,如果为1,则MASK-DATA有4字节数据,否则没有,客户端->服务端 则必为1,服务端->客户端 则不必
- PLEN payload data的长度,值有几种情况。
0-125为真实数据长度,126则紧跟着2byte为真实数据长度,127则紧跟着8byte为真实数据长度
- MASK-DATA 如果 MASK 为1,则有4字节数据。
mask为1,则有4byte数据,mask为0则无数据
- DATA 为数据