通过TCP流发送()/ write()消息时,如何确定这些字节是否已成功传递?
接收方通过tcp确认接收到字节,因此发送方tcp堆栈应该知道。
但是当我send()一些字节时,即使无法发送数据包,send()也会立即返回,我在netcat上使用strace在linux 2.6.30上进行了测试,在发送一些字节之前先拔出网络电缆。
我只是在开发一个应用程序,在该应用程序中了解消息是否已传递非常重要,但是实现tcp功能(“确认消息#123”)感觉很尴尬,必须有更好的方法。
发送TCP确实知道另一端何时确认数据,但是这样做的唯一原因是,它知道何时可以丢弃数据(因为其他人现在负责将其发送到另一端的应用程序)。
它通常不提供此信息发送应用程序,因为(尽管外表),它不会真的 意味着 很多发送应用程序。确认并不意味着接收应用程序已获取数据并对其进行了明智的处理- 而是意味着发送方TCP不再需要担心它。数据可能仍在传输中-例如在中间代理服务器内,或在接收TCP堆栈内。
“成功接收到的数据”实际上是应用程序级的概念- 含义取决于应用程序(例如,对于许多应用程序,只有在接收到的数据已同步到磁盘后才考虑“已接收”数据才有意义)侧)。因此,这意味着您必须自己实现它,因为作为应用程序开发人员,您实际上是唯一知道如何为您的应用程序明智地进行操作的人。