tcp三次握手-四次挥手

189 阅读5分钟

我们都知道tcp连接是三次握手,断开连接是四次挥手,那么为什么是***三次握手?四次挥手?***我想不少人存在疑惑,本文将分为三部分进行详细讲解。 ##三次握手

注意以下几个问题

  1. 为什么一次握手不行?
  2. 为什么两次握手不行?
  3. 为什么不选4次,偏偏就选3次?
  4. 连接建立时客户端和服务器如何进行信息交流?

建立连接的过程如下图: tcp连接图

谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。“

: 问题四:连接建立时客户端和服务器如何进行信息交流? tcp段结构 > tcp段结构如上图所示,在连接建立的过程中,主要用到了如下信号: sequence number(序列号)、 acknowledgement number(确认序列号)、ACK(acknowledgement确认)、SYN(建立联机) 在连接的过程中,客户端和服务器都会随机选择一个初始序列号,并将自己的序列号告知对方。如初始第一个图所示,第一由客户端发送一个SYN信号给服务器,并携带客户端的初始序列号,表示客户端想要跟服务器建立连接。第二在服务器接收到SYN信号后,如果同意建立连接,则服务器会返回SYN+ACK信号,并携带服务器选择的初始序列号,表示同意建立连接。第三当客户端收到服务器的确认连接信号后,返回一个ACK确认信息,此时SYN标志位置为0,此后客户端确认建立连接,服务器收到ACK后确认连接建立。

##四次挥手 注意以下几个问题

  1. 为什么连接是三次握手,而断开连接需要4次挥手,三次挥手不行吗??
  2. 断开连接时客户端和服务器如何进行信息交流?

断开连接的过程如下图: 这里写图片描述

: 问题一:为什么连接是三次握手,而断开连接需要4次挥手,三次挥手不行吗?? > 答案很明显是不可以的,在建立连接时,客户端和服务器之间一定不存在数据传输,连接都没建立,何来的数据传输呢?但是断开连接时不一定,当客户端想要断开连接时,客户端并不知道服务端是否还有数据需要传输。 我们设想如果是三次挥手,当客户端发送断开连接信号到达服务器时,服务器还有数据需要传输,此时,服务器如果发送确认信号,那么代表我同意断开连接,那剩下的数据该如何处理?如果服务器不发送确认信号,那么客户端如何知道服务器是否接收到了我的信号?那我需不需要重发?这些的问题的存在让三次挥手的可行性远不如4次挥手。

: 问题二:断开连接时客户端和服务器如何进行信息交流? > 在断开连接的过程中,主要用到了如下信号: sequence number(序列号)、 acknowledgement number(确认序列号)、ACK(acknowledgement确认)、FIN(finish结束) 在断开连接的过程中,如上图所示,第一由客户端发送一个FIN信号给服务器。表示我不再发送数据给你了,我要断开连接。第二服务器接收到该信号后,无论是否还有数据需要传输,都会马上返回一个ACK确认信息,表示好的,我知道了,但是我可能还有数据需要传输给你,客户端接收到确认信息后,进入半关闭状态,即不发送数据,但可以接收数据,等待服务器发来FIN信号。第三服务器发送FIN信号到客户端,含义与第一步相同。第四客户端收到FIN信号后,发送ACK确认信息给服务器,此后客户端等待一段时间,在这段时间内如果没有接收到来自服务器重复的FIN信号,完成断开连接,服务器收到ACK确认信息后,完成断开连接。

##客户端和服务器的生命周期

客户端的生命周期图 这里写图片描述

服务器的生命周期图 这里写图片描述

以上两张图分别代表客户端和服务器从建立连接到断开连接的生命周期,每个节点代表了此时客户端或者服务器的状态,箭头表示状态发生变化,而箭头旁的事件代表发生状态变化的原因。