两个通用协议和TCP握手

22
因此,这两个一般性问题表明,我们无法确定通过不可靠信道与其通信的另一方是否已经收到了我们的消息。这很类似于TCP握手,我们发送一个synsyn ackack并建立连接。这是否与两个一般性问题的说法相矛盾?
1个回答

31

异步模型对于TCP来说是一个普遍存在的问题,这也是为什么(正如理论结果所示),两个端点不能同时共同了解连接状态的原因。

每个分布式协议都处理此问题的方法是始终承诺安全性(不会发生任何问题),但无法保证活性(最终会有进展)。活性不在你的掌握之中。在好的时候,人们可以尽力而为,并希望取得进展。

在TCP中,这意味着一个端点可以做出某种假设(比如“连接已建立”),而不一定知道另一端的状态。但这并不是一个不安全的假设;最坏的情况下,这只是一种良性的误解。超时后,它会改变自己的观点。这与在长途电话的一端继续交谈以为连接仍然存在没有任何区别;过一段时间后,您可能必须问“喂,你还在吗?”并超时。现实世界的协议必须始终具有超时功能(与异步形式模型不同),因为它们在堆栈中的某个位置服务于某些人类功能,而人类的耐心是有限的。实际上,有足够长的时间段可以取得进展,因此我们只需要选择适当的超时时间,既不要太早也不要太晚。

尽管如此,即使是良性的误解也可能会产生不良后果。例如,在服务器响应syn之后,它会为连接分配资源,希望客户端完成协议。这是一种经典的拒绝服务攻击,因为恶意客户端可以仅仅开始握手序列而从未完成它,留下一个没有准备好的服务器以分配状态机。需要小心处理。


这就是为什么TCP无法保证双方都能看到连接的正常终止或者两者都不能看到的原因。(尽管我们现在已经有了技术来解决这个问题。) - David Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接