websocket客户端数据包取消框架/取消屏蔽

Posted

技术标签:

【中文标题】websocket客户端数据包取消框架/取消屏蔽【英文标题】:websocket client packet unframe/unmask 【发布时间】:2011-12-18 12:38:20 【问题描述】:

我正在尝试实现最新的 websocket 规范。但是,我无法通过成功握手后的揭露步骤。

我收到以下网络套接字框架:

<<129,254,1,120,37,93,40,60,25,63,71,88,92,125,80,81,73,
51,91,1,2,53,92,72,85,103,7,19,79,60,74,94,64,47,6,83,
87,58,7,76,87,50,92,83,70,50,68,19,77,41,92,76,71,52,
70,88,2,125,90,85,65,96,15,14,20,107,31,14,28,100,27,9,
17,122,8,72,74,96,15,86,68,37,68,18,76,48,15,28,93,48,
68,6,73,60,70,91,24,122,77,82,2,125,80,81,85,45,18,74,
64,47,91,85,74,51,21,27,20,115,24,27,5,37,69,80,75,46,
18,68,72,45,88,1,2,40,90,82,31,37,69,76,85,103,80,94,
74,46,64,27,5,60,75,87,24,122,25,27,5,47,71,73,81,56,
21,27,93,48,88,76,31,57,77,74,11,55,73,68,73,115,65,81,
31,104,26,14,23,122,8,75,68,52,92,1,2,110,24,27,5,53,
71,80,65,96,15,13,2,125,75,83,75,41,77,82,81,96,15,72,
64,37,92,19,93,48,68,7,5,62,64,93,87,46,77,72,24,40,92,
90,8,101,15,28,83,56,90,1,2,108,6,13,21,122,8,82,64,42,
67,89,92,96,15,93,19,56,28,8,65,101,31,94,16,105,28,10,
20,56,30,14,65,56,27,93,71,106,16,11,17,63,25,4,17,57,
73,89,17,59,29,88,29,106,24,27,5,46,65,72,64,54,77,69,
24,122,66,93,93,49,5,12,8,109,15,28,76,59,90,93,72,56,
76,1,2,41,90,73,64,122,8,89,85,50,75,84,24,122,25,15,
23,105,25,5,19,106,26,14,20,111,25,27,5,53,77,85,66,53,
92,1,2,110,26,13,2,125,95,85,65,41,64,1,2,108,27,10,19,
122,7,2>>

根据此处定义的基本框架协议 (https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2) 我有:

fin:1, rsv:0, opcode:1, mask:1, length:126

被屏蔽的应用程序+有效负载数据是:

<<87,58,7,76,87,50,92,83,70,50,68,19,77,41,92,76,71,52,70,88,2,125,90,85,65,96,
15,14,20,107,31,14,28,100,27,9,17,122,8,72,74,96,15,86,68,37,68,18,76,48,15,
28,93,48,68,6,73,60,70,91,24,122,77,82,2,125,80,81,85,45,18,74,64,47,91,85,
74,51,21,27,20,115,24,27,5,37,69,80,75,46,18,68,72,45,88,1,2,40,90,82,31,37,
69,76,85,103,80,94,74,46,64,27,5,60,75,87,24,122,25,27,5,47,71,73,81,56,21,
27,93,48,88,76,31,57,77,74,11,55,73,68,73,115,65,81,31,104,26,14,23,122,8,75,
68,52,92,1,2,110,24,27,5,53,71,80,65,96,15,13,2,125,75,83,75,41,77,82,81,96,
15,72,64,37,92,19,93,48,68,7,5,62,64,93,87,46,77,72,24,40,92,90,8,101,15,28,
83,56,90,1,2,108,6,13,21,122,8,82,64,42,67,89,92,96,15,93,19,56,28,8,65,101,
31,94,16,105,28,10,20,56,30,14,65,56,27,93,71,106,16,11,17,63,25,4,17,57,73,
89,17,59,29,88,29,106,24,27,5,46,65,72,64,54,77,69,24,122,66,93,93,49,5,12,8,
109,15,28,76,59,90,93,72,56,76,1,2,41,90,73,64,122,8,89,85,50,75,84,24,122,
25,15,23,105,25,5,19,106,26,14,20,111,25,27,5,53,77,85,66,53,92,1,2,110,26,
13,2,125,95,85,65,41,64,1,2,108,27,10,19,122,7,2>>

而 32 位掩码密钥是:

<<37,93,40,60,25,63,71,88,92,125,80,81,73,51,91,1,2,53,92,72,85,103,7,19,79,60,
74,94,64,47,6,83>>

根据https://datatracker.ietf.org/doc/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2:

j                   = i MOD 4
transformed-octet-i = original-octet-i XOR masking-key-octet-j

但是,我似乎没有从客户端发送我的原始八位字节,这基本上是一个 xml 数据包。任何方向,更正,建议都非常感谢。

【问题讨论】:

确实如此,但是我看不到基本框架协议有任何变化。它与上面链接中的定义相同。 查看 github 上的 misultin 项目。它具有您需要的所有 websocket 解析代码。原始代码使用基于流程的方法,重用该代码有点困难(github.com/ostinelli/misultin/blob/master/src/…)。如果您需要类似 foldl 的功能解析代码而不是基于进程的解析代码,请查看我的 misultin 分支 (github.com/gleber/misultin/branches/functionalize-ws-code)。 【参考方案1】:

我认为您误读了协议规范的数据帧部分。

您对第一个字节 (129) 的解释是正确的 - fin + opcode 1 - 文本消息的最终(也是第一个)片段。 下一个字节 (254) 意味着消息的主体被屏蔽,并且接下来的 2 个字节提供了它的长度(长度为 126 或 127 意味着更长的消息,其长度不能用 7 位表示。126 意味着后面的 2 个字节保存长度;127 表示它后面的 4 个字节)。 以下 2 个字节 - 1、120 - 表示消息长度为 376 个字节。 以下 4 个字节 - 37,93,40,60 - 是您的掩码。 剩下的数据是你的信息,应该在你写的时候转换,给出信息

&ltbody xmlns='http://jabber.org/protocol/httpbind' rid='2167299354' to='jaxl.im' xml:lang='en' xmpp:version='1.0' xmlns:xmpp=' urn:xmpp:xbosh'ack='1' route='xmpp:dev.jaxl.im:5222' wait='30' hold='1' content='text/xml;字符集=utf-8'版本='1.1 0' newkey='a6e44d87b54461e62de3ab7874b184dae4f5d870' sitekey='jaxl-0-0' iframed='true' epoch='1324196722121' height='321' width='1366'/>

【讨论】:

还没有尝试过,但我相信这就是问题所在。可能我确实理解正确,但没有正确实施(主要是由于我的 erlang 代码中的位/二进制处理不当)。感谢您提供正确的指针,是的,这确实是我在取消屏蔽后正在寻找的数据包:) 将从这里删除其余部分,谢谢

以上是关于websocket客户端数据包取消框架/取消屏蔽的主要内容,如果未能解决你的问题,请参考以下文章

PHP Websocket 服务器 - 在 socket_recv 中处理更多帧

当客户端断开连接而不取消连接时,Websocket.ReceiveAsync 导致崩溃

无法在 Web 套接字中取消屏蔽多个帧

如何在设置记录数据时屏蔽 Extjs 网格并在设置后取消屏蔽?

Chrome 无法连接到 websocket 服务器(操作码 -1)“握手被取消”

Websockets 在 Chrome (wss) 中不工作:“握手被取消”