【问题标题】:Can websocket messages get lost or not?websocket消息会丢失吗?
【发布时间】:2015-12-05 02:18:45
【问题描述】:

我目前正在开发 Java WebSocket 客户端应用程序,我必须确保客户端接收到来自服务器的每条消息。由于连接中断,我是否有可能丢失一些消息(一旦它们从服务器发送)? WebSocket 是基于 TCP 的,所以这应该不会发生吧?

【问题讨论】:

  • 要么收到消息,要么完全失去连接。
  • 但是在我完全失去连接之后,websocket clientEndpoint 就不能工作了,对吧?这就是为什么我构建了一个重新连接处理程序,它每 30 秒发送一条 ping/pong 消息以检查连接是否仍然存在,如果没有,它会尝试创建与服务器的新连接。
  • 收到不代表已读

标签: java tcp websocket java-websocket


【解决方案1】:

TCP 是一种有保证的协议 - 远端的更高应用程序级别会以正确的顺序接收数据包(这与作为发送和希望协议的 UDP 不同)。

一般来说,TCP 应该用于所有数据必须正确到达远端的连接。 UDP 用于可以丢弃丢失数据包而不会出现重大问题的情况(例如流服务、NTP 更新)

【讨论】:

    【解决方案2】:

    TCP 有一种叫做控制流的东西——这意味着它提供可靠、有序和经过错误检查的传送。 换句话说,TCP 是一种不断检查数据是否到达的协议。

    此协议具有不同的机制来确保这一点。 您可以在下面的链接中看到 TCP 和 UDP(没有控制流)之间的区别。

    Difference between tcp and udp

    【讨论】:

      【解决方案3】:

      它可能发生。 TCP 保证了数据包的顺序,但这并不意味着即使在底层网络发生不可恢复的故障时,从服务器发送的所有数据包都到达客户端。想象一下,当您的应用程序与您的服务器通信时,有人在最糟糕的时间拔出您的 LAN 电缆或关闭您的 WiFi 接入点。 TCP 无法克服这样的麻烦。

      为确保从您的服务器发送的每条 WebSocket 消息都到达您的客户端,您必须在应用层实现某种 SYN/ACK。

      【讨论】:

      • 您似乎在暗示未到达的 TCP 数据包可能会被忽视。是不是应用层的问题,硬件已经发送了一个ACK,但是应用在读取接收到的消息之前就崩溃了?
      • 应用层 ACK 是否足以确保准确地 0% 丢包?我们正在开发一个应用程序,即使是 0.001% 的损失也会造成严重的麻烦。谢谢!
      【解决方案4】:

      在我的游戏中,为了应对错过的网络套接字消息,我为每条消息添加了一个 int/long ID。当客户端检测到其接收到的 ID 序列有问题时,客户端会向服务器请求新数据以便能够正确恢复。

      【讨论】:

      • 你在想web rtc吗?网络套接字应该在套接字内按顺序传递消息。
      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 2015-05-25
      • 2019-12-11
      • 2011-10-11
      • 1970-01-01
      • 2015-07-21
      • 2015-01-19
      • 1970-01-01
      相关资源
      最近更新 更多