协议分为2部分:握手和数据传输
握手
- 客户端握手请求头信息
GET /chat 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
Sec-WebSocket-Extensions: compression
Authorization: access_token
相关说明
1.必须是GET
请求,且HTTP
版本号大于等于 1.1
2.Host
字段必须有值
3.Upgrade
字段必须有值,且为websocket
4.Connection
字段必须有值,且为Upgrade
5.Sec-WebSocket-Key
的值是随机生成的16位数字,然后被base64
编码后的值
6.Origin
如果为浏览器环境,则该值必填
7.Sec-WebSocket-Protocol
如果存在,该值表示一个或多个用逗号分割的客户端想要表达的子协议,按优先顺序排列
8.Sec-WebSocket-Version
该字段的值必须是13
9.Sec-WebSocket-Extensions
如果存在,该字段的值表示客户端需要服务端支持的扩展协议
10.请求头还可以包含任意其他头字段,例如cookie
,Authorization
等头字段
- 服务端握手响应头信息
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Extensions: compression
相关说明
1.Upgrade
字段必须有值,且为不区分大小写的ASCII匹配值websocket
2.Connection
字段必须有值,且为不区分大小的ASCII匹配值Upgrade
3.Sec-WebSocket-Accept
必须有值,且为客户端请求的Sec-Weboscket-Key
字段值,去除首尾空白字符,然后与固定标识符258EAFA5-E914-47DA-95CA-C5AB0DC85B11
连接,接着sha1
,最后base64
加密后的值
4.Sec-WebSocket-Protocol
如果存在,表示服务端支持的子协议,该值必须是客户端头信息Sec-WebSocket-Protocol
中出现的值
5.Sec-WebSocket-Extensions
如果存在,表示服务端支持的扩展协议,该值必须是客户端头信息Sec-WebSocket-Extensions
中出现的值
数据传输
基于frame
进行数据传输,对bit
进行了分组。下图为数据传输的格式
相关说明
1.FIN
占据1bit
,指示该条消息是否是最终帧,值为1
是,表示是最终帧
2.RSV1
、RSV2
、RSV3
各1个bit
,值必须是0
,除非有对应的扩展协议
3.opcode
占据4bit
,定义了对"负载数据"的解释,目前有如下值:0x0
连续帧、0x1
文本帧、0x2
二进制帧、0x3
-0x7
保留帧、0x8
连接关闭帧、0x9
ping帧、0xA
pong帧、0xB
-0xF
保留的控制帧
4.MASK
,占据1bit
,定义"负载数据"是否已被掩码处理,值为1
表示已被掩码处理。客户端发送给服务端的数据都需要设置为1
5.Payload len
指有效载荷长度,占据7/7+16/7+64 bit,长度以字节
为单位。如果值为0-125
,该值等于负载数据长度。如果值为126
,之后的两字节解释为一个16位的无符号整数,该值等于负载数据长度。如果127
,之后的8字节解释为一个64位的无符号整数,该值等于负载数据长度。多字节长度数量以网络字节顺序(大端字节序)来排序表示
6.Masking-key
掩码的key,占据0/4 byte。客户端发送到服务器的所有帧通过一个包含在帧中的32bit(4byte)
值来掩码。如果MASK
位设置为1
,则该字段存在,如果MASK
位设置为0
,则该字段缺失
7.Payload Data
有效载荷数据,等于 扩展数据+应用数据
网友评论