如果我在应用程序中使用了TCP协议,那么我需要在应用程序中使用另一种重试机制吗?
我希望我的客户端收到我的消息100%,如果它接收到重复的消息,那么客户端会向服务器重新发送ACK,在哪种情况下如果我使用tcp长连接,服务器将无法获得ack? 并假设服务器/客户端代码不会丢弃ACK本身,并且tcp连接将保持活动状态,在这种情况下,我是否需要在服务器中使用重试机制以确保客户端获取msg?还是有任何条件会使确认丢失?还是会丢失TCP数据包?
答案 0 :(得分:1)
TCP(仅)确保数据传输不会丢失,重复或对应用程序重新排序。但是,当数据实际到达目标系统时,它不会给发送者任何反馈。它还不关心应用程序是否实际处理了数据,并且如果应用程序在退出前实际上已读取所有数据,也不会提供可靠的反馈。因此,如果您需要反馈,表明应用程序已对数据进行了实际处理并做出了反应,那么您需要向应用程序协议中添加适当的反馈。
答案 1 :(得分:0)
TCP是可靠的协议,它将不会从流的中间丢弃或重新排序任何数据。 (OOB数据是一个例外)
示例:当您从客户端向服务器发送消息A和B(按此顺序)时。 TCP保证服务器应用程序在B之前从TCP流接收A。 在违反该规则之前,TCP将中止TCP连接。
TCP为您执行所有必要的重新传输,以确保来自客户端的输出流与服务器的输入流相同。反之亦然。
如果您的客户端和服务器应用程序不会丢弃/忽略已传输的消息, 那么就没有理由在应用程序级别重新发送消息。 重新发送邮件很可能会导致重复。