【问题标题】:Where to locate the mask bit in a WebSocket frame?在 WebSocket 框架中的何处定位掩码位?
【发布时间】:2018-05-24 12:43:51
【问题描述】:

我目前正在尝试用 Java 创建一个 WebSocket 服务器,但遇到了一些问题。目前我正在运行握手(至少我没有得到任何错误)。然后我从框架开始,我完成了以下工作:

  • 检查是否设置了 lastFrame 位(位 0)。
  • 检查是否设置了保留位(位 1-3)。如果是,请断开连接。
  • 检查 opt 位(位 4-7)是否具有有效值。如果没有,请断开连接。

下一步是掩码位,它应该位于第 8 位(应该是帧的第二个字节中的第 1 位) RFC 6455 规范 (see here) 告诉我,如果从客户端发送此位应该设置或“1”,我使用 Firefox 进行连接,所以这肯定是客户端,但它没有设置为 1。这是我得到的位输入:

Byte 1: 10000001
Byte 2: 00100001
Byte 3: 11101101
Byte 4: 01000101
Byte 5: 01010001
Byte 6: 00110101
Byte 7: 11100111
Byte 8: 11010011
Byte 9: 00100111

正如您在字节 2 位 0 看到的那样,有一个 0 表示该帧未被屏蔽。有人可以告诉我,我是否正在寻找面罩指示的正确位置,如果是这样,有人知道为什么没有设置面罩吗? 无论如何,我猜数据包本身是有效的,因为第一位始终是 10000001,这表明一个健康的最终帧文本数据包。

另外,为了确认,下一步是寻找位 1-7,它小于 126,这是我的帧长度(以字节为单位)。如果是 126,那 7 位加上接下来的 16 位表示长度,如果是 127,那么 7 位加上接下来的 64 表示长度。接下来是 32 位(4 个字节)的掩码密钥,其中的所有内容都是有效负载。我必须使用掩码密钥对有效负载运行异或来解密。对吧?

另外,我目前只是读取帧的前两个字节,检查所有内容,甚至可能得到大小。如果我得到了我应该能够读取整个数据包的大小,对吧?

编辑:谢谢你们,我找到了“问题”。我还没有直接在位级别上工作,所以我真的不知道位编号从右到左工作(至少如果它是 LSB),这会引起一些刺激。由于第一个字节看起来完全对称,因此在 biginning 和最后设置了一些位,因此最终检查和对 optcode 的检查有效。因此,如果有人遇到类似问题,请尝试检查您是否真的阅读了正确的内容,您可能需要检查this page

最好的问候, 专业

【问题讨论】:

  • 第 8 位将是第二个字节的第 0 位,而不是第 1 位,并且第 0 位是最右边的位,假设00100001 是字节值33 的常用位表示。跨度>

标签: java websocket masking


【解决方案1】:

in the WebSocket Protocol RFC所示,屏蔽指示位是第2个字节的#8位。

即(用 C 语言,因为我不确定用 Java 写这个):

// assuming `msg` is `unsigned char` (byte string)
if ((msg[2] & 128)) // ... masked

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2019-11-19
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多