如何在继续之前明确等待TCP ACK?

HC4*_*ica 6 c sockets tcp

有没有办法让send()等待所有已发送的数据已被确认(或者如果已达到ACK超时则返回-1),或者是否有其他机制等待在send()之后但在做其他事情之前确认?

我使用的是标准的Unix Berkeley套接字API.

我知道我可以实现一个应用层ACK,但是当TCP的ACK很好地完成目的时,我宁愿不这样做.

Kar*_*ath 5

AFAIK没有办法.

此外,它不可靠,ACK仅表示内核接收到数据,同时客户端或其计算机可能已崩溃.您会认为客户端收到了数据,但实际上它从未处理过.

  • 这不准确。ack 不是来自本地内核,而是来自远程端的内核代码,正如 Nikolai 上面提到的。因此,可以保证数据包已到达远程端点,但不一定是远程用户态应用程序读取它。 (2认同)
  • @TJD:我在谈论远程内核,我认为这很明显。 (2认同)

val*_*ldo 5

不幸的是,标准 API 没有保留任何适当的方法来做到这一点。有可能是查询当前TCP发送窗口大小/使用的一种方式,但不幸的是它可能不是由标准的手段进行查询。

当然,有一些棘手的方法可以实现您想要的。例如,在 Windows 上,可以创建一个网络过滤器驱动程序来监视数据包级别的流量。