面试官:你说一下TCP为什么需要三次握手和四次挥手?

面试官:你说一下TCP为什么需要三次握手和四次挥手?
最新回答
欲往

2021-04-12 19:52:56

TCP需要三次握手建立连接和四次挥手关闭连接的原因如下

三次握手

TCP需要三次握手来建立连接,主要是为了确保双方都能准备好数据传输,并同步双方的初始序列号,从而确保数据传输的可靠性和有序性。

  • 第一次握手(发送SYN):客户端向服务器发送一个SYN报文段,表示客户端希望建立连接,并附带一个初始序列号seq。此时,客户端进入SYN_SENT状态,等待服务器的确认。
  • 第二次握手(发送SYN+ACK):服务器收到客户端的SYN报文段后,同意建立连接,并向客户端发送一个SYN+ACK报文段。这个报文段既是对客户端SYN报文段的确认,又包含了服务器自己的初始序列号。此时,服务器进入SYN_RCVD状态。
  • 第三次握手(发送ACK):客户端收到服务器的SYN+ACK报文段后,向服务器发送一个ACK报文段,确认已经收到服务器的确认和序列号。此时,TCP连接已经建立,客户端和服务器都进入ESTABLISHED状态,可以开始数据传输。

为什么需要三次握手而不是二次握手?

三次握手的目的是为了防止已失效的连接请求突然又传送到了服务端,而产生错误。如果采用两次握手建立连接,可能会出现以下情况:客户端第一次向服务端发送建立连接请求,因为网络延迟的原因,一直没有到达服务器。于是客户端再次向服务端重新发送建立连接请求,这次服务端收到连接请求后,向客户端回复确认,建立连接。但是这时网络延迟恢复,服务端又收到客户端第一次发送的连接请求,服务端认为客户端又发起了一次连接,再次回复确认,又建立了一个连接。这样,服务端认为有两个连接,而客户端认为有一个连接,造成数据状态不一致。因此,需要三次握手来确保双方都能准备好数据传输,并同步双方的初始序列号。

四次挥手

TCP需要四次挥手来关闭连接,主要是因为TCP连接是全双工的,即数据可以在两个方向上流动。因此,每个方向上的连接都需要单独进行关闭。

  • 第一次挥手(发送FIN):当通信的一方完成数据发送任务,需要关闭连接时,它会发送一个FIN报文段,表示希望关闭连接,并进入FIN_WAIT_1状态。无论是客户端还是服务端,任何一方都可以主动发起关闭连接的请求。
  • 第二次挥手(发送ACK):另一方收到FIN报文段后,发送一个ACK报文段作为回应,表示已经收到关闭连接的请求,并进入CLOSE-WAIT状态。此时,已经断开了这一方向上的连接,但另一方仍然可以继续发送数据。
  • 第三次挥手(发送FIN):当另一方也完成数据传输后,发送一个FIN报文段,表示希望关闭另一方向上的连接,并进入LAST-ACK状态。
  • 第四次挥手(发送ACK):最初发起关闭连接请求的一方收到FIN报文段后,发送一个ACK报文段作为回应,表示已经收到关闭连接的请求,并进入TIME-WAIT状态。经过一段时间后(通常是2MSL,即两倍的最大报文段生存时间),确保所有传输的数据都被对方接收并处理完毕后,才进入CLOSED状态,连接被最终关闭。

为什么需要四次挥手而不是三次?

因为TCP连接是全双工的,每个方向上的连接都需要单独进行关闭。在第二次挥手时,虽然一方已经同意关闭连接,但另一方可能还有一些数据没有传输完成,需要继续发送数据。因此,不能直接将第二次挥手和第三次挥手合并成一次。需要拆分成两个步骤,先关闭一个方向上的连接,再关闭另一个方向上的连接。这样,可以确保双方都能正确地关闭连接,并释放相关资源。

综上所述,TCP需要三次握手来建立连接和四次挥手来关闭连接,这是为了确保数据传输的可靠性和有序性,并避免已失效的连接请求导致的错误。