zoukankan      html  css  js  c++  java
  • Sword websocket分析一

    什么是WebSocket
    WebSocket是一个允许Web应用程序(通常指浏览器)与服务器进行双向通信的协议。
    HTML5的WebSocket API主要是为浏览器端提供了一个基于TCP协议实现全双工通信的方法。

    传输帧格式

    0Bit:
    FIN 结束标识位,如果FIN为1,代表该帧为结束帧(如果一条消息过长可以将其拆分为多个帧,
    这时候FIN可以置为0,表示后面还有数据帧,服务器需要将该帧内容缓存起来,待所有帧都接收后再拼接到一起。控制帧不可拆分为多帧)。
    1~3Bit: RSV1~RSV3 保留标识位,以后做协议扩展时才会用到,目前该3位都为0 4~7Bit: opcode 操作码,用于标识该帧负载的类型,如果收到了未知的操作码,则根据协议,需要断开WebSocket连接。操作码含义如下: 0x00 连续帧,浏览器的WebSocket API一般不会收到该类型的操作码 0x01 文本帧,最常用到的数据帧类别之一,表示该帧的负载是一段文本(UTF-8字符流) 0x02 二进制帧,较常用到的数据帧类别之一,表示该帧的负载是二进制数据 0x03-0x07 保留帧,留作未来非控制帧扩展使用 0x08 关闭连接控制帧,表示要断开WebSocket连接,浏览器端调用close方法会发送0x08控制帧 0x09 ping帧,用于检测端点是否可用,暂未发现浏览器可以通过何种方法发送该帧 0x0A pong帧,用于回复ping帧,暂未发现浏览器可以发送此种类型的控制帧 0x0B-0x0F 保留帧,留作未来控制帧扩展使用 8Bit: MASK 掩码标识位,用来表明负载是否经过掩码处理,浏览器发送的数据都是经过掩码处理(浏览器自动处理,无需开发者编码),
    服务器发送的帧必须不经过掩码处理。所以此处浏览器发送的帧必为1,服务器发送的帧必为0,否则应断开WebSocket连接
    9~15Bit: payload length 负载长度,单位字节如果负载长度0~125字节,则此处就是负载长度的字节数,如果负载长度在126~65535之间,
    则此处的值为12616~32Bit表示负载的真实长度。如果负载长度在65536~2的64次方-1时,则此处的值为12716~80Bit表示负载的真实长度。
    其中负载长度包括应用数据长度和扩展数据的长度 payload length 后面4个字节可能是掩码的key(如果掩码位是1则有这4个字节的key,否则没有,一般服务端不需要使用掩码)。 接下来就是负载的数据了,他们可能需要根据掩码的key进行编码(仅浏览器需要掩码),如果存在扩展数据,需要放在应用数据之前
    客户端http报文

    Upgrade: websocket
    Connection: Upgrade
    表示发起的是Websocket协议
    Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的
    Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议
    Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft(协议版本)
    服务端http报文

    Upgrade: websocket
    Connection: Upgrade
    通知客户端即将升级的是 Websocket 协议
    Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key
  • 相关阅读:
    wepack性能优化-contenthash(缓存)
    webpack优化系列-oneOf
    webpack性能优化-source-map
    webpack性能优化-HMR
    vue__之路由懒加载
    vue__之ref的作用
    圆面积和球体积
    算法思想
    看完com本质论第一章
    windows消息机制
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/9819188.html
Copyright © 2011-2022 走看看