面试常考--TCP 三次握手与四次挥手

TCP 三次握手与四次挥手

在面试中,TCP 的三次握手和四次挥手是非常常考的基础题目,理解这两个过程对于应聘前端、后端开发以及其他技术岗位都非常重要。以下是对这两个过程的简明解释。


TCP 三次握手(建立连接)

三次握手是 TCP 协议中用于建立连接的过程,确保客户端和服务器都能互相通信。

  1. 第一次握手(客户端 → 服务器)

    客户端发送一个 SYN(同步)包给服务器,表示请求建立连接。此时,客户端进入 SYN_SENT 状态。

  2. 第二次握手(服务器 → 客户端)

    服务器收到客户端的 SYN 包后,回应一个 SYN-ACK(同步-确认)包,表示同意建立连接。服务器进入 SYN_RECV 状态。

  3. 第三次握手(客户端 → 服务器)

    客户端收到服务器的 SYN-ACK 包后,发送一个 ACK(确认)包给服务器,表示连接已建立。客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。

总结:三次握手的过程是:

  1. 客户端向服务器发送请求;

  2. 服务器确认并回应;

  3. 客户端确认服务器回应,建立连接。

为什么是三次握手?

  • 第一次握手:确认客户端可以发送请求;

  • 第二次握手:确认服务器可以接收请求并准备好;

  • 第三次握手:确认双方都可以发送和接收数据。


TCP 四次挥手(断开连接)

四次挥手是 TCP 协议中用于断开连接的过程,确保双方在关闭连接前都完成数据传输。

  1. 第一次挥手(客户端 → 服务器)

    客户端发送一个 FIN(结束)包给服务器,表示客户端的数据发送完毕,客户端进入 FIN_WAIT_1 状态。

  2. 第二次挥手(服务器 → 客户端)

    服务器收到客户端的 FIN 包后,回应一个 ACK(确认)包,表示同意关闭连接。服务器进入 CLOSE_WAIT 状态。此时,服务器还可能有数据传输给客户端。

  3. 第三次挥手(服务器 → 客户端)

    服务器发送一个 FIN 包给客户端,表示服务器端的数据也已经传输完毕,准备断开连接。服务器进入 LAST_ACK 状态。

  4. 第四次挥手(客户端 → 服务器)

    客户端收到服务器的 FIN 包后,发送一个 ACK(确认)包给服务器,确认关闭连接。客户端进入 TIME_WAIT 状态,等待一段时间后彻底关闭连接。服务器收到 ACK 后,连接完全断开。

总结:四次挥手的过程是:

  1. 客户端发送 FIN 包,表示要断开连接;

  2. 服务器回应 ACK,确认断开;

  3. 服务器发送 FIN 包,表示服务器的数据传输完毕;

  4. 客户端确认 ACK,断开连接。

为什么是四次挥手?

  • 第一次挥手:客户端告知服务器自己没有数据发送了;

  • 第二次挥手:服务器确认客户端没有数据要发送了;

  • 第三次挥手:服务器告知客户端自己也没有数据要发送了;

  • 第四次挥手:客户端确认断开连接。


简明例子:

三次握手: 假设我(客户端)要去张三家取东西:

  1. 我发短信:"张三在家吗?"

  2. 张三回复:"我在家。"

  3. 我发短信:"我准备去取东西,等我。" 张三确认收到信息后,才开始等我。

四次挥手:

  1. 我告诉张三:"我已经取完东西了,任务完成了。"

  2. 张三回复:"知道了,但我还没完成所有的事,继续忙。"

  3. 张三完成任务后,告诉我:"我已经完成了,可以断开了。"

  4. 我确认收到,然后双方断开连接。


注意事项:

  1. 三次握手与四次挥手的区别

    • 三次握手用于建立连接,确保双方都能发送和接收消息;

    • 四次挥手用于断开连接,确保双方的数据传输完成并安全关闭连接。

  2. 三次握手为什么是三次?

    三次握手确保客户端和服务器都能收发消息,并且确认连接建立成功。

  3. 四次挥手为什么是四次?

    四次挥手确保双方在数据传输完成后才能断开连接。由于 TCP 是全双工的(数据可以同时在两个方向流动),需要两边都先确认没有数据要传输了,才安全断开。


总结

  • 三次握手:连接建立过程,需要确保双方都准备好进行数据交换。

  • 四次挥手:连接断开过程,确保双方都完成数据传输后再安全关闭连接。

在面试时,讲解这两个过程时,重点掌握其原理和原因,尽量避免深入底层协议细节,确保你能够清晰、简洁地表达出过程和原因。

相关推荐
AirMan1 小时前
深入揭秘 ConcurrentHashMap:JDK7 到 JDK8 并发优化的演进之路
后端·面试
程序员江鸟6 小时前
Java面试实战系列【JVM篇】- JVM内存结构与运行时数据区详解(私有区域)
java·jvm·面试
小灰灰搞电子7 小时前
嵌入式(ARM方向)面试常见问题及解答
arm开发·面试
xiaoye37087 小时前
有哪些工具可以帮助监测和分析JVM的内存使用情况?
jvm·面试
大舔牛8 小时前
网站性能优化:小白友好版详解
前端·面试
洛卡卡了8 小时前
人工顶不住,机审又烧钱,我只能硬着头皮上
后端·面试·架构
weixin_456588158 小时前
【java面试day19】mysql-优化
java·mysql·面试
lovepenny9 小时前
告别重复加载:掌握浏览器强缓存与协商缓存策略
前端·面试
大舔牛9 小时前
浏览器访问网页全流程:小白友好版详解
前端·面试
诗和远方14939562327349 小时前
iOS 中的事件响应链详解
面试