Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WebSocket中二进制操作码编码和解码实现是特定的吗?_Websocket_Socket.io - Fatal编程技术网

在WebSocket中二进制操作码编码和解码实现是特定的吗?

在WebSocket中二进制操作码编码和解码实现是特定的吗?,websocket,socket.io,Websocket,Socket.io,假设我正在创建一个websocket客户端。特定的websocket url将帧返回为“二进制帧(操作码2)”。问题是1。为什么开发人员要将原始消息包装在二进制操作码框架中? 2.检索消息是否以实现为中心?另一方面,客户端是否必须知道在服务器上用于编码的相同逻辑3。如果上述错误,那么是否有一种全局方法来解码/解析二进制操作码,以查看正在发送的实际数据?处理Websocket帧 Websocket框架基本上如下所示: 0 1

假设我正在创建一个websocket客户端。特定的websocket url将帧返回为“二进制帧(操作码2)”。问题是

1。为什么开发人员要将原始消息包装在二进制操作码框架中?
2.检索消息是否以实现为中心?另一方面,客户端是否必须知道在服务器上用于编码的相同逻辑
3。如果上述错误,那么是否有一种全局方法来解码/解析二进制操作码,以查看正在发送的实际数据?

处理Websocket帧
Websocket框架基本上如下所示:

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+
解释
  • FIN
    • FIN
      位告诉您这是否是您将收到的所有数据。大型Websocket消息可以分段(通过多个帧发送)
  • RSV1-3
    • 这是保留位,以后可以使用
  • opcode
    • 这可用于确定接收到的帧类型
    • 可能的选择是
      • 0(续)
      • 如果此帧是片段消息的一部分,而不是第一部分
    • 1(文本)
      • 正常UTF-8编码文本数据
    • 2(二进制)
      • 二进制数据
    • 8(关闭)
      • 这将关闭Websocket
    • 9(平)
      • 服务器ping客户端以检查客户端是否仍然可以访问
    • 10(庞)
      • 客户端使用
        Pong
        Ping
        数据进行响应,以验证其可达性
  • MASK
    • 第二个字节的最高有效位告诉您有效负载是否已被屏蔽。服务器不能屏蔽任何帧
  • 有效负载长度(这是事情变得复杂的地方)
    • 取第二个字节,读取除最高有效位以外的所有位
      • 字节小于等于125这是你的长度
      • 字节是126
        • 您的长度是字节3和4的uint16
      • 字节是127
        • 您的长度是字节3到8的uint64
  • 屏蔽键
    • 仅当设置了
      掩码
      位时才存在
    • 接下来的4个字节是屏蔽键,该键用于解码有效负载
  • 有效载荷
    • 如果设置了
      FIN
      位,则这不是整个有效负载
    • 有效负载可以被解码为文本(UTF-8)或二进制(可以是任何数据)
    • 如果设置了
      掩码
      位,则需要屏蔽有效负载
  • 解码Websocket帧的步骤
  • 获取
    FIN
    • 获取第一个字节并
      &
      使用127,结果是您的
      FIN
  • 获取
    操作码
    (操作码会告诉您所拥有的帧类型)
    • 获取第一个字节,并使用15进行
      &
      运算,结果是您的
      操作码
  • 获取
    掩码
    • 获取第二个字节并
      &
      将其与127匹配,如果是127,则有一个屏蔽键
  • 获取有效负载长度
    • 取第二个字节,读取除最高有效位以外的所有位
      • 字节小于等于125这是你的长度
      • 字节是126
        • 您的长度是字节3和4的uint16
      • 字节是127
        • 您的长度是字节3到8的uint64
  • 获取屏蔽键
    • 接下来的4个字节是屏蔽键,该键用于解码有效负载
  • 有效载荷
    • 有效负载的长度很大,从屏蔽键开始
    • 如果设置了
      掩码
      位,则需要屏蔽有效负载
      • 要对有效负载进行去掩码,只需对每个字节执行
        xor
        操作,并在索引计数模4上使用掩码键
  • int count=0;
    对于(int i=数据索引;i<总长度;i++)
    {
    帧数据[i]=(字节)(帧数据[i]^键[计数%4]);
    计数++;
    }

    解释数据
    • 正文
      • 数据需要解释为UTF-8文本
    • 二进制的
      • 这些数据需要根据您等待的数据进行解释,这可以通过在有效负载的开头添加一个字节,然后相应地进行解释来实现
    处理网匣框架
    Websocket框架基本上如下所示:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-------+-+-------------+-------------------------------+
    |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
    |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
    |N|V|V|V|       |S|             |   (if payload len==126/127)   |
    | |1|2|3|       |K|             |                               |
    +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
    |     Extended payload length continued, if payload len == 127  |
    + - - - - - - - - - - - - - - - +-------------------------------+
    |                               |Masking-key, if MASK set to 1  |
    +-------------------------------+-------------------------------+
    | Masking-key (continued)       |          Payload Data         |
    +-------------------------------- - - - - - - - - - - - - - - - +
    :                     Payload Data continued ...                :
    + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
    |                     Payload Data continued ...                |
    +---------------------------------------------------------------+
    
    解释
  • FIN
    • FIN
      位告诉您这是否是您将收到的所有数据。大型Websocket消息可以分段(通过多个帧发送)
  • RSV1-3
    • 这是保留位,以后可以使用
  • opcode
    • 这可用于确定接收到的帧类型
    • 可能的选择是
      • 0(续)
      • 如果此帧是片段消息的一部分,而不是第一部分
    • 1(文本)
      • 正常UTF-8编码文本数据
    • 2(二进制)
      • 二进制数据
    • 8(关闭)
      • 这将关闭Websocket
    • 9(平)
      • 服务器ping客户端以检查客户端是否仍然可以访问
    • 10(庞)
      • 客户端使用
        Pong
        Ping
        数据进行响应,以验证其可达性
  • MASK
    • 第二个字节的最高有效位告诉您有效负载是否已被屏蔽。服务器不能屏蔽任何帧
  • 有效负载长度(这是事情变得复杂的地方)
    • 取第二个字节,读取除最高有效位以外的所有位
      • 字节小于等于125这是你的长度
      • 字节是126
        • 您的长度是字节3和4的uint16
      • 字节是127
        • 你的