Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
linwu-hi opened this issue Jul 30, 2023 · 0 comments
Open

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

linwu-hi opened this issue Jul 30, 2023 · 0 comments
Labels

Comments

@linwu-hi
Copy link
Owner

linwu-hi commented Jul 30, 2023

面试官:说说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连接建立和断开过程中必要的步骤,通过这些步骤,可以保证连接的可靠性和正常关闭,确保数据的准确传输和释放服务器资源。

参考文献

@linwu-hi linwu-hi added the HTTP label Jul 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant