我目前正在开发一个Java WebSocket客户端应用程序,我必须确保来自服务器的每条消息都被客户端接收。是否有可能由于连接中断而丢失一些消息(一旦它们从服务器发送)?WebSocket是基于TCP的,所以这应该不会发生,对吧?
这是可能的。TCP保证数据包的顺序,但这并不意味着即使底层网络中发生了不可恢复的故障,从服务器发送的所有数据包也能到达客户端。想象一下,当您的应用程序正在与服务器通信时,有人在最糟糕的时间拔出了您的局域网电缆或关闭了您的WiFi接入点。TCP不能克服这样的麻烦。
为了确保从服务器发送的每条WebSocket消息都能到达客户端,你必须在应用层实现某种SYN/ACK。
TCP是一个有保证的协议——数据包将被远端较高的应用程序级别以正确的顺序接收(这与UDP相反,UDP是一个发送和希望协议)。
一般来说,TCP应该用于所有数据必须正确到达远端的连接。UDP用于丢失数据包而不会产生重大问题的地方(例如流媒体服务,NTP更新)
在我的游戏中,为了对抗错过的web套接字消息,我为每个消息添加了一个int/long ID。当客户端检测到它接收到的id序列中有错误时,客户端将请求服务器提供新的数据,以便能够正常恢复。
TCP有一个叫做控制流的东西——这意味着它提供了可靠的、有序的和错误检查的传递。换言之,TCP是一个不断检查数据是否到达的协议。
该协议有不同的机制来确保。你可以在下面的链接中看到TCP和UDP(没有控制流)之间的区别。
tcp和udp的区别