我正在读一本由Tanenbaum写的关于计算机网络的书,特别是关于握手的。在那里,他解释说,考虑到这种情况,双向握手是不够的:
A想要向B转账,所以A向B发送SYN,然后B向A发送ACK。连接建立后,A可以转账,然后在连接完成后断开连接。如果存在从A到B的延迟的重复SYN,则B将再次发送其ACK,并且A将再次转移其资金。
如果我理解正确的话,这是基于Tanenbaum写的书的双向握手的弱点之一。书中说三次握手可以解决这个问题。
使用来自A的延迟的重复SYN,B发送ACK和SYN,但被A拒绝。这就是我不理解的地方,就好像“嘿,B,你为什么给我发送SYN和ACK?哦,我知道,这是来自延迟的SYN,我应该放弃它。”为什么不,在双向握手中,A不知道ACK是由延迟的重复SYN产生的?
谢谢。
发布于 2014-05-21 12:43:30
要建立连接,需要进行三次(或三步)握手:
此时,客户端和服务器都收到了连接确认。步骤1、2建立用于一个方向的连接参数(序列号),并且它被确认。步骤2、3建立用于另一个方向的连接参数(序列号),并且它被确认。有了这些,就建立了全双工通信。
发布于 2015-10-14 03:28:00
根据Kurose和Ross的"Computer Networking: A top-down approach",第6版,第232页,
前两个数据段不携带有效载荷,也就是说,没有应用层数据;第三个数据段可能携带有效载荷。由于在两台主机之间发送三个数据段,因此此连接建立过程通常称为三次握手
换句话说,A在发送数据之前不需要等待三次握手完成。只有B需要等待三次握手完成。
为什么B需要等待?正如S. Richmond所说,B需要知道A在开始发送数据之前已经收到了它的序列号。
发布于 2017-11-17 18:16:24
三次握手是必要的,因为双方都需要同步它们在传输期间使用的数据段序列号。
因此,它们(依次)发送序列号设置为值n的SYN数据段,然后由另一方通过序列号设置为n+1的确认数据段进行确认。
假设客户端不发送ACK(双向握手的情况)。现在可能存在客户端序号不同步的情况,但是服务器将假定它是同步的。这可能会导致问题。
https://stackoverflow.com/questions/23771976
复制相似问题