websocket协议格式
websocket是基于TCP的一个应用协议与HTTP协议的关联之处在于websocket的握手数据被HTTP服务器当作HTTP包来处理主要通过Update request HTTP包建立起连接之后的通信全部使用websocket自己的协议。1.建立连接:请求: TCP连接建立后客户端发送websocket的握手请求请求报文头部如下:GET /uinxxxxxxxxappxxxxxxxxxtokenXXXXXXXXXXXX HTTP/1.1 Host: server.example.cn:443 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Upgrade: websocket Sec-WebSocket-Version: 13 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9 Cookie: user_idXXXXX Sec-WebSocket-Key: 1/2hTi/eNURiekpNI4k5Q Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits Sec-WebSocket-Protocol: binary, base64其中a.类型必须为GET协议版本号必须大于1.1b.Connection字段必须包含值为UpgradeUpgrade字段必须包含值为websocketc.剩下的sec-websocket都是升级协议时候的一些约定,比如: sec-websocket-version 升级的版本、Sec-WebSocket-Protocol记录着使用的子协议响应服务器接收到请求后返回状态码为101 Switching Protocols 的响应。HTTP/1.1 101 Switching Protocols Server: WebSockify Python/2.6.6 Date: Wed, 27 May 2020 03:03:21 GMT Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: hXXXXXXXXXXXXXXxGmM Sec-WebSocket-Protocol: binary没有什么特殊的需要讲解,简单理解:服务器同意从 HTTP 切换到新协议2.协议格式FIN:1bit ,用于表示分片,其中 1 表示最后一个片RSV1~3:每一个1bit,总共3bit,扩展位,默认为0,表示无扩展; 当后续若是进行扩展,即值为1,需要表示对应的协议扩展位的含义,否则会握手失败(连接websocket建立失败)OpCode(操作码):4bit,他表示数据类型,其中最常见的就是: 0X01 文本类型、0x02 二进制类型、0x08 断开连接、0x09 发送ping、0x0A 发送pong,其他的要么是有具体含义要么是预留控制帧PayLoad len(载荷长度):WebSocket 设计很省空间只用7 位(单位是字节)来存长度7 位最大只能表示127所以分三档数据 ≤ 125 字节Payload len 直接写真实长度→ 不需要额外字段数据在 12665535 字节之间Payload len 填126后面再跟2 字节表示真实长度数据 65535 字节Payload len 填127后面再跟8 字节表示真实长度mask:1bit,只能是0或1,表示当前的帧的载荷数据是否经过掩码加密mask-key(掩码秘钥):固定4字节,表示对载荷进行加密/解密,仅当mask 1时存在,且紧跟在扩展字段的后面强制规则是: 客户端 -- 服务器 mask必须等于1 mask-key必须存在服务器 -- 客户端 mask必须等于0 mask-key不存在