
文章图片
TCP(Transmission Control Protocol , 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议 。
它不仅确保数据的完整性 , 还设计了一套完整的连接管理机制:
? 三次握手(建立连接)
? 四次挥手(断开连接)
【详解TCP四次挥手过程,为什么挥手需要四次?】其中 , 四次挥手是TCP连接断开时的关键步骤 , 确保双方都能正确释放源 , 避免数据丢失或连接异常终止 。
四次挥手过程TCP是全双工通信 , 意味着数据可以同时在两个方向传输 。 因此 , 连接的断开不仅需要客户端通知服务器自己不再发送数据 , 还需要服务器通知客户端自己也不再发送数据 。 这就导致了四次挥手的过程 , 而不是简单的三次握手 。
第一次挥手
客户端发送FIN(终止请求):客户端发送一个FIN(Finish)报文 , 表示自己不再发送数据 , 进入FIN-WAIT-1状态 。 此时 , 客户端仍然可以接收数据 , 但不会再主动发送数据 。
第二次挥手
服务器回复ACK(确认):服务器收到FIN后 , 发送一个ACK(Acknowledgment)报文 , 确认收到客户端的终止请求 , 进入CLOSE-WAIT状态 。 此时 , 服务器仍然可以继续发送数据 。
第三次挥手
服务器发送FIN(终止请求):服务器在完成数据传输后 , 发送FIN报文 , 表示自己也不再发送数据 , 进入LAST-ACK状态 。
第四次挥手
客户端回复ACK(确认):客户端收到服务器的FIN后 , 发送ACK报文 , 确认收到服务器的终止请求 , 进入TIME-WAIT状态 。 此时 , 客户端会等待一段时间(通常是2MSL , 即最大报文生存时间的两倍) , 确保服务器收到ACK后才彻底关闭连接 。
其中TIME-WAIT的作用:
TIME-WAIT状态的存在是为了确保最后一个ACK能够被服务器正确接收 , 防止旧的TCP报文影响新的连接 。 通常 , TIME-WAIT状态会持续2MSL(最大报文生存时间) , 以确保所有可能的延迟数据包都被清除 。
TIME-WAIT还可以防止已失效的连接请求报文段影响新的连接 。 如果客户端在发送完最后一个ACK后立即释放连接 , 那么可能会导致服务器的FIN报文丢失 , 进而影响新的连接建立 。
下图为完整流程的简图:
为什么握手是三次 , 挥手却要四次?简单的来讲:基于TCP稳定的通信 , 在连接断开时不仅要终止数据的发送 , 还要确保对方的数据已经完全接收 。 同时TCP是全双工通信 , 所以每个通道都需要单独关闭 , 这导致请求回复的机制需要重复两遍 , 也就是4次是这个确认机制的最小步骤 。
总的来讲 , 三次握手是建立可靠连接 , 而四次挥手则是为了保证数据传输的完整性 。 但是在实际的应用中如高并发服务器环境中:
TIME-WAIT状态可能会导致大量端口占用 , 影响服务器性能 。 为了解决这个问题 , 许多系统会采用TCP连接复用或缩短TIME-WAIT时间的方式来优化连接释放过程 。
某些系统在Socket选项中也提供了SO_REUSEADDR选项 , 允许新的连接在TIME-WAIT状态下复用旧的端口 , 从而提高服务器的并发能力 。
推荐阅读
- 超级干货!开机电路原理与功能详解
- EPEL 仓库详解:Linux 系统上的安装与使用指南
- 凭一国之力造出光刻机,意味着什么?或将成第四次工业革命引领者
- 中国凭一己之力造出光刻机,会引领第四次工业革命吗?
- 苹果手机震动设置详解:从基础到个性化,全攻略来袭
- 三星S24 Ultra是否值得入手?优缺点详解,看完再决定!
- 石英晶体谐振器(晶振)——萨科微(Slkor)SL252040M15P详解
- 中端豪门或是全能选手,详解骁龙7 Gen3和骁龙7+ Gen3
- JDK 24新特性详解:性能优化与语言增强
- 小米、荣耀、蓝绿厂影像表现具体如何?近期新机镜头传感器超详解
