TCP连接在四次挥手时,需要TIME_WAIT阶段的原因
如图,客户端在收到服务端发来的FIN报文后,会进入TIME_WAIT阶段,该阶段最大持续时间为2MSL
(MSL
即报文段最大生存时间,超出该时间,TCP报文就会被丢弃)。设置TIME_WAIT阶段的主要原因有两点:
-
为了使客户端收到第四次挥手的ACK,从而正确关闭连接
假设第四次挥手时,客户端发送给服务端的ACK报文丢失。极端情况下,经过
1MSL
后,服务端发现未收到预期的ACK报文,那么就会触发重传机制,重新向客户端发送FIN报文,此次的FIN报文最多再经过1MSL
后,被客户端接收(这时客户端会重置TIME_WAIT时间为2MSL
,防止重传的ACK报文再次丢失),从而客户端再次传送ACK报文,使得服务端正确关闭连接。 -
为了使旧TCP连接的数据包不干扰新的连接
假设没有TIME_WAIT阶段,客户端发送完ACK报文后直接关闭连接,那么可能会出现ACK报文丢失,服务端重传FIN报文的情况,如果刚好客户端和服务端以相同的四元组建立了新的连接,且重传FIN报文序列号恰好在客户端的滑动窗口内,那么客户端就会接收这个FIN报文,造成数据错乱等严重问题。因此要有TIME_WAIT阶段等待
2MSL
时长,使得本次连接的所有数据包都自然消失。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫