Networking TCP写入错误,但不是真正的错误
我一直在测试一个程序,它在两台机器之间通过1Gbps的线路进行简单的通信。在线路上运行TCP通信时,当网络完全被淹没(以或接近100%的使用率运行)时,我偶尔会在客户端收到写错误(由于超时)。当我运行同一程序的多个实例到不同的端口时,通常会发生这种情况Networking TCP写入错误,但不是真正的错误,networking,tcp,network-programming,Networking,Tcp,Network Programming,我一直在测试一个程序,它在两台机器之间通过1Gbps的线路进行简单的通信。在线路上运行TCP通信时,当网络完全被淹没(以或接近100%的使用率运行)时,我偶尔会在客户端收到写错误(由于超时)。当我运行同一程序的多个实例到不同的端口时,通常会发生这种情况 我的问题是,是否有可能获得写入错误,但仍在服务器端接收消息。看来这就是正在发生的事情,我不太清楚为什么。可能是因为返回到客户端的ACK超时了吗?是的,这是可能的。TCP不保证接收成功发送的数据,也不保证不接收未成功发送的数据。这个问题无法解决。这
我的问题是,是否有可能获得写入错误,但仍在服务器端接收消息。看来这就是正在发生的事情,我不太清楚为什么。可能是因为返回到客户端的ACK超时了吗?是的,这是可能的。TCP不保证接收成功发送的数据,也不保证不接收未成功发送的数据。这个问题无法解决。这就是所谓的将军问题。总是有办法释放消息/数据包,使发送者得出错误的结论。TCP保证接收方接收到与发送方发送的相同的字节流,但可能在任意点被切断 这种不可靠性也有性能方面的原因。TCP数据在两台主机和网络上都有缓冲区。确认延迟
你必须接受这个。如果您让您的场景更具体,我可以建议一些处理策略。
send
将数据放入TCP发送缓冲区
如果发送缓冲区没有足够的空间,send
将阻止将数据完全或部分复制到发送缓冲区,或者达到设计的超时
读取超时和写入超时正常。你应该检查并处理它们。方法是在超时后重新启动读/写操作。您还需要注意除超时之外的其他读/写错误。谢谢,让我了解将军问题或多或少是我在寻找的。这一点说得太宽泛了。TCP确实保证您不会收到两次数据,或者数据不正常,或者数据中有洞。您收到了什么错误?由于超时而捕获的写入错误