Websocket详解
websocket协议介绍
1.websocket websocket是一种标准协议,用于客户端和服务端之间进行双向数据传输,它是一种基于TCP协议的独立实现;其最大的特点是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。websocket借用http来完成一次握手,只需要一次HTTP握手,服务端就能一直与客户端保持通讯,直到关闭连接。
2.http与websocket的主要区别
websocket握手
1.典型的websocket握手过程
握手请求信息:
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version:13
Sec-WebSocket-Protocol:chat, superchat
握手响应信息
HTTP/1.1 101 Switching Protocols
Sec-WebSocket-Accept:HSmrc0sMlYUkAGmm5OPpG2HaGWk==
Sec-WebSocket-Accept的计算方法: (1)将Sec-WebSocket-Key跟258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接; (2)通过SHA1计算出摘要,并转成base64字符串。
websocket协议分析
1.websocket报文解析 websocket包格式 (1) FIN:占1个bit ????0:表示不是消息的最后一个分片; ????1:表示是消息的最后的一个分片; (2)RSV1, RSV2, RSV3:各占 1 个 bit ????一般情况下全为 0。当客户端、服务端协商采用 WebSocket 扩展时,这三个标志位可以非 0,且值的含义由扩展进行定义。如果出现非零的值,且并没有采用 WebSocket 扩展,连接出错。 (3)Opcode:4个bit ????%x0:表示一个延续帧。当 Opcode 为 0 时,表示本次数据传输采用了数据分片,当前收到的数据帧为其中一个数据分片; ????%x1:表示这是一个文本帧(frame); ????%x2:表示这是一个二进制帧(frame); ????%x3-7:保留的操作代码,用于后续定义的非控制帧; ????%x8:表示连接断开; ????%x9:表示这是一个 ping 操作; ????%xA:表示这是一个 pong 操作; ????%xB-F:保留的操作代码,用于后续定义的控制帧。 (4)Mask:1个bit ????表示是否需要对数据载荷进行掩码异或操作(1表示是,0表示否)。 (5)Payload length: 7bit or 7 + 16bit or 7 + 64bit ????表示数据载荷的长度: ????x 为 0~126:数据的长度为 x 字节; ????x 为 126:后续 2 个字节代表一个 16 位的无符号整数,该无符号整数的值为数据的长度; ????x 为 127:后续 8 个字节代表一个 64 位的无符号整数(最高位为 0),该无符号整数的值为数据的长度。 (6)Masking-key:0 or 4bytes ????当 Mask 为 1,则携带了 4 字节的 Masking-key;当 Mask 为 0,则没有 Masking-key。 ????注:掩码的作用并不是为了防止数据泄密,而是为了防止早期版本的协议中存在的代理缓存污染攻击(proxy cache poisoning attacks)等问题。 (7)Payload Data:载荷数据
|