问题:查明是否通过 tcp 传递了消息

当我通过 tcp 流发送()/写入()消息时,如何确定这些字节是否已成功传递?

接收方确认通过 tcp 接收字节,因此发送方的 tcp 堆栈应该知道。

但是当我 send() 一些字节时, send() 立即返回,即使数据包(还)不能被传递,我在 linux 2.6.30 上使用 netcat 上的 strace 进行了测试,在发送一些字节之前拔掉了我的网络电缆。

我只是在开发一个应用程序,其中知道消息是否已传递非常重要,但是实现 tcp 功能(“ack for message #123”)感觉很尴尬,必须有更好的方法。

解答

发送 TCP 确实知道数据何时被另一端确认,但它这样做的唯一原因是它知道何时可以丢弃数据(因为其他人现在负责将数据发送给另一端的应用程序)。

它通常不会向发送应用程序提供此信息,因为(尽管看起来)它实际上对发送应用程序没有多大意义。确认并不意味着接收应用程序已获得数据并对其进行了合理的处理——这只是意味着发送 TCP 不再需要担心它。数据可能仍在传输中 - 例如,在中间代理服务器内,或在接收 TCP 堆栈内。

“数据成功接收”实际上是一个应用程序级别的概念 - 它的含义因应用程序而异(例如,对于许多应用程序,只有在接收时将数据同步到磁盘后才考虑“接收”数据才有意义边)。所以这意味着你必须自己实现它,因为作为应用程序开发人员,你真的是唯一一个知道如何为你的应用程序明智地做到这一点的人。

Logo

更多推荐