首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双向握手和三次握手

双向握手和三次握手
EN

Stack Overflow用户
提问于 2014-05-21 08:16:10
回答 3查看 32.9K关注 0票数 7

我正在读一本由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产生的?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-21 12:43:30

要建立连接,需要进行三次(或三步)握手:

  1. 同步:通过客户端向服务器发送同步消息来执行主动打开。客户端将数据段的序列号设置为随机值A。
  2. SYN-ACK :作为响应,服务器以SYN-ACK作为响应。确认号被设置为比接收到的序列号大1,即A+1,并且服务器为分组选择的序列号是另一个随机数B.
  3. 确认:最后,客户端向服务器发回确认。序列号被设置为接收到的确认值,即A+1,并且确认号被设置为比接收到的序列号大1,即B+1。

此时,客户端和服务器都收到了连接确认。步骤1、2建立用于一个方向的连接参数(序列号),并且它被确认。步骤2、3建立用于另一个方向的连接参数(序列号),并且它被确认。有了这些,就建立了全双工通信。

票数 17
EN

Stack Overflow用户

发布于 2015-10-14 03:28:00

根据Kurose和Ross的"Computer Networking: A top-down approach",第6版,第232页,

前两个数据段不携带有效载荷,也就是说,没有应用层数据;第三个数据段可能携带有效载荷。由于在两台主机之间发送三个数据段,因此此连接建立过程通常称为三次握手

换句话说,A在发送数据之前不需要等待三次握手完成。只有B需要等待三次握手完成。

为什么B需要等待?正如S. Richmond所说,B需要知道A在开始发送数据之前已经收到了它的序列号。

票数 8
EN

Stack Overflow用户

发布于 2017-11-17 18:16:24

三次握手是必要的,因为双方都需要同步它们在传输期间使用的数据段序列号。

因此,它们(依次)发送序列号设置为值n的SYN数据段,然后由另一方通过序列号设置为n+1的确认数据段进行确认。

假设客户端不发送ACK(双向握手的情况)。现在可能存在客户端序号不同步的情况,但是服务器将假定它是同步的。这可能会导致问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23771976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档