一尘不染

查找是否通过tcp传递了消息

linux

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

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

但是当我send()一些字节时,即使无法发送数据包,send()也会立即返回,我在netcat上使用strace在linux
2.6.30上进行了测试,在发送一些字节之前先拔出网络电缆。

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


阅读 187

收藏
2020-06-02

共1个答案

一尘不染

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

它通常不提供此信息发送应用程序,因为(尽管外表),它不会真的 意味着 很多发送应用程序。确认并不意味着接收应用程序已获取数据并对其进行了明智的处理-
而是意味着发送方TCP不再需要担心它。数据可能仍在传输中-例如在中间代理服务器内,或在接收TCP堆栈内。

“成功接收到的数据”实际上是应用程序级的概念-
含义取决于应用程序(例如,对于许多应用程序,只有在接收到的数据已同步到磁盘后才考虑“已接收”数据才有意义)侧)。因此,这意味着您必须自己实现它,因为作为应用程序开发人员,您实际上是唯一知道如何为您的应用程序明智地进行操作的人。

2020-06-02