面试常考--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 是全双工的(数据可以同时在两个方向流动),需要两边都先确认没有数据要传输了,才安全断开。


总结

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

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

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

相关推荐
海底火旺1 分钟前
JS 中 this 的疑难杂症
前端·javascript·面试
前端小巷子13 分钟前
JS严格模式:更安全、更高效的代码实践
前端·javascript·面试
前端小巷子16 分钟前
JS函数防抖和节流:提升性能的关键技术
前端·javascript·面试
天涯学馆21 分钟前
Webpack 配置详解:从入门到精通的全面指南
前端·javascript·面试
天涯学馆24 分钟前
解锁大前端性能优化的终极秘籍,让你的页面飞起来!
前端·javascript·面试
我是哪吒27 分钟前
分布式微服务系统架构第142集:全栈开发
后端·面试·github
星辰离彬32 分钟前
【线上故障排查】系统缓存雪崩故障排查与解决全流程解析
java·spring boot·后端·程序人生·缓存·面试
程序员勋勋1 小时前
15:00面试,15:06就出来了,问的问题有点变态。。。
软件测试·面试·职场和发展
wxiaohe12 小时前
【技能篇】RabbitMQ消息中间件面试专题
分布式·面试·rabbitmq
Swift社区8 小时前
面试高频图论题『墙与门』:Swift BFS 解法全流程拆解
面试·swift·宽度优先