当前位置: 首页 > article >正文

TCP断开通信前的四次挥手(为啥不是三次?)

1.四次握手的过程

  • 客户端A发送 FIN(终止连接请求)

    • A:我要断开连接了(FIN)。
    • A进入FIN_WAIT_1状态,表示请求断开,等待对方确认。
  • 服务器B回复 ACK(确认断开请求,但还未准备好关闭)

    • B:我收到了你的断开请求,但我还有数据要处理,你先等一下(ACK)。
    • B进入CLOSE_WAIT状态,A进入FIN_WAIT_2状态,A此时不会再发送数据,但会继续接收。
  • 服务器B处理完数据后,发送 FIN(关闭请求)

    • B:我也准备好断开了,我们可以关闭连接(FIN)。
    • B进入LAST_ACK状态,等待客户端的最终确认。
  • 客户端A回复 ACK(确认断开完成)

    • A:好的,连接断开(ACK),正式关闭连接。
    • A进入TIME_WAIT状态,等待一段时间确保B已收到ACK,之后真正关闭。B收到ACK后直接关闭连接。

2.为啥不是三次(确保数据完整交付)

假设三次挥手的流程如下:

  1. A 发送 FIN,请求关闭连接。
  2. B 立即发送 FIN+ACK,表示确认并关闭连接。
  3. A 直接关闭连接。

问题:

  • 由于B可能仍有未完成的数据需要发送,A的过早关闭会导致数据丢失。
  • B应该在确认A的请求(ACK)后,先完成自己要发送的数据,再主动请求关闭(发送 FIN)。
  • 三次挥手无法区分“确认收到断开请求 和 我也准备断开””这两个不同的操作,因此需要额外的一次握手。

总结:TCP 需要四次挥手,而不能三次的原因是:

  1. TCP是全双工通信,双方的发送和接收是独立的,必须各自关闭。
  2. 确保数据的完整性,避免提前关闭连接导致数据丢失。
  3. 防止“半关闭”状态时误断开,导致连接数据未完整发送。

http://www.kler.cn/a/515392.html

相关文章:

  • 零售业革命:改变行业的顶级物联网用例
  • 计算机视觉——Intel RealSense D435的使用及python环境下的实现
  • 精选100+套HTML可视化大屏模板源码素材
  • 深入探索C#中Newtonsoft.Json库的高级进阶之路
  • ubuntu24 springboot jar设置宕机重启
  • 数据库索引(1)
  • H3C-防火墙IPSec配置案例(主模式)
  • 监控与调试:性能优化的利器 — ShardingSphere
  • JavaScript系列(40)--虚拟DOM实现详解
  • FPGA中场战事
  • Mac下安装ADB环境的三种方式
  • 光谱相机在智能冰箱的应用原理与优势
  • 【嵌入式开发】stm32 st-link 烧录
  • 详细介绍:云原生技术细节(关键组成部分、优势和挑战、常用云原生工具)
  • Web 音视频(三)在浏览器中创建视频
  • 4K大视频浏览器无法正常播放解决方案
  • 【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报
  • #2 js中number类型计算精度问题解决
  • Docker Compose创建镜像服务
  • Android Studio常用操作备忘录
  • 设计模式详解
  • python 关闭 sagemaker 日志美化
  • Android SystemUI——最近任务应用列表(十七)
  • Postgresql源码(140)理解PG的编译流程(make、Makefile、Makefile.global.in)
  • 21. C语言 `typedef`:类型重命名
  • python中如何将文件写出