【问题标题】:two-way handshake and three-way handshake两次握手和三次握手
【发布时间】:2017-12-01 07:50:51
【问题描述】:

我正在阅读 Tanenbaum 写的一本关于计算机网络的书,专门关于握手。在那里,他解释说,考虑到这种情况,两次握手是不够的:

A 想给 B 转账,所以 A 向 B 发送一个 SYN,然后 B 向 A 发送一个 ACK​​。连接建立,然后 A 可以发送他的钱,然后在连接完成后断开连接。如果从 A 到 B 有延迟的重复 SYN,B 将再次发送它的 ACK,A 将再次转移它的钱。

如果我理解正确的话,那是基于 Tanenbaum 写的书的双向握手的弱点之一。书上说三次握手可以解决这个问题。

由于来自 A 的延迟重复 SYN,B 发送一个被 A 拒绝的 ACK 和 SYN。这是我不明白的地方,就好像“嘿 B,你为什么给我发送一个 SYN 和 ACK?哦我知道,这是来自延迟的 SYN,我应该放弃它。”。为什么不,在两次握手中,A 不知道 ACK 是由延迟的重复 SYN 发出的?

谢谢。

【问题讨论】:

  • 一本书?哪本书?章节?诗句?

标签: networking


【解决方案1】:

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

  1. SYN:主动打开是由客户端向服务器发送 SYN 来执行的。客户端将段的序列号设置为随机值A。

  2. SYN-ACK:作为响应,服务器回复一个 SYN-ACK。确认号设置为比接收到的序列号多一个,即A+1,服务器为数据包选择的序列号是另一个随机数,B。

  3. ACK:最后,客户端将 ACK 发送回服务器。序列号设置为接收到的确认值,即A+1,确认号设置为比接收到的序列号大一,即B+1。

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

【讨论】:

  • 如果没有第三个 ACK​​ 会有什么变化?服务器没有得到客户端收到 SYN-ACK 的确认;客户端将重试;此时服务器可以检测到这个 SYN 重复并再次发送 SYN-ACK;又输了;客户端再次重试。看看反向通道是否不可靠,然后连接不会像现在一样去任何地方。序列号可以与两条消息交换。可靠的传输被误解了。无论如何,可靠性并不意味着在连接后数据将流经 100% 的时间。连接可能会断开,不是吗?
  • 关于 TCP 的可靠性定义与连接稳定性无关,因为它不受协议的控制。就是消息将可靠地按顺序到达目标应用程序。
  • 对。那么为什么需要第三个确认。如果我们省略了,序号方案仍然可以保证订单交付
【解决方案2】:

根据 Kurose 和 Ross 的“计算机网络:一种自上而下的方法”,第 6 版,p。 232,

前两段不携带payload,即不携带应用层数据;这些段中的第三个可能携带有效载荷。因为在两台主机之间发送了三个段,所以这个连接建立过程通常被称为三次握手

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

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

【讨论】:

    【解决方案3】:

    三次握手是必要的,因为双方需要同步他们在传输过程中使用的段序列号。

    因此,他们(反过来)发送一个序号设置为值 n 的 SYN 段,然后对方通过序号设置为 n+1 的 ACK 段确认该段。

    假设客户端不发送 ACK(2 次握手的情况)。现在可能存在客户端的seq数不同步的情况,但是服务器会假设它是同步的。这可能会导致问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2014-12-16
      • 2011-07-02
      • 2016-05-02
      • 2020-02-24
      • 1970-01-01
      相关资源
      最近更新 更多