面试官:说说TCP为什么需要三次握手和四次挥手?
Opened this issue · 0 comments
linwu-hi commented
面试官:说说TCP为什么需要三次握手和四次挥手?
一、TCP三次握手
TCP三次握手是在建立TCP连接时需要进行的过程,用于确认双方的接收能力和发送能力是否正常,以及指定序列号等参数。
握手过程:
- 第一次握手:客户端发送一个SYN包,指定自己的初始序列号ISN(c),此时客户端处于SYN_SENT状态。
- 第二次握手:服务端收到客户端的SYN包后,以自己的SYN包作为应答,确认客户端的SYN,并将客户端的ISN+1作为ACK的值,此时服务端处于SYN_RCVD状态。
- 第三次握手:客户端收到服务端的SYN包后,发送一个ACK包,值为服务端的ISN+1。此时客户端处于ESTABLISHED状态,服务端也处于ESTABLISHED状态,双方连接建立完成。
通过三次握手,双方确认了彼此的接收和发送能力正常,可以进行正常的数据传输。
为什么需要三次握手?
如果只有两次握手,发送端可以确认自己发送的信息对方能收到,也可以确认对方发送的信息自己能收到,但接收端无法确认自己发送的信息对方是否能收到。因此,需要三次握手来确认双方的接收和发送能力都正常。
另外,三次握手可以防止已失效的连接请求报文段再次传到服务端,导致服务器资源浪费。
二、TCP四次挥手
TCP四次挥手是在断开TCP连接时需要进行的过程,用于正常关闭连接。
挥手过程:
- 第一次挥手:客户端发送一个FIN包,指定一个序列号。此时客户端处于FIN_WAIT1状态,停止发送数据,等待服务端的确认。
- 第二次挥手:服务端收到FIN包后,发送一个ACK包,且将客户端的序列号值+1作为ACK包的序列号值,表明已经收到客户端的FIN包。此时服务端处于CLOSE_WAIT状态。
- 第三次挥手:如果服务端也想断开连接,服务端发送一个FIN包,指定一个序列号。此时服务端处于LAST_ACK状态。
- 第四次挥手:客户端收到服务端的FIN包后,发送一个ACK包作为应答,且将服务端的序列号值+1作为ACK包的序列号值,此时客户端处于TIME_WAIT状态。需要等待一段时间以确保服务端收到自己的ACK包之后才会进入CLOSED状态,服务端收到ACK包后,就处于关闭连接了,处于CLOSED状态。
四次挥手原因
服务端在收到客户端断开连接FIN包后,并不会立即关闭连接,而是先发送一个ACK包先告诉客户端收到关闭连接的请求,只有当服务器的所有报文发送完毕之后,才发送FIN包断开连接,因此需要四次挥手。
三、总结
TCP三次握手和四次挥手是TCP连接建立和断开过程中必要的步骤,通过这些步骤,可以保证连接的可靠性和正常关闭,确保数据的准确传输和释放服务器资源。