在WebSocket中二进制操作码编码和解码实现是特定的吗?
假设我正在创建一个websocket客户端。特定的websocket url将帧返回为“二进制帧(操作码2)”。问题是在WebSocket中二进制操作码编码和解码实现是特定的吗?,websocket,socket.io,Websocket,Socket.io,假设我正在创建一个websocket客户端。特定的websocket url将帧返回为“二进制帧(操作码2)”。问题是1。为什么开发人员要将原始消息包装在二进制操作码框架中? 2.检索消息是否以实现为中心?另一方面,客户端是否必须知道在服务器上用于编码的相同逻辑3。如果上述错误,那么是否有一种全局方法来解码/解析二进制操作码,以查看正在发送的实际数据?处理Websocket帧 Websocket框架基本上如下所示: 0 1
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
位告诉您这是否是您将收到的所有数据。大型Websocket消息可以分段(通过多个帧发送)FIN
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)或二进制(可以是任何数据)
- 如果设置了
位,则需要屏蔽有效负载掩码
FIN
位
- 获取第一个字节并
使用127,结果是您的&
位FIN
操作码
(操作码会告诉您所拥有的帧类型)
- 获取第一个字节,并使用15进行
运算,结果是您的&
操作码
掩码
位
- 获取第二个字节并
将其与127匹配,如果是127,则有一个屏蔽键&
- 取第二个字节,读取除最高有效位以外的所有位
- 字节小于等于125这是你的长度
- 字节是126
- 您的长度是字节3和4的uint16
- 字节是127
- 您的长度是字节3到8的uint64
- 接下来的4个字节是屏蔽键,该键用于解码有效负载
- 有效负载的长度很大,从屏蔽键开始
- 如果设置了
位,则需要屏蔽有效负载掩码
- 要对有效负载进行去掩码,只需对每个字节执行
操作,并在索引计数模4上使用掩码键xor
- 要对有效负载进行去掩码,只需对每个字节执行
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
位告诉您这是否是您将收到的所有数据。大型Websocket消息可以分段(通过多个帧发送)FIN
RSV1-3
- 这是保留位,以后可以使用
opcode
- 这可用于确定接收到的帧类型
- 可能的选择是
- 0(续)
- 如果此帧是片段消息的一部分,而不是第一部分
- 1(文本)
- 正常UTF-8编码文本数据
- 2(二进制)
- 二进制数据
- 8(关闭)
- 这将关闭Websocket
- 9(平)
- 服务器ping客户端以检查客户端是否仍然可以访问
- 10(庞)
- 客户端使用
和Pong
数据进行响应,以验证其可达性Ping
- 客户端使用
MASK
- 第二个字节的最高有效位告诉您有效负载是否已被屏蔽。服务器不能屏蔽任何帧李>
- 取第二个字节,读取除最高有效位以外的所有位
- 字节小于等于125这是你的长度
- 字节是126
- 您的长度是字节3和4的uint16
- 字节是127
- 你的