如何阅读RFC6455的Base Framing Protocol?

How to read the Base Framing Protocol of RFC6455?

我的参考资料是:

  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.

只是为了说明一点。

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

10000001

第二个字节: 最左边的位表示数据是否 masked 剩下的七位表示 length

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

11111110 这里的长度指示符是 126 因此下一个 two 字节将为您提供掩码键 four 字节的长度

11111111 这里的长度指标是 127 因此下一个 8 字节将为您提供掩码键 4 字节的长度

所有这些都遵循屏蔽的有效负载。

已添加 2021-07-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中,您会找到客户端的编码和解码。