TCP 三次握手与四次挥手
在面试中,TCP 的三次握手和四次挥手是非常常考的基础题目,理解这两个过程对于应聘前端、后端开发以及其他技术岗位都非常重要。以下是对这两个过程的简明解释。
TCP 三次握手(建立连接)
三次握手是 TCP 协议中用于建立连接的过程,确保客户端和服务器都能互相通信。
-
第一次握手(客户端 → 服务器)
客户端发送一个 SYN(同步)包给服务器,表示请求建立连接。此时,客户端进入 SYN_SENT 状态。
-
第二次握手(服务器 → 客户端)
服务器收到客户端的 SYN 包后,回应一个 SYN-ACK(同步-确认)包,表示同意建立连接。服务器进入 SYN_RECV 状态。
-
第三次握手(客户端 → 服务器)
客户端收到服务器的 SYN-ACK 包后,发送一个 ACK(确认)包给服务器,表示连接已建立。客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。
总结:三次握手的过程是:
-
客户端向服务器发送请求;
-
服务器确认并回应;
-
客户端确认服务器回应,建立连接。
为什么是三次握手?
-
第一次握手:确认客户端可以发送请求;
-
第二次握手:确认服务器可以接收请求并准备好;
-
第三次握手:确认双方都可以发送和接收数据。
TCP 四次挥手(断开连接)
四次挥手是 TCP 协议中用于断开连接的过程,确保双方在关闭连接前都完成数据传输。
-
第一次挥手(客户端 → 服务器)
客户端发送一个 FIN(结束)包给服务器,表示客户端的数据发送完毕,客户端进入 FIN_WAIT_1 状态。
-
第二次挥手(服务器 → 客户端)
服务器收到客户端的 FIN 包后,回应一个 ACK(确认)包,表示同意关闭连接。服务器进入 CLOSE_WAIT 状态。此时,服务器还可能有数据传输给客户端。
-
第三次挥手(服务器 → 客户端)
服务器发送一个 FIN 包给客户端,表示服务器端的数据也已经传输完毕,准备断开连接。服务器进入 LAST_ACK 状态。
-
第四次挥手(客户端 → 服务器)
客户端收到服务器的 FIN 包后,发送一个 ACK(确认)包给服务器,确认关闭连接。客户端进入 TIME_WAIT 状态,等待一段时间后彻底关闭连接。服务器收到 ACK 后,连接完全断开。
总结:四次挥手的过程是:
-
客户端发送 FIN 包,表示要断开连接;
-
服务器回应 ACK,确认断开;
-
服务器发送 FIN 包,表示服务器的数据传输完毕;
-
客户端确认 ACK,断开连接。
为什么是四次挥手?
-
第一次挥手:客户端告知服务器自己没有数据发送了;
-
第二次挥手:服务器确认客户端没有数据要发送了;
-
第三次挥手:服务器告知客户端自己也没有数据要发送了;
-
第四次挥手:客户端确认断开连接。
简明例子:
三次握手: 假设我(客户端)要去张三家取东西:
-
我发短信:"张三在家吗?"
-
张三回复:"我在家。"
-
我发短信:"我准备去取东西,等我。" 张三确认收到信息后,才开始等我。
四次挥手:
-
我告诉张三:"我已经取完东西了,任务完成了。"
-
张三回复:"知道了,但我还没完成所有的事,继续忙。"
-
张三完成任务后,告诉我:"我已经完成了,可以断开了。"
-
我确认收到,然后双方断开连接。
注意事项:
-
三次握手与四次挥手的区别:
-
三次握手用于建立连接,确保双方都能发送和接收消息;
-
四次挥手用于断开连接,确保双方的数据传输完成并安全关闭连接。
-
-
三次握手为什么是三次?
三次握手确保客户端和服务器都能收发消息,并且确认连接建立成功。
-
四次挥手为什么是四次?
四次挥手确保双方在数据传输完成后才能断开连接。由于 TCP 是全双工的(数据可以同时在两个方向流动),需要两边都先确认没有数据要传输了,才安全断开。
总结:
-
三次握手:连接建立过程,需要确保双方都准备好进行数据交换。
-
四次挥手:连接断开过程,确保双方都完成数据传输后再安全关闭连接。
在面试时,讲解这两个过程时,重点掌握其原理和原因,尽量避免深入底层协议细节,确保你能够清晰、简洁地表达出过程和原因。