TCP四次挥手详解(图解全过程)

TCP四次挥手详解(图解全过程)-mikechen

TCP四次挥手是面试中的一个很常见的问题,下面我就来详解TCP四次挥手的全过程@mikechen

第一次挥手

在第一次挥手中,一方(通常是客户端)向另一方(通常是服务器)发送一个带有FIN(Finish)标志位的TCP报文,表示它已经完成数据的发送,希望关闭连接。

如下图红色圆圈1所示:

 

TCP四次挥手详解(图解全过程)-mikechen

客户端:

  • 当客户端不再需要发送数据时,它首先发送一个带有FIN标志位的TCP报文,该报文中的FIN表示客户端已经完成数据的发送,并请求关闭连接。
  • 客户端将序列号(Sequence Number)设置为已发送数据的最后一个字节的序号加1,以便服务器知道客户端的数据已经结束。

服务器(Server):

  • 服务器收到客户端的带有FIN标志位的TCP报文后,进入CLOSE_WAIT状态,表示服务器接收到了关闭请求。

需要注意的是,第一次挥手是客户端向服务器发起的,表示客户端不再需要发送数据,并希望关闭连接。

 

第二次挥手

TCP的第二次挥手是关闭一个已建立连接的过程中的第二步。

在第二次挥手中,一方(通常是服务器)向另一方(通常是客户端)发送一个带有FIN(Finish)和ACK(Acknowledgment)标志位的TCP报文。

表示它已经完成数据的发送,同意关闭连接。

如下图红色圆圈2所示:

 

TCP四次挥手详解(图解全过程)-mikechen

服务器(Server):

  • 服务器会发送一个带有FIN和ACK标志位的TCP报文,其中的FIN表示服务器已经完成数据的发送,并请求关闭连接,ACK表示服务器确认了客户端的关闭请求。
  • 服务器将序列号(Sequence Number)设置为已发送数据的最后一个字节的序号加1,以便客户端知道服务器的数据已经结束。

客户端(Client):

  • 客户端收到服务器的带有FIN和ACK标志位的TCP报文后,确认接收到了服务器的关闭请求。
  • 客户端也可以选择发送一个带有ACK标志位的TCP报文,以确认接收到了服务器的FIN报文。

需要注意的是,第二次挥手是服务器向客户端发起的,表示服务器已经完成数据的发送,并同意关闭连接。

客户端在收到服务器的FIN和ACK报文后,确认接收到了服务器的关闭请求,并进入TIME_WAIT状态,等待一段时间以确保服务器接收到了确认。

 

第三次挥手

在第三次挥手中,一方(通常是客户端)向另一方(通常是服务器)发送一个带有FIN(Finish)标志位的TCP报文,表示它已经完成数据的发送,希望关闭连接。

如下图红色圆圈3所示:

 

TCP四次挥手详解(图解全过程)-mikechen

此时客户端进入 FIN—WAIT (终止等待 2)状态,等待服务端发起释放连接报文。

如果【服务端】没有数据要发送给【客户端】了,【服务端】的应用进程就会通知 TCP 释放连接。

此时【服务端】向【客户端】发送释放连接报文,标记 FIN=1 ,确认序列号 ACK_Number=a+1 (与第二次挥手的确认号一致)。

此时【服务端】进入最后确认状态,等待【客户端】确认

 

第四次挥手

TCP的第四次挥手是关闭一个已建立连接的过程中的最后一步。

在第四次挥手中,一方(通常是服务器)向另一方(通常是客户端)发送一个带有ACK(Acknowledgment)标志位的TCP报文,表示它确认接收到了客户端的关闭确认,同时也同意关闭连接。

如下图红色圆圈4所示:

 

TCP四次挥手详解(图解全过程)-mikechen

服务器(Server):

  • 服务器在收到客户端的关闭确认后,确认连接已经关闭,并准备释放连接资源。
  • 服务器发送一个带有ACK标志位的TCP报文,其中的ACK表示服务器确认接收到了客户端的关闭确认。
  • 服务器将序列号设置为已发送数据的最后一个字节的序号加1,以便客户端知道服务器已经完成数据的发送。
  • 服务器进入CLOSED状态。

客户端(Client):

  • 客户端收到服务器的带有ACK标志位的TCP报文后,确认连接已经关闭,并准备释放连接资源。
  • 客户端发送一个带有ACK标志位的TCP报文,其中的ACK表示客户端确认接收到了服务器的关闭确认。
  • 客户端将序列号设置为已发送数据的最后一个字节的序号加1,以便服务器知道客户端已经完成数据的发送。
  • 客户端进入CLOSED状态。

服务器和客户端都在第四次挥手后进入CLOSED状态,连接彻底关闭。

四次挥手的过程确保双方都能够安全地关闭连接,释放资源,避免数据的丢失和错误关闭连接。

评论交流
    说说你的看法