TCP是否需要验证?

TCP是否需要验证?,tcp,Tcp,我必须实现一个应用程序,在很短的时间内,每隔几秒钟向服务器发送一次数据包,当服务器接收到数据包时,它会向客户端发送一个响应,然后客户端才继续发送另一个数据包。这听起来很好,但我们使用的是TCP,服务器一收到数据包,响应就来了,而不是后期处理之类的。所以我想知道,你为什么要这样做?客户端有一个队列,我在其中保存所有数据包,并执行如下操作: try { send packet // exception is thrown if connection is lost remove pa

我必须实现一个应用程序,在很短的时间内,每隔几秒钟向服务器发送一次数据包,当服务器接收到数据包时,它会向客户端发送一个响应,然后客户端才继续发送另一个数据包。这听起来很好,但我们使用的是TCP,服务器一收到数据包,响应就来了,而不是后期处理之类的。所以我想知道,你为什么要这样做?客户端有一个队列,我在其中保存所有数据包,并执行如下操作:

try {
    send packet // exception is thrown if connection is lost
    remove packet from queue
} catch exception {
    try to reconnect 
}
因此,在这种情况下,只有当发送成功时,数据包才会从队列中删除

你知道吗?这是最佳实践吗?如果有人能帮我澄清此事,我将不胜感激


谢谢

在某些情况下,发送是不够的。如果必须接收您要推出的数据这一点非常关键,那么您应该等待远程端接收/处理数据包的确认


即使网络级的东西工作正常,数据包到达目的地,目的地机器仍可能崩溃或丢失数据。如果在发送时删除,则该数据将消失。等待来自远程端的确认将至少使您能够重新发送已损坏/丢失的数据包。

一个选项是将数据包放入队列并发送它们。发送后,将它们移动到“挂起”队列中。一旦另一端处理完它们,就将它们标记为已完成。然后你会遇到其他问题。如果另一端处理它们,但ack从未到达您的一端,该怎么办?这是一个相对研究的问题,如果需要确定的话,我建议您研究分布式事务和两阶段提交

问:你的问题是什么?“开火然后忘记”(而不是排队)会更好吗?A:很可能。使用UDP而不是TCP会更好吗(只要我们保持队列并管理重试)?A:很可能。检测“发送”错误(没有某种“确认”)有问题吗?A:是的。这些(潜在)问题的答案都是:“视情况而定”。)IMHO…TCP保证传输和订购。因此,使用UDP,您可能会丢失排序,您必须自己进行重新发送、重新排序和分段。如果您只需要知道连接已启动,则有一个名为TCP_KEEPALIVE的选项,它将发送数据包以保持连接的活动性,并在数据包丢失时超时。这自然不能保证另一端的软件工作正常,只保证TCP连接仍然活动。查询也是幂等的吗?即使它们已经被处理过,你能不能在不造成任何损坏的情况下重新发送它们?这将对您的设计产生影响。我不完全确定服务器如何处理这些数据包,但这些数据包有时间戳,不会弄乱任何东西。您认为服务器可能会崩溃,连接是否会保持活动状态?也许如果它以某种方式被保存在一个线程中?软件可能会失败而不会消亡。例如,它可能会死锁。你说得很对。我从一个非常天真的角度看待这个问题。谢谢你的洞察力。