0

我对 linux 上的 send() 的理解是,如果发送进程的数据可以成功复制到内核缓冲区中,则 send() 返回。然后应用程序可以自由地继续前进。

  1. 如果这是真的,并且说 TCP 无法传递该数据包,那么 TCP 如何报告错误?

  2. 如果在多次 send()(开始时 Rwnd 很大)之后收到错误,应用程序如何知道哪个特定的 send() 失败,或者换句话说,哪个消息未能到达?

4

2 回答 2

3

如果这是真的,并且说 TCP 无法传递该数据包,那么 TCP 如何报告错误?

TCP 将静默重试/重新发送,直到连接结束或异常终止。

如果您想知道是否已收到,则需要接收应用程序发送确认(应用程序级消息)。


编辑:

TCP 协议接收一个端到端的 ACK ......但是那个 ACK​​ 被 TCP 堆栈吞没了:我不认为它是通过普通的“套接字”API 暴露给应用程序的。

数据包嗅探器以使其能够看到 ACK 的级别连接到网络/TCP 堆栈:例如,请参阅如何验证 TCP 数据包已在 C# 中收到 ACK 的答案?...我不知道 Linux 的等价物是什么,但必须有一个。

请注意这个答案,它警告说,即使远程 TCP 堆栈接收到消息,也不能保证接收应用程序已处理(即从堆栈中检索)它。

于 2012-12-04T17:04:35.990 回答
0

您将收到另一个 send 或 recv最终报告的错误。最终——默认情况下,TCP 可能需要很长时间才能确定连接中存在问题。您可能会首先选择“成功”发送,这取决于错误情况。您可能只能通过发送缓冲区已满的抱怨来发现事情已经出错了。

于 2012-12-04T17:04:07.100 回答