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

1. 三次握手

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

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

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

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

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

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

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

3. 四次挥手

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

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

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

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

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

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

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

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

相关推荐
SL_staff3 分钟前
中小离散制造如何用工艺路线模板解决‘人走流程丢’——JVS-APS 实践解析
java·设计模式·全栈
林太白4 分钟前
What did Trea work help me with in this optimization process
前端·后端
一拳不是超人7 分钟前
被 Tauri「体积小」种草后,我拿它做了个本地 AI 桌面工具,然后踩了这些坑
前端·架构
我命由我1234512 分钟前
Android 开发问题:使用 AndroidTreeView 时,自定义视图无法撑满父容器
android·java·java-ee·kotlin·android studio·android-studio·android runtime
深念Y13 分钟前
无头电视盒子改服务器调优记录
linux·运维·服务器·串口·嵌入式·电视盒子·海思
hyf32663327 分钟前
高收益玩法:站群泛程序结合本地服务引流变现全流程
运维·服务器·前端·搜索引擎·蜘蛛池
冷雨夜中漫步32 分钟前
DeepSeek Harness:一切皆插件的 AI Agent 框架深度解析
java·人工智能·ai·开源·github
IT_陈寒32 分钟前
Vite热更新失效?八成是这个配置在搞鬼
前端·人工智能·后端
Mortalbreeze33 分钟前
深入理解TCP协议(一):TCP报文格式详解
linux·服务器·网络·tcp/ip
三言老师44 分钟前
K8s 集群 LocalPV 静态 PV 资源手动创建实操
linux·运维·服务器·kubernetes