计算机网络 - TCP为什么不是两次/四次握手、三次挥手?
为什么不是两次握手?
因为TCP是全双工通信,需要保证服务端和客服端都能发送和接收数据。两次握手无法保证服务端和客户端的接发功能都是ok的。
为什么不是四次握手?
四次握手会降低连接的速度和效率,因为三次足够确保双方的接发功能是否完好。
为什么不是三次挥手?
中间的两个部分为什么不能合成一个步骤/一起发送?
简单来说,就是因为客户端在第1次挥手的时候,服务端可能还在发送数据,所以第2次挥手和第3次挥手不能合并。ACK(表示响应)和FIN(表示关闭链接)的分开发送导致挥手比握手多了一次。
详细过程和解释见下:
四次挥手(具体带标志位)过程:
1. 客户端执行主动关闭,发送FIN的包,表示客户端的数据发送完毕。
2. 服务端这个时候是被动关闭的,发送确认ACK包。
3. 服务端给客户端发送FIN,告诉客户端我也关闭。
4. 客户端确认服务端的ACK包。
首先我们要知道,TCP是全双工通信,TCP在断开连接时,需要服务端和客服端都确定对方将不再发送数据才行。在这四次挥手过程中我们可以看到,第一次挥手客户端发送FIN包,表示已发送数据完毕,但这时服务端可能还有数据没有发送完,所以处于一个被动关闭的状态,所以需要先发送给客户端一个ACK包去进行相应,然后再等待自己的数据发送完成后才能向客户端发送一个FIN包,来表示自己的数据也已发送完成。所以中间这两个过程是无法合并成一个的,中间必须分两次来发送ACK和FIN,这样才能保证服务端的数据完全发送到了客户端手中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2020-03-26 寒假Day60:详解-超简单的队列与栈