【发布时间】:2013-01-13 11:58:04
【问题描述】:
虽然 TCP 是一个可靠的协议,它提供了重传和确认机制,但我认为它不是 100% 可靠的,因为 send() 的成功返回并不能确保数据已经到达目标端点,只意味着数据是复制到内核缓冲区。
应用程序是否有任何机制可以知道数据是否已成功到达目的地?
一种可能的解决方案是在应用层中建立一些确认机制?
【问题讨论】:
-
确实,如果您不能信任您平台的 TCP 实现,请在您的应用层中构建一个确认机制。
-
那么,确认机制100%可靠吗?
-
不可能使任何协议 100% 可靠。见Two Generals Problem
-
@Barmar 仅当可靠性需要是双向的。一个简单的确认就足以知道消息已被接收(猜测在这种特定情况下我们并不担心 MITM 攻击)。
-
@tucuxi:在这种情况下存在误报(您没有收到确认,但实际上收到了消息)。这是否足以算作 100% 的可靠性实际上取决于应用程序:通常只有一侧重新发送直到被确认是可以的,而这基本上就是 TCP 在幕后所做的以提供其保证。