【问题标题】:How to read the Base Framing Protocol of RFC6455?如何阅读 RFC6455 的基本帧协议?
【发布时间】:2021-09-26 08:15:58
【问题描述】:

我的参考是:

  1. Writing a WebSocket server in Java
  2. Base Framing Protocol

为什么第一个字节129代表FINRSV1RSV2RSV3Opcode

我的预期结果是:

  1. 第一个字节是FIN/1位、RSV1/1位、RSV2/1位、RSV3/1位、Opcode/1位、Mask/1位。共 9 位。
  2. 第二个字节是Payload length。共 7 位。

我的实际结果是:

  1. 第一个字节代表FINRSV1RSV2RSV3Opcode
  2. 第二个字节代表Payload length

【问题讨论】:

    标签: websocket


    【解决方案1】:

    只是为了说明一点。

    第一个字节: 最左边的位是fin-bit,最右边的4位代表操作码, 在这种情况下 1=text

    10000001

    第二个字节: 最左边的位表示数据是否被屏蔽,其余七位表示长度

    10000000这里的长度是0
    11111101 这里长度正好是 125

    11111110 这里的长度指示符是 126,因此接下来的 两个 字节将为您提供后面的长度四个字节的掩码键

    11111111 这里的长度指示符是 127,因此接下来的 8 个字节将为您提供后面的长度四个字节的掩码键

    这一切都跟在被屏蔽的有效载荷之后。

    于 2021 年 7 月 19 日添加

    要提取操作码和长度等信息,您必须对给定字节应用一些位操作。

    以下是摘录自 https://github.com/napengam/phpWebSocketServer/blob/master/server/RFC6455.php 显示服务器如何解码帧。

    public function Decode($frame) {
            // detect ping or pong frame, or fragments
    
            $this->fin = ord($frame[0]) & 128;
            $this->opcode = ord($frame[0]) & 15;
            $length = ord($frame[1]) & 127;
    
            if ($length <= 125) {
                $moff = 2;
                $poff = 6;
            } else if ($length == 126) {
                $l0 = ord($frame[2]) << 8;
                $l1 = ord($frame[3]);
                $length = ($l0 | $l1);
                $moff = 4;
                $poff = 8;
            } else if ($length == 127) {
                $l0 = ord($frame[2]) << 56;
                $l1 = ord($frame[3]) << 48;
                $l2 = ord($frame[4]) << 40;
                $l3 = ord($frame[5]) << 32;
                $l4 = ord($frame[6]) << 24;
                $l5 = ord($frame[7]) << 16;
                $l6 = ord($frame[8]) << 8;
                $l7 = ord($frame[9]);
                $length = ( $l0 | $l1 | $l2 | $l3 | $l4 | $l5 | $l6 | $l7);
                $moff = 10;
                $poff = 14;
            }
    
            $masks = substr($frame, $moff, 4);
            $data = substr($frame, $poff, $length); // hgs 30.09.2016
            $text = '';
            $m0 = $masks[0];
            $m1 = $masks[1];
            $m2 = $masks[2];
            $m3 = $masks[3];
            for ($i = 0; $i < $length;) {
                $text .= $data[$i++] ^ $m0;
                if ($i < $length) {
                    $text .= $data[$i++] ^ $m1;
                    if ($i < $length) {
                        $text .= $data[$i++] ^ $m2;
                        if ($i < $length) {
                            $text .= $data[$i++] ^ $m3;
                        }
                    }
                }
            }
            return $text;
        }
    

    https://github.com/napengam/phpWebSocketServer/blob/master/phpClient/websocketCore.php 中,您将找到客户端的编码和解码。

    【讨论】:

    • 我有3个问题,我将它分成3个cmets。首先,我不明白。我知道如何读取帧数据的当前方式是逐字节,而不是逐位。在这种情况下,第二个字节11111101 等于253 而不是125。我说的对吗?
    • 第二个,在 RFC 中,If 127, the following 8 bytes interpreted as a 64-bit unsigned integer (the most significant bit MUST be 0) are the payload length.。为什么是 4 个字节而不是 8 个字节?
    • 3、如何在没有屏蔽键的情况下从客户端向服务器发送帧数据?我假设第二个字节的值必须小于 128 或127, 126 ...。这意味着有效载荷长度必须在 0 到 127 之间。但是,我使用有效载荷 abcdef 对其进行了测试,这意味着有效载荷长度为 6。为什么第二个字节是 134 而不是 6
    • 第四,如果PAYLOAD_LENGTH等于126127,如何计算EXTENDED_PAYLOAD_LENGTH?,在RFC中,如果是126,下一个两个 字节是EXTENDED_PAYLOAD_LENGTH。假设它是每字节 8 位。 firstsecond 下一个字节可能在0 - 255 之间。这是否意味着如果第二个字节等于126,则实际最大有效载荷长度为255 + 255
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多