为分布式客户端提供可靠的TCP传输



我正在做一个项目,在这个项目中,我们有多个GUI客户端在用户桌面上运行,连接到一台服务器。客户端将在全球范围内分布,并通过广域网进行连接。

我想确保除了GUI本身的发布包之外,客户端PC上运行的应用程序没有任何依赖关系。传输本身应该是可靠的(没有丢弃的消息,重放未确认的消息)。

我想为我们的应用程序编写一个自定义的基于TCP套接字的传输,并实现一些逻辑来检测丢弃或未确认的消息。

我还考虑使用ActiveMQ(通过TCP/IP传输使用JMS)。还有其他选择或建议吗?

编辑:TCP是一种可靠的传输,但如果客户端断开连接或重新启动,我需要检测并重放可能已丢弃的消息。

TCP保证在一个没有应用程序错误或崩溃的快乐世界中交付。

一些TCP数据可能会被网络堆栈确认,但在处理之前,应用程序可能已经崩溃(或服务器崩溃)。

带有事务的ActiveMQ让您可以处理这些事情。即使是AMQ中的应用层ack也会给您带来可靠性,同时增加系统复杂性(当然)。

TCP[传输控制协议]已经处理了所有这些。

它保证要么你会得到你的所有数据,并且你会按照正确的顺序得到它,要么发件人被告知某些数据无法发送。所有TCP数据包都包含它们在流中的位置,协议会为接收到的每个数据包发送一个确认。如果发送方没有收到确认,它会重新发送接收方可能没有的所有数据。只有在接收器获得应用层想要的数据(总是流中的下一个字节)之后,它才会将数据馈送到应用层。

如果TCP连接无法发送或接收数据(但不仅仅是因为它没有接收到任何数据),TCP最终会放弃,并且在发送方会出现I/O异常。如果接收器知道它应该接收数据(或者它有数据要发送,或者你启用了保活),它也会放弃。您可以调整TCP协议放弃之前的时间。默认值已足够。

如果您想知道由于断开连接而丢失了多少数据(但客户端可能不会很快连接),也可以在应用程序层发送确认。如果出现I/O异常(仅当出现异常时),请将最后确认的消息ID存储在数据库中,并在重新连接时恢复传输。

如果您不希望TCP重新发送丢失的数据包,请使用UDP。UDP只保证两件事:接收方接收的内容,发送方发送的内容,以及它从不尝试两次传递同一个数据包。

最新更新