我正在用C++写一个WebSocket实现。现在差不多完成了,我想根据这个WebSocket echo-server进行测试。首先,我在HTTP握手中连接到它并且将Upgrade
连接到WebSocket协议。发送Textframe到WebSocket echo-server
然后我发送一个带有“This is a test”的文本框作为内容。这是我的程序发送:
FRRR-OP- M-LENGTH MASK-KEY
10000001 10001110 00000100
MASK-KEY MASK-KEY MASK-KEY
01000101 11010000 01101011
--DATA-- --DATA-- --DATA--
01010000 00101101 10111001
--DATA-- --DATA-- --DATA--
00011000 00100100 00101100
--DATA-- --DATA-- --DATA--
10100011 01001011 01100101
--DATA-- --DATA-- --DATA--
01100101 10000100 00001110
--DATA-- --DATA--
01110111 00110001
我很快就会解释字母:
- ˚F:表示这是在消息(报价RFC6455的最后片段)
- RRR:RSV1,RSV2,RSV3。始终为0,除非使用扩展名。
- -OP-:Op-Code。操作码1 =文本消息
- M:指示数据是否被屏蔽。 1 =它被掩盖了。
- -LENGTH:数据的字节长度(,不包括 MASK-KEY)。
- MASK-KEY:用于加密数据的密钥。总是4字节长。
要掩蔽的数据转换成未掩蔽数据,或反之亦然,所述 下面的算法被应用。无论翻译的方向如何,相同的算法都适用 ,例如,应用相同的步骤屏蔽数据以揭露数据。
八位字节转换后的数据的I(“转化的八位位组的-I”)是八位位组八位位组i中的原始数据的(“原始八位位组I”)的在 索引XOR 掩蔽i的模4键( “掩蔽密钥八位组-J”):
j = i MOD 4 transformed-octet-i = original-octet-i XOR masking-key-octet-j
- 数据:加密的数据( “这是一个测试”)
发送此帧后,它将采取回声服务器很长的响应(〜45秒),这是我得到的数据:
FRRR-OP- M-LENGTH --DATA--
10000001 00001110 01010100
--DATA-- --DATA-- --DATA--
01101000 01101001 01110011
--DATA-- --DATA-- --DATA--
00100000 01101001 01110011
--DATA-- --DATA-- --DATA--
00100000 01100001 00100000
--DATA-- --DATA-- --DATA--
01010100 01100101 01110011
--DATA-- --DATA-- --DATA--
01110100 10001001 00000000
将数据转换为字符串结果这个。
This is a Test‰
因此,这里出了点问题。服务器响应时,它不会是错误的OP代码。它不能是错误的加密,因为服务器可以解密数据。你可以看到的长度也没有错。然而,很奇怪的是服务器需要很长时间才能做出响应。它似乎正在等待更多的数据来。