linwu-hi / code-interview

前端面试小册,包含Vue面试题,React面试题,JS面试题,HTTP面试题,工程化面试题,CSS面试题,算法面试题,大厂面试题,高频面试题
194 stars 23 forks source link

面试官:说说TCP为什么需要三次握手和四次挥手? #153

Open linwu-hi opened 1 year ago

linwu-hi commented 1 year ago

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

一、TCP三次握手

TCP三次握手是在建立TCP连接时需要进行的过程,用于确认双方的接收能力和发送能力是否正常,以及指定序列号等参数。

握手过程:

  1. 第一次握手:客户端发送一个SYN包,指定自己的初始序列号ISN(c),此时客户端处于SYN_SENT状态。
  2. 第二次握手:服务端收到客户端的SYN包后,以自己的SYN包作为应答,确认客户端的SYN,并将客户端的ISN+1作为ACK的值,此时服务端处于SYN_RCVD状态。
  3. 第三次握手:客户端收到服务端的SYN包后,发送一个ACK包,值为服务端的ISN+1。此时客户端处于ESTABLISHED状态,服务端也处于ESTABLISHED状态,双方连接建立完成。

通过三次握手,双方确认了彼此的接收和发送能力正常,可以进行正常的数据传输。

为什么需要三次握手?

如果只有两次握手,发送端可以确认自己发送的信息对方能收到,也可以确认对方发送的信息自己能收到,但接收端无法确认自己发送的信息对方是否能收到。因此,需要三次握手来确认双方的接收和发送能力都正常。

另外,三次握手可以防止已失效的连接请求报文段再次传到服务端,导致服务器资源浪费。

二、TCP四次挥手

TCP四次挥手是在断开TCP连接时需要进行的过程,用于正常关闭连接。

挥手过程:

  1. 第一次挥手:客户端发送一个FIN包,指定一个序列号。此时客户端处于FIN_WAIT1状态,停止发送数据,等待服务端的确认。
  2. 第二次挥手:服务端收到FIN包后,发送一个ACK包,且将客户端的序列号值+1作为ACK包的序列号值,表明已经收到客户端的FIN包。此时服务端处于CLOSE_WAIT状态。
  3. 第三次挥手:如果服务端也想断开连接,服务端发送一个FIN包,指定一个序列号。此时服务端处于LAST_ACK状态。
  4. 第四次挥手:客户端收到服务端的FIN包后,发送一个ACK包作为应答,且将服务端的序列号值+1作为ACK包的序列号值,此时客户端处于TIME_WAIT状态。需要等待一段时间以确保服务端收到自己的ACK包之后才会进入CLOSED状态,服务端收到ACK包后,就处于关闭连接了,处于CLOSED状态。

四次挥手原因

服务端在收到客户端断开连接FIN包后,并不会立即关闭连接,而是先发送一个ACK包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN包断开连接,因此需要四次挥手。

三、总结

TCP三次握手和四次挥手是TCP连接建立和断开过程中必要的步骤,通过这些步骤,可以保证连接的可靠性和正常关闭,确保数据的准确传输和释放服务器资源。

参考文献