# Websocket协议

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 

数据帧

FINRSVRSVRSVOPCODEMASKPLENMASK-DATADATA
1byte1byte1byte1byte4byte1byte7byte2||8byte4byteany
  1. FIN 是否结束帧,分帧情况下,可能位0,表示后面还有数据
  2. RSV 保留位,可自由使用
  3. OPCODE 操作码,描述 payload数据。0附加数据,1文本数据,2二进制数据,3-7为为控制帧保留,8关闭连接,9ping,apong,b-f为控制帧保留
  4. MASK 掩码标志,如果为1,则MASK-DATA有4字节数据,否则没有,客户端->服务端 则必为1,服务端->客户端 则不必
  5. PLEN payload data的长度,值有几种情况。0-125为真实数据长度,126则紧跟着2byte为真实数据长度,127则紧跟着8byte为真实数据长度
  6. MASK-DATA 如果 MASK 为1,则有4字节数据。mask为1,则有4byte数据,mask为0则无数据
  7. DATA 为数据