假设我正在创建一个websocket客户端。并且特定的websocket url将框架返回为“二进制框架(操作码2)”。问题是:1。为什么开发人员想要将原始消息包装在二进制操作码框架内?
2.检索以消息实现为中心吗?换句话说,客户端是否必须知道用于在服务器上编码的相同逻辑?
3.如果上述内容为假,那么是否存在解码/解析二进制操作码以查看正在发送的实际数据的全局方法?
答案 0 :(得分:5)
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
Pong
和Ping
数据以验证其可达性MASK
MASK
位设置FIN
位MASK
位FIN
位
&
,结果是FIN
位OpCode
(OpCode会告诉您框架的类型)
&
获得15,结果是opcode
MASK
位
&
,如果是127则获得屏蔽密钥MASK
位,则需要屏蔽有效负载
xor
操作 int count = 0;
for (int i = dataIndex; i < totalLength; i++)
{
frameData[i] = (byte)(frameData[i] ^ key[count % 4]);
count++;
}