17

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

4

4 回答 4

20

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

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

于 2015-09-09T08:49:51.483 回答
2

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

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

于 2015-09-09T08:13:54.793 回答
1

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

于 2018-09-27T03:22:16.870 回答
0

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

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

tcp 和 udp 的区别

于 2015-09-09T08:28:44.117 回答