WebSocket的成本

image.png

长连接的心跳保持

  • HTTP长连接只能基于简单的超时(常见为65秒)
  • WebSocket连接基于ping/pong心跳机制维持

    兼容HTTP协议

  • 默认使用80或者443端口

  • 协议升级
  • 代理服务器可以简单支持

帧格式示意图

红色是2字节必然存在的帧首部
image.png

数据帧格式:帧类型 opcode

  • 持续帧
    • 0:继续前一帧
  • 非控制帧
    • 1:文本帧(UTF-8)
    • 2:二进制帧
    • 3-7:非控制帧保留
  • 控制帧

    • 8:关闭帧
    • 9:心跳帧 ping
    • A:心跳帧 pong
    • B-F:为控制帧保留

      HTTP升级到WebSocket

      URI格式

  • ws-URI = “ws” “//“ host [“:” port] path [“?” query]

    • 默认port端口 80
  • wss-URI = “wss” “//“ host [“:” port] path [“?” query]
    • 默认port端口 443
  • 客户端提供信息
    • host与port:主机名与端口
    • shema:是否基于SSL
    • 访问资源:URI
    • 握手随机数:Sec-WebSocket-Key
    • 选择子协议:Sec-WebSocket-Protocol
    • 扩展子协议:Sec-WebSocket-Extensions
    • CORS跨域:Origin

image.png

传递消息时的编码格式

  • message消息
    • 1条消息由1个或多个帧组成,这些数据帧属于同一类型
    • 代理服务器可能合并、拆分消息的数据帧
  • Frame数据帧
    • 持续帧
    • 文本帧、二进制帧

image.png

数据帧格式:消息内容的长度

image.png

发送消息

  • 确保WebSocket会话处于OPEN状态
  • 以帧来承载消息,一条消息可以拆分多个数据帧
  • 客户端发送的帧必须基于掩码编码
  • 一旦发送或者接收到关闭帧,连接处于Closing状态
  • 一旦发送了关闭帧,且接收到关闭帧,连接处于CLOSED状态
  • TCP连接关闭后,WebSocket连接才完全被关闭

    客户端发送的帧必须基于掩码编码

    frame-masking-key掩码

    image.png

    心跳帧

  • 心跳帧可以插在数据帧中传输

    • ping帧
      • opcode=9
      • 可以含有数据
    • pong帧
      • opcode=A
      • 必须与ping帧数据相同

        关闭回话的方式

  • 控制帧中的关闭帧:在TCP连接之上的双向关闭

    • 发送关闭帧后,不能再发送任何数据
    • 接收到关闭帧后,不再接收任何到达的数据
  • TCP连接意外中断