我正在读一本关于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做出的?
感谢。
答案 0 :(得分:16)
要建立连接,会发生三方(或三步)握手:
SYN:主动打开是由客户端向服务器发送SYN执行的。客户端将段的序列号设置为随机值A.
SYN-ACK:作为响应,服务器回复SYN-ACK。确认号码设置为比接收到的序列号多一个,即A + 1,服务器为该数据包选择的序列号是另一个随机数,B。
ACK:最后,客户端将ACK发送回服务器。序列号设置为接收到的确认值,即A + 1,确认号码设置为比接收到的序列号多一个,即B + 1.
此时,客户端和服务器都收到了连接确认。步骤1,2为一个方向建立连接参数(序列号)并确认。步骤2,3为另一个方向建立连接参数(序列号)并确认。通过这些,建立了全双工通信。
答案 1 :(得分:7)
根据Kurose和Ross"计算机网络:自上而下的方法",第6版,p。 232,
前两个段没有载荷,即没有应用层数据;这些段中的第三个可以携带有效载荷。由于在两台主机之间发送了三个段,因此这种连接建立过程通常被称为三次握手
换句话说,A在发送数据之前不需要等待三次握手完成。只有B需要等待三次握手才能完成。
为什么B需要等待?正如S. Richmond所说,B需要知道A在开始发送数据之前已经收到了序列号。
答案 2 :(得分:0)
三次握手是必要的,因为双方需要同步它们在传输过程中使用的段序列号。
因此,他们(反过来)发送一个序列号设置为值n的SYN段,然后由另一方通过序列号设置为n + 1的ACK段确认。
假设客户端不发送ACK(双向握手的情况)。现在可能存在seq数量的客户端未同步但服务器将假定它已同步的情况。这可能会导致问题。