【问题标题】:TCP write error but not reallyTCP 写错误但不是真的
【发布时间】:2014-08-20 17:58:36
【问题描述】:

我一直在测试一个程序,它在两台机器之间通过 1Gbps 线路进行简单通信。在通过线路运行 TCP 通信时,当网络完全淹没(以或接近 100% 的使用率运行)时,我偶尔会在客户端收到写入错误(由于超时)。当我运行同一程序的多个实例到不同的端口时,通常会发生这种情况。

我的问题是,是否有可能出现写入错误但仍会在服务器端收到消息。看来这就是正在发生的事情,我不太清楚为什么。会不会是返回给客户端的ACK是什么超时了?

【问题讨论】:

  • 你收到什么错误?
  • 由于超时而捕获的写入错误

标签: networking tcp network-programming


【解决方案1】:

是的,这是可能的。 TCP 不保证您发送成功的数据会被接收,发送失败的数据不会被接收。这个问题是无解的。它被称为将军问题。总有一种方法可以释放消息/数据包,从而使发送者得出错误的结论。 TCP 保证接收方接收到的字节流与发送方发送的相同,但可能在任意点中断。

这种不可靠性也有性能原因。 TCP 数据在主机和网络上都有缓冲。确认延迟。

你必须忍受这个。如果你让你的场景更具体,我可以建议一些处理这个问题的策略。

【讨论】:

  • 谢谢,将我引向将军问题或多或少是我要找的问题
  • 这个表述太笼统了。 TCP 确实保证您不会收到两次数据,不会出现乱序或有漏洞。
【解决方案2】:

send 将数据放入 TCP 发送缓冲区。

如果发送缓冲区没有足够的空间,send 将阻止 util 将数据全部或部分复制到发送缓冲区,或者设计的超时时间到达。

读取超时和写入超时正常。您应该检查并处理它们。方法是超时后重新启动读/写操作。您还要注意除超时之外的其他读/写错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多