TCP建立时的三次握手和关闭连接时的四次挥手

167 阅读2分钟

本篇文章用于复盘面试必问考题TCP的三次握手和四次挥手,如有错误敬请指正。

三次握手

众所周知,TCP连接建立时需要三次握手,三次握手其实就是客户端和服务器端之间总计发送三个包,一是用于确认双方的发送和接收能力正常,二是确认连接端端口号。下面简单总结一下整个流程。

  1. 第一次握手,客户端向服务器端发出一个TCP包,其SYN标识为1,并且说明客户端打算连接的服务器端口。这一过程的实现,可以确认客户端的发送能力、服务端的接收能力都是正常的。
  2. 第二次握手,服务器端向客户端发送一个确认包(ACK)应答,SYN和ACK都为1。这一步可以使得客户端知道服务端的接收、发送能力以及客户端的接收、发送是否正常。
  3. 第三次握手,客户端向服务器端再次发送确认包(ACK),SYN位置0,ACK置1,客户端进入ESTABLISHED状态,服务器端收到整个包后也将进入ESTABLISHED状态。这一步的实现可以使得服务器端确定客户端的发送、接收能力是否正常,同时确定服务器端接收、发送能力是否正常。

四次挥手

建立连接需要三次握手,为何关闭连接时需要四次挥手呢?这是因为TCP的半关闭的造成的。TCP的半关闭即TCP提供了连接的一端在结束发送后还可以接收另一端包的能力。四次挥手其实就是客户端和服务器端之间发送四个TCP包,关闭连接的发起方既可以是客户端也可以是服务器端。这里以比较常见的客户端为例。

  1. 第一次挥手,客户端发送一个FIN报文,FIN=1,并停止发送数据,主动关闭TCP连接,进入FIN_WAIT1状态,等待服务器端的响应。
  2. 第二次挥手,服务端发送ACK报文,此时服务端进入CLOSE_WAIT状态,客户端在收到服务器端返回的ACK确认报文后,进入FIN_WAIT2状态。此时进入半关闭状态。
  3. 第三次挥手,如果服务端也想关闭此连接,也需要发送FIN报文,等待客户端响应,服务器端进入LAST_ACK。
  4. 第四次挥手,客户端收到后也要发送一个ACK确认报文,进入TIME_WAIT状态,需要等待一段时间等服务端收到确认报文后自行进入CLOSED状态,服务器端收到ACK后立即进入CLOSED状态。