【问题标题】:Is is possible to know if data was buffered when a TCP connection fails on Linux?是否有可能知道在 Linux 上的 TCP 连接失败时是否缓冲了数据?
【发布时间】:2015-09-12 12:18:48
【问题描述】:

当您在套接字上调用send 时,内核中的数据缓冲区并且您会得到一个非错误返回。内核实现忙于响应和窗口化以将所有数据传送到另一端。

如果北京梗咬断电线,连接将关闭,留下一些数据未发送。在收到指示关闭的错误后,有什么方法可以找出是这种情况吗?最终,Linux、Windows 和 OS/X 上的机制是可取的,但它不必是 相同 机制。

评论中有人想知道:为什么?

考虑一个已经可以从节点的整个崩溃中恢复的系统,但是在构建时假设“TCP 连接是永远的”(它们不一定在 AWS 上)。所以,如果一个 TCP 连接关闭,只有两种可能:另一端已经崩溃,我们有解决方案,或者它仍然正常。如果它仍然启动,那么它在套接字关闭之前获得的数据与 TCP 传递的数据一样多。 (我意识到这不一定是一个有效的假设。)由于 TCP 协议已经在内核中完成了所有这些确认簿记,因此在用户空间中复制它以跟踪从一端到另一个。

【问题讨论】:

  • 我不知道。连接被重置,所有缓冲的数据都被丢弃。
  • 有一个更大的问题迫在眉睫:你想要这个做什么?一个明显的意图是知道接收者是否有机会获得它,但是在“发送”之后,它可能会失败事件的方式有很多,在你提到的接收端 TCP 堆栈的位线之间,到应用程序另一端,最终这似乎是一种毫无意义的努力。至少对我来说。
  • @JB。该连接至少会在其内部结构的某处出现最后一个 ACK​​ed seqnr。但我不认为这是可访问的,至少对于用户空间进程来说是不可访问的,当然在连接关闭后也不可访问。 (好消息是损坏的电缆不会导致连接关闭,最终只是超时)

标签: sockets tcp network-programming


【解决方案1】:

我自己也遇到过这个问题,其他人也遇到过(例如herehere)。

由于 TCP 是缓冲的,并且当它抽象出重传、ack 等的基本细节时,没有明确的方法可以确保在应用层传递您的数据。

此外,这很关键,即使它确实为您提供了某种数据已传递的确认,它也只能确认传递到另一端的 TCP 缓冲区。您仍然会遇到数据是否由实际应用程序实际处理的问题。毕竟,可能是第二只北京梗突然杀死了您正在与之交谈的应用程序或导致它挂起,因此无法从其 TCP 缓冲区读取数据。

如果您需要应用层对数据传输(和/或处理)的确认,您需要一种应用层机制来通过应用层确认来实现此目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2010-10-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多