Websockets 消息完整性

Posted

技术标签:

【中文标题】Websockets 消息完整性【英文标题】:Websockets message integrity 【发布时间】:2016-06-26 03:41:27 【问题描述】:

当在客户端和服务器之间使用 WebSocket 全双工数据连接时,我可以保证,当从服务器发送两条消息时,我将在客户端收到这两条完全相同的消息,TCP 确实如此不是

换句话说,如果服务器依次发送hello然后its me,客户端是否总是收到两条包含helloits me的消息,或者客户端是否有可能收到helloit然后@ 987654327@ 或什至只有一条消息,如 helloits me

【问题讨论】:

看看这篇文章:***.com/questions/20685208/… 每条消息周围都有分隔符;它们永远不会像那样结合在一起。我不确定“保证”对您意味着什么;规范以某种方式编写并重新发送丢失的数据包,与数据报不同,但它是互联网,如果没有后续验证,很难确定客户端是否从高级套接字获得特定消息我们从 JS 中使用的 API。 【参考方案1】:

WebSocket 最初有文本消息的开始和结束字节,但那是旧信息。 (2011 年 12 月)框架中有一个长度分量。顺便说一句,帧规范中有一个标志,指定帧是整个“消息”还是“消息片段”,即,还有其他帧构成这个“消息”。由接收器正确组合片段以传递给应用程序代码。通常你不必考虑这一点,除非你有非常大的“消息”(将 WS“消息”视为“数据”而不是真正的消息...... WS 本身并不是真正的“消息传递”协议)。

但请注意,WebSocket 是一种低级传输。把它想象成一个基于 Web 的 TCP。应用程序程序员应该使用“超过 WS/WSS”的高级协议,而不用担心排序、重新连接、存在、发布/订阅、元组空间、保证交付等。如果我们不这样做,几十个和几十个几十年前的应用程序协议将被重新发明。

【讨论】:

消息框架会被完全破坏吗?即,而不是你好是 hel#@ ? 因此,如果每条消息都是完整的 JSON 编码数据,我总是可以安全地在另一端的每条消息上 JSON.parse 并且永远不会有问题?【参考方案2】:

如果连接非常糟糕,您可能会丢失一条消息(但是应该使用 tcp 重新发送),但它不太可能以这种方式拆分。 每个文本消息都有边界 - 开始 (0x00) 和结束 (0xFF) 字节。浏览器不应该弄乱消息。 您可能可以按其他顺序接收消息。

你怎么能更确定:

    将您自己的控制总和添加到消息中(但确实是开销)。 使用 wss (websockets+tls/ssl) 协议 - 损坏的消息无法很好地解密。

【讨论】:

你有任何可以找到更多细节的来源吗? 仅 RFC。 WebSockets 分片:tools.ietf.org/html/rfc6455#section-5.4 如果我想在我的消息中发送 0x00 或 0xFF 怎么办? UTF-8 不包含带有此类代码的符号。因此,如果您只发送文本字符串,则永远不需要发送它们。如果您希望发送具有不可预测字节的二进制数据,您可以为此使用特殊的二进制帧。 我想发送二进制数据,这就是为什么! :p

以上是关于Websockets 消息完整性的主要内容,如果未能解决你的问题,请参考以下文章

Websockets 有时会发送不完整的数据

如何确保消息使用 WebSockets 到达目的地?

Websockets 消息丢失

发送大于 126 字节的 websockets 消息

允许在 websockets 中删除消息

如何使用 websockets 通过 Flask 向特定用户发送消息?