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

TCP连接四次挥手的过程,为什么是四次?

在 TCP 协议中,四次挥手是终止连接的过程,用于确保双方都能够正常、安全地关闭连接并释放资源。四次挥手的过程保证了数据的完整传输,防止数据丢失或误处理。

TCP 四次挥手的过程:

  1. 第一次挥手(FIN) - 主动关闭方请求关闭连接
    • 在四次挥手的开始,主动关闭方(通常是客户端)发送一个 FIN(Finish)报文段,表示它已经没有数据要发送了,希望关闭连接。
    • 原因:主动方发送 FIN 是为了通知对方,自己已经完成了数据传输,准备关闭连接。此时,客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手(ACK) - 被动关闭方确认关闭请求
    • 接收到 FIN 报文段的 被动关闭方(通常是服务器)会回复一个 ACK(确认)报文段,确认收到关闭请求。此时,服务器会进入 CLOSE_WAIT 状态,表示它已经准备好关闭连接,但还可能需要处理剩余的数据。
    • 原因:ACK 报文段确认了主动方的关闭请求,但是连接尚未完全断开,服务器可能还有数据要发送。
  3. 第三次挥手(FIN) - 被动关闭方请求关闭连接
    • 在处理完剩余数据后,被动关闭方(服务器)发送一个 FIN 报文段,表示服务器也没有数据要发送了,请求关闭连接。
    • 原因:被动方完成数据传输后,发送 FIN 请求关闭连接,表明它已经没有数据要发送,可以关闭连接。
  4. 第四次挥手(ACK) - 主动关闭方确认关闭
    • 主动关闭方(客户端)收到被动方的 FIN 请求后,发送一个 ACK 报文段确认关闭请求。此时,客户端进入 TIME_WAIT 状态,连接关闭正式完成。
    • 原因:客户端确认收到被动方的 FIN 请求,并告知对方连接关闭完成。此时,客户端处于等待状态,稍后会彻底释放连接资源。

TIME-WAIT 状态和 2MSL 等待期的作用:

在第四次挥手的过程中,客户端进入 TIME-WAIT 状态,并等待 2MSL(Maximum Segment Lifetime)时间。这个状态和时间段对于可靠性和连接的正确终止至关重要。

1. TIME-WAIT 状态的作用
  • 确保最后的 ACK 被正确接收:当客户端发送最后的 ACK 确认报文段后,必须保证被动方能够收到这个确认。由于网络中可能存在丢包或者延迟,客户端需要保留连接状态并继续监听网络,确保最后的 ACK 能够到达被动方。如果被动方没有收到 ACK,它会重新发送 FIN 请求,客户端则需要重新确认。

  • 防止旧的重复报文影响新连接:由于网络中可能存在延迟或者数据包会被缓存,如果相同的端口和 IP 地址再次建立连接,旧的重复数据包可能会干扰新的连接。TIME-WAIT 状态确保所有的旧数据包在 2MSL 时间内都已经过期,不会影响新的连接。

  • 为什么TIME-WAIT是2MSL:

    • 1MSL确保主动方的ACK可到达被动方;
    • 另1MSL确保被动方重传的FIN可到达主动方(极端情况下,FIN可能在1MSL内到达)。
2. 2MSL(最大报文生命周期)的作用
  • MSL(Maximum Segment Lifetime) 是一个报文在网络中可能存在的最大时间。2MSL 就是指在网络中一个数据包经过的最大时间周期的两倍。TCP 在连接关闭后进入 TIME-WAIT 状态并保持 2MSL 时间,确保:- 所有的数据包(即使是丢失后重传的)都能在 2MSL 时间内到达并被处理。
    • 防止在新的连接中,旧的重复数据包被错误地接受和处理,造成混乱。

这个 2MSL 的时间通常是 4 分钟(具体取决于操作系统的配置和网络环境),确保了在一个连接关闭后,所有延迟的报文都能清理完毕。

3.为什么需要四次握手

TCP是全双工通信,可以双向传输数据。任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。 当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后才会完全关闭 TCP 连接。因此两次挥手可以释放一端到另一端的TCP连接,完全释放连接一共需要四次挥手。

只有通过四次挥手,才可以确保双方都能接收到对方的最后一个数据段的确认,主动关闭方在发送完最后一个ACK后进入TIME-WAIT 状态,这是为了确保被动关闭方接收到最终的ACK ,如果被动关闭方没有接收到,它可以重发FIN 报文,主动关闭方可以再次发送ACK 。

而如果使用三次挥手,被动关闭方可能在发送最后一个数据段后立即关闭连接,而主动关闭方可能还没有接收到这个数据段的确认。

http://www.dtcms.com/a/122732.html

相关文章:

  • STM32单片机入门学习——第30节: [9-6] FlyMcu串口下载STLINK Utility
  • Rust入门之迭代器(Iterators)
  • 实战篇-梳理时钟树
  • QT学习笔记
  • 使用 DeepSeek API 实现新闻文章地理位置检测与地图可视化
  • 华为手机或平板与电脑实现文件共享
  • 电脑清洁常用工具
  • MySQL:锁
  • 秒杀业务的实现过程
  • Java 开发中主流安全框架的详细对比,涵盖 认证、授权、加密、安全策略 等核心功能,帮助开发者根据需求选择合适的方案
  • IP查询能够帮助企业进行数字化转型
  • 医学分割新标杆!双路径PGM-UNet:CNN+Mamba实现病灶毫厘级捕捉
  • UniApp 页面布局自定义头部导航
  • Seq2Seq - CrossEntropyLoss细节讨论
  • 深入理解 Vuex:核心概念、API 详解与最佳实践
  • 网络安全应急响应-启动项和任务计划排查
  • 2. git init
  • 探索生成式AI在游戏开发中的应用——3D角色生成式 AI 实现
  • 华为数字芯片机考2025合集3已校正
  • 今天你学C++了吗?——set
  • 深入浅出SPI通信协议与STM32实战应用(W25Q128驱动)(实战部分)
  • 思维森林理论(Cognitive Forest Theory)重构医疗信息系统集群路径探析
  • VectorBT量化入门系列:第三章 VectorBT策略回测基础
  • 【AI News | 20250409】每日AI进展
  • Pyppeteer实战:基于Python的无头浏览器控制新选择
  • React十案例下
  • Java基础第19天-MySQL数据库
  • IT+开发+业务一体化:AI驱动的ITSM解决方案Jira Service Management价值分析(文末免费获取报告)
  • 云轴科技ZStackCTO王为:AI Infra平台具备解决私有化AI全栈难题能力
  • 超便捷超实用的文档处理工具,PDF排序,功能强大,应用广泛,无需下载,在线使用,简单易用快捷!