口语化/面试讲解TCP为什么要握手,为什么是三次握手而不是两次或四次

     概念:三次握手即 three-way handshake,将他理解为三步握手,是一次握手分三个步骤进行,而不是一共握三次手。 

      首先为什么要握手?tcp是可靠全双工的一个双向通信传输协议,体现在就是通信的双方都需要确认对方是否收到了自己发的数据包是完整有序无差错的,如果不是就需要重发。


       其次为什么要握手三次?简单来说,两次不可靠四次不高效。先搞清楚1:tcp连接握手握的是啥?是通信双方数据原点的序列号。tcp是全双工的一个双向通信,为了可靠传输,始终都需要同步SYNchronize信号。初始双方的序号都是随机的。所以刚开始通信双方都产生一个初始的随机序列号ISN(相当于一个身份标识)。 2:三次握手的过程。拿你我作比方就是,我生成初始序列号ISN(initial sequence number)后加上同步信号SYN发给你,你收到之其加1后命名为你自己的ACKsequence number确认序列号,然后你自己的ISN和同步信号SYN发给我,这是第二次握手。第三次握手就是我确认收到你的同步信号,并把你的ISN号记录到到本地并命名为我的ACK确认序号。

为什么两次不可靠?因为没有第三步的同步信号,不知道双方是否达成一致的状态。

      为什么第三次之后不等再次确认就可以传输?
      来看一个AB之间进行tcp握手过程的丢包情况:
      第一个包即A发给B的SYN包没有到达,那么A会周期性重传直到收到B的确认包。
      第二个包B给A的SYN、ACK丢包了,那么B也是会周期性重传直到收到A的确认。
      第三个包A发完ACK,单方面认为TCP为Established状态,而B显然认为TCP为Active状态:(1). 假定此时双方都没有数据发送,B会周期性超时重传,直到收到A的确认,收到之后B的TCP 连接也为 Established状态,双向可以发包。
(2). 假定此时A有数据发送,B收到A的 Data + ACK,自然会切换为established 状态,并接受A的 Data。
(3). 假定B有数据发送,数据发送不了,会一直周期性超时重传SYN + ACK,直到收到A的确认才可以发送数据。

所以三次握手可以保证数据包的传输,就不必加第四步减慢传输速率。

趣解三次握手:握手和敬军礼一样,源自「敌我双方互相确认对方手里没有武器、无恶意」的仪式。(虽然双方互相请求确认需要四步,但由于中间的确认和请求是由同一个人执行的,所以合并成了一步)
三胖伸出手说:你看,我手里没有武器。(SYN)
川普看了看说:嗯,确实没有。(ACK)于是也伸出手说:你看,我手里也没有武器。(SYN)
三胖看了看说:嗯,看来你确实有诚意。(ACK)
于是......love&peace

发布了33 篇原创文章 · 获赞 29 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40993864/article/details/89179156