websocket 消息会不会丢失?

Can websocket messages get lost or not?

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

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

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

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

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

Difference between tcp and udp

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

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

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