【问题标题】:Can websocket messages arrive out-of-order?websocket消息可以乱序到达吗?
【发布时间】:2012-08-02 00:48:05
【问题描述】:

如果我们在同一个 html5 websocket 上发送两条消息,间隔毫秒,

理论上是否有可能消息的到达顺序与发送顺序不同?

【问题讨论】:

标签: html networking websocket socket.io


【解决方案1】:

简短回答:不。

长答案:

WebSocket 在 TCP 上运行,因此在该级别 @EJP 的答案适用。 WebSocket 可以被中间人(如 WS 代理)“拦截”:允许重新排序 WebSocket 控制帧(即 WS pings/pongs),但在没有 WebSocket 扩展时不允许重新排序消息帧。如果存在原则上允许重新排序的新扩展扩展,那么中介只有在理解扩展和适用的重新排序规则时才能这样做。

【讨论】:

    【解决方案2】:

    它们不可能无序地进入您的应用程序。网络上可能发生任何事情,但 TCP 只会按照发送顺序向您显示字节。

    【讨论】:

    • FWIW 我肯定在 FF 开发版 45.3.0 中看到了严重的乱序行为。我观察了网络流,我的“1”、“2”、“3”、“4”……等等都在网络上按顺序排列,但是 JS websocket 的 .onmessage() 函数被调用了。 (只需在回调中将消息附加到文档正文:3 2 1 6 5 4 9 8 7...)不要相信消息顺序。
    • @BadZen 这是 node.js 问题,即应用层问题,而不是 WebSocket 或 TCP 问题。消息不能乱序到达应用程序。应用程序代码当然可以随意修改订单。
    • 我注意到问题中没有提到 node.js。
    • @Marquis of Lorne - 相反,问题中绝对提到了 node.js。 “socket.io”是问题的标签之一,socket.io是基于node.js之上的——没有node.js就没有socket.io在运行。
    • @BadZen - socket.io 在底层支持其他传输机制,如轮询等,它们同时打开多个连接并可能导致竞争条件。如果你没有强制 socket.io 处于 websocket-only 模式,你就不能依赖你所看到的。其他人报告说,当 socket.io 处于仅 websocket 模式时,这是可靠的。或者,使用 ws 而不是 socket.io 被报告为可靠的以确保消息顺序。
    【解决方案3】:

    在网络层,假设 TCP 保证消息按顺序到达。在应用程序层,代码中可能会出现错误,并导致您的消息在代码逻辑中出现乱序。它可能是您的应用程序正在使用的网络堆栈或您的应用程序代码本身。

    如果您问我,我的 Node.js 应用程序能否保证按顺序发送和接收消息?我不得不说不。我已经在高延迟和低信号下运行连接到 WiFi 的 websocket 应用程序。它会导致非常奇怪的行为,就好像数据包被丢弃并且消息乱序一样。

    这篇文章很好看https://samsaffron.com/archive/2015/12/29/websockets-caution-required

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多