因此,这两个一般性问题表明,没有确定性的方法可以知道我们通过不可靠的渠道与之通信的另一方是否收到了我们的消息。这与我们发送syn
syn ack
ack
并建立连接的TCP握手非常类似。这不是反对两个一般问题的主张吗?
答案 0 :(得分:4)
两个一般问题确实是TCP的异步模型,这就是为什么(如理论结果所示)两个端点不能同时具有关于连接状态的常识。
每个分布式协议协议处理此问题的方式是始终承诺安全(不会发生任何坏事),但不能保证活跃(最终会取得进展)。活力不在你手中。在经济繁荣时期,人们可以尽力做到最好,并希望取得进步。
在TCP中,这意味着端点可以在不明确知道其他状态的情况下做出假设(例如“建立连接”)。但是,这不是一个不安全的假设;在最坏的情况下,这是一个良性的误解。超时后,它将改变其意见。与长途电话的一端并没有什么不同,继续说话,认为连接仍然存在;过了一会儿,你可能不得不问“你好,你还在吗?”,并且超时。真实世界的协议必须始终具有超时(与异步正式模型不同),因为在堆栈的某个地方它们提供一些人类功能,并且人类的耐心是有限的。在实践中,有足够长的时间可以取得进展,因此我们只需要选择适当的超时,这些超时也不会过早。
尽管如此,即使是良性的误解也会产生不良后果。例如,在服务器响应syn之后,它为连接分配资源,希望客户端完成协议。这是一种典型的拒绝服务攻击,因为恶意客户端可以简单地启动握手序列但从未完成它,从而使未准备好的服务器分配了数百万台状态机。需要小心。