websocket通讯协议详解

  1. 通讯协议说明

相较于http协议,通讯只能由客户端发起,如果服务器有连续状态变化,只能通过轮询发送请求,且效率低浪费资源;而websocket是一种全双工的通讯协议,由IETF定为标准。

相同点:

  • 都是基于TCP的应用层协议

  • 都使用Request/Response模型进行连接建立

  • 在连接的建立过程中对错误的处理方式相同,在这个阶段WS可能返回和HTTP相同的返回码;

  • 都可以在网络中传输数据

不同点:

  • WS使用HTTP建立连接,但是定义一系列新的header域

  • WS连接建立后,通讯双方都可以在任何时刻向另一方发送数据

  • WS连接建立后,数据的传输使用帧来传递,不再需要Request消息

  • WS数据帧有序

  1. 数据包结构

2.1http协议格式

2.1.1http建立连接请求包

  • 请求方法必须为GET,协议版本号必须大于1.1

  • Upgrade字段必须包含,值为websocket

  • Connection字段必须包含,值为Upgrade

  • Sec-WebSocket-Key字段必须包含,记录着握手过程中必不可少的键值(一个 Base64 编码的 16 字节随机数,作为简单的认证密钥)

  • Sec-WebSocket-Version字段必须包含,固定为13

2.1.2http建立连接响应包

  • 返回状态码101Switching Protocols

  • Upgrade字段必须包含,值为websocket

  • Connection字段必须包含,值为Upgrade

  • Sec-WebSocket-Accept字段由请求包Sec-WebSocket-Key字段生成(防止误连接 通常加一个专用的uuid计算)

客户端收到报文用同样的算法比对是否相等,如果相等认证成功;连接成功后通讯不再使用HTTP报文,而是websocket协议报文。

2.2Websocket协议格式

帧头:结束标志位+操作码+帧长度+掩码

  • FIN: 是否是一个Message里最后Frame(Message可能有多个Frame组成);1bit,是否为信息的最后一帧

  • RSV1-RSV3: 默认是0 (必须是0),除非有扩展定义了非零值的意义

  • Opcode

  1. 0x00 denotes a continuationframe(表示延续帧)

  1. 0x01 表示一个textframe

  1. 0x02 表示一个binaryframe(二进制数据帧)

  1. 0x03-0x07 预留字段

  1. 0x08 表示连接关闭

  1. 0x09 表示ping(心跳检测相关)

  1. 0x0a 表示pong(心跳检测相关)

  • Mask:指“payload data”是否计算掩码,与后面Masking-key有关,如果设置为1,掩码必须放在Masking-key区域,且后面客户端发送给服务端的所有信息,此为都是1

  • Payload len:数据长度

  • Masking-key:0或4bit,只有MASK设置为1时才有效,放websocket掩码

  • Payload data: 帧真正发送的数据,可以是任意长度,虽然理论上帧大小没限制,但是发送数据不能太大,否则会导致无法高效利用网络带宽,正如上面所讲的websocket提供分片

2.3心跳ping-pong

Client 定时发送ping数据到server, server收到返回pong数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈日下的奔跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值