怎样理解三次握手和四次挥手?

1. 三次握手

三次握手的大致流程图如下所示

(1)当客户端想与服务端建立连接时,客户端会先发送连接请求到服务端,该请求需要服务器接收并确认,这是一次握手;

(2)当服务端收到了客户端发来的请求后,服务端会给客户端一个响应,告诉客户端我接受到了你的连接请求,这是第二次握手;

(3)客户端收到了服务端发来的确认消息之后,会再次向服务端发送确认信息,然后链接就建立成功,这是第三次握手。

2. 为什么是三次握手,两次?四次不行吗?

只进行两次握手是不行的,因为很有可能客户端只发送一次数据,或者发着玩,恶意攻击等。如果是这样,当客户端接收到请求时候,在返回响应时连接就已经建立了,此时连接已经建立,但客户端却又不发送信息,就会造成连接资源的浪费;

四次握手其实也是可以的,但是三次握手就已经能确认服务端与客户端发送与接收信息的能力,不需要再进行第四次握手,多一次握手也会造成资源的浪费。

3. 四次挥手

当我们想要关闭客户端与服务端的连接时,需要进行四次挥手,大致流程如下图所示

(1)客户端想要断开与服务端的链接,先向服务端发送断连请求;

(2)服务端收到了客户端发来的请求,然后会给客户端一个响应,表示已经接收到断连请求,但此时连接还未中断;

(3)服务端在接收到断连请求后,会将连接通道内的数据尽快处理完毕,当处理完成数据之后,服务端会再次向客户端发送请求,表示数据已经处理完成,可以断开连接;

(4)客户端收到了服务端发送的确认消息后,会再次发送确认消息,然后连接就会断开;

4. 为什么不能三次挥手?

有些面试官可能会问到,我们能不能将第二次与第三次客户端的发送合并在一起,这样就能减少一次发送?

其实是不行的,因为第二次服务端向客户端发送确认收到断开连接的时候,它还只是处于一个待关闭的状态,此时服务端可能还有一些资源没有释放,还有一些请求未处理完,实际上第二次挥手与第三次挥手它们中间其实可能会有很高的延迟,30s甚至是1~3分钟,如果我们将第二步与第三步合并发送,那么在此期间客户端需要等但很长时间,客户端一直未收到服务端发送的响应,很有可能超时,认为发送失败,它就会选择再重新发送一次断连请求,甚至发送好几次断连请求,就会造成重复操作,造成资源的浪费。而且第二次发送能保证客户端在发送请求后短时间内就可以收到服务端发送的信息,在保证两端收发信息的能力。

相关推荐
云飞云共享云桌面4 小时前
传统工作站 vs 云飞云共享云桌面:制造业设计云桌面选型深度对比
运维·服务器·前端·网络·3d·架构·制造
huangdong_4 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
UXbot4 小时前
如何选择适合公司项目的UI设计工具?企业选型指南
前端·低代码·ui·团队开发·原型模式·设计规范·web app
記億揺晃着的那天4 小时前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录9175 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
llz_1125 小时前
web-第四次课后作业
前端·spring boot·web
JAVA面经实录9175 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
武清伯MVP6 小时前
前端跨域方案大合集
前端·javascript
一杯奶茶¥6 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码6 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛