如何阅读RFC6455的Base Framing Protocol?
How to read the Base Framing Protocol of RFC6455?
我的参考资料是:
为什么第一个字节129
代表FIN
、RSV1
、RSV2
、RSV3
、Opcode
?
我的预期结果是:
- 第一个字节是
FIN
/1位,RSV1
/1位,RSV2
/1位,RSV3
/1位,Opcode
/ 1 位,Mask
/ 1 位。共 9 位。
- 第二个字节是
Payload length
。共 7 位。
我的实际结果是:
- 第一个字节分别代表
FIN
、RSV1
、RSV2
、RSV3
、Opcode
、
- 第二个字节代表
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中,您会找到客户端的编码和解码。
我的参考资料是:
为什么第一个字节129
代表FIN
、RSV1
、RSV2
、RSV3
、Opcode
?
我的预期结果是:
- 第一个字节是
FIN
/1位,RSV1
/1位,RSV2
/1位,RSV3
/1位,Opcode
/ 1 位,Mask
/ 1 位。共 9 位。 - 第二个字节是
Payload length
。共 7 位。
我的实际结果是:
- 第一个字节分别代表
FIN
、RSV1
、RSV2
、RSV3
、Opcode
、 - 第二个字节代表
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中,您会找到客户端的编码和解码。