websocket协议

2019-12-17  本文已影响0人  只争朝夕々

协议分为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.请求头还可以包含任意其他头字段,例如cookieAuthorization等头字段

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进行了分组。下图为数据传输的格式

image.png

相关说明
1.FIN占据1bit,指示该条消息是否是最终帧,值为1是,表示是最终帧
2.RSV1RSV2RSV3各1个bit,值必须是0,除非有对应的扩展协议
3.opcode占据4bit,定义了对"负载数据"的解释,目前有如下值:0x0连续帧、0x1文本帧、0x2二进制帧、0x3-0x7保留帧、0x8连接关闭帧、0x9ping帧、0xApong帧、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有效载荷数据,等于 扩展数据+应用数据

上一篇 下一篇

猜你喜欢

热点阅读