我一直在测试一个程序,它通过1Gbps线路在两台机器之间进行简单的通信。当通过线路运行TCP通信时,当网络完全被淹没(以100%或接近100%的使用率运行)时,我偶尔会在客户端收到写入错误(由于超时)。当我运行同一程序的多个实例到不同的端口时,通常会发生这种情况。
我的问题是,是否有可能出现写入错误但仍然在服务器端收到消息。似乎正在发生的事情,我不太清楚为什么。可能是回到客户端的ACK是超时的吗?
答案 0 :(得分:1)
是的,这是可能的。 TCP不保证您收到成功发送的数据,也不保证未收到发送失败的数据。这个问题无法解决。它被称为将军问题。总有一种方法可以丢失消息/数据包,使发送者得出错误的结论。 TCP保证接收方接收发送方发送的相同字节流,但可能在任意点切断。
这种不可靠性也有性能原因。 TCP数据在主机和网络上都是缓冲的。致谢被推迟。
你必须忍受这个。如果你使你的场景更具体,我可以提出一些处理这个问题的策略。
答案 1 :(得分:0)
send
将数据放入TCP发送缓冲区。
如果发送缓冲区没有足够的空间,send
将阻止util,数据被完全或部分复制到发送缓冲区,或者设计的超时到达。
读取超时和写入超时即可。你应该检查和处理它们。方法是在超时后重新启动读/写操作。除超时外,还要注意其他读/写错误。